Django Widget Tweaks

1.5.1 · active · verified Sat Apr 11

Django Widget Tweaks is a Python library that allows developers to customize the rendering of Django form fields directly within templates using template tags and filters, rather than modifying Python-level form definitions. This enables front-end developers to easily add CSS classes and HTML attributes. It is actively maintained by Jazzband, with version 1.5.1 supporting Django 5.0 and released annually or more frequently.

Warnings

Install

Imports

Quickstart

After installing, add 'widget_tweaks' to your Django project's `INSTALLED_APPS` in `settings.py`. Then, in your Django templates, load the `widget_tweaks` library using `{% load widget_tweaks %}`. You can then use the `render_field` tag or various filters (like `add_class`) to customize form fields, adding HTML attributes and CSS classes directly in the template. This example demonstrates using `render_field` to apply Bootstrap classes and attributes.

import os

# settings.py snippet
INSTALLED_APPS = [
    # ... other apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'widget_tweaks', # Add this line
]

# forms.py example
from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=100, help_text='Your full name')
    email = forms.EmailField(help_text='A valid email address')
    message = forms.CharField(widget=forms.Textarea, help_text='Your message')

# my_template.html example
# {% load widget_tweaks %}
#
# <form method="post">
#     {% csrf_token %}
#     <div class="form-group">
#         <label for="{{ form.name.id_for_label }}">Name:</label>
#         {% render_field form.name class="form-control" placeholder="Your name" %}
#         {% if form.name.errors %}
#             <div class="invalid-feedback d-block">{% for error in form.name.errors %}{{ error }}{% endfor %}</div>
#         {% endif %}
#     </div>
#     <div class="form-group">
#         <label for="{{ form.email.id_for_label }}">Email:</label>
#         {% render_field form.email type="email" class="form-control" %}
#         {% if form.email.errors %}
#             <div class="invalid-feedback d-block">{% for error in form.email.errors %}{{ error }}{% endfor %}</div>
#         {% endif %}
#     </div>
#     <div class="form-group">
#         <label for="{{ form.message.id_for_label }}">Message:</label>
#         {% render_field form.message class="form-control" rows="5" %}
#         {% if form.message.errors %}
#             <div class="invalid-feedback d-block">{% for error in form.message.errors %}{{ error }}{% endfor %}</div>
#         {% endif %}
#     </div>
#     <button type="submit" class="btn btn-primary">Submit</button>
# </form>

view raw JSON →