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.