Defina widgets de formulário Django individualmente

Em um projeto recente, descobri a necessidade de fornecer diferentes classes CSS para widgets de formulário específicos (por exemplo, PasswordInput ).

Minha solução é um decorador de classe que muda desses widgets de attr propriedades:

def _widget_add_classes(widget, classes):
initial_classes
= widget.attrs.get('class', '')
widget
.attrs['class'] = '%s %s' % (initial_classes, classes) if initial_classes else classes

def style_widgets(widget_classes):
def wrapper(form_cls):
for field in form_cls.base_fields.itervalues():
widget_cls
= field.widget.__class__.__name__
if widget_cls in widget_classes:
_widget_add_classes
(field.widget, widget_classes[widget_cls])
return form_cls
return wrapper

Exemplo de uso:

@style_widgets({'PasswordInput': 'smallinput'})
class EmailRegistrationForm(forms.Form):
email
= forms.EmailField(label=_('Email address'))
password1
= forms.CharField(
label
=_('Password'),
widget
=forms.PasswordInput)
password2
= forms.CharField(
label
=_('Password confirmation'),
widget
=forms.PasswordInput)

Usei a mesma técnica para definir o estilo de campos individuais por seus nomes. Claro, qualquer outro identificador pode ser usado: label / max_length / qualquer que seja.