2015-07-28 2 views
1

Так я строю Django формы с помощью начальной загрузки, и я знаю, что я могу добавить атрибуты (например, класс) свою форму с помощью:Как добавить атрибуты ко всем экземплярам виджета формы django?

username = forms.CharField(max_length=24, widget=forms.TextInput(attrs={'class':'form-control', 'placeholder': 'Your desired username.'})) 

Но я не могу найти способ применить атрибут класса для ALL TextInput (или любой другой класс виджетов). This не помог мне, поскольку он выглядит так, что он позволяет вам устанавливать только таблицы стилей, а не только атрибуты.

Я не хочу нарушать DRY, так как я могу применить определенный атрибут ко всем экземплярам TextInput (или другого виджета)?

ответ

1

Просто создать свой собственный CharField, который реализует свой собственный метод widget_attrs:

Оригинал:

class CharField(Field, forms.CharField): 
    widget = TextInput 

    def widget_attrs(self, widget): 
     attrs = super(CharField, self).widget_attrs(widget) 
     if attrs is None: 
      attrs = {} 
     if self.max_length is not None and isinstance(widget, (TextInput, HiddenInput)): 
      # The HTML attribute is maxlength, not max_length. 
      attrs.update({'maxlength': str(self.max_length)}) 
     return attrs 

Предложение:

class MyCharField(forms.CharField): 
    def widget_attrs(self, widget): 
     attrs = super(MyCharField, self).widget_attrs(widget) 
     attrs.update({'class':'form-control', 'placeholder': 'Your desired username.'}) 
     if self.max_length is not None and isinstance(widget, (forms.TextInput, forms.HiddenInput)): 
      # The HTML attribute is maxlength, not max_length. 
      attrs.update({'maxlength': str(self.max_length)}) 
     return attrs 

Вы могли бы также оставить вне if-условие для max_length, если вы всегда указываете один, но это для вас, чтобы попробовать.

+0

не существует никакого способа, чтобы отменить фактический класс CharField, или это просто плохая практика? – Jaxkr

+0

Вы имеете в виду CharField из 'django.forms'? Нет ... Это не ваш код. Но вы можете иметь файл formfields.py и импортировать его на свой файл forms.py и ничего не заметите. –

+0

ОК. Я помещаю этот класс в form.py? – Jaxkr

0

простой способ:

def set_attrs_for_fields(fields, default_attrs): 
    for field_name in fields: 
     field = fields[field_name] 
     try: 
      default_widget_attr = default_attrs[field.widget.__class__] 
      for k, v in default_widget_attr.items(): 
       field.widget.attrs[k] = v 
     except KeyError: 
      pass 

class MyForm(ProjFormBase): 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     set_attrs_for_fields(self.fields, self.get_default_attrs()) 

    def get_default_attrs(self): 
     return { 
       forms.TextInput: {'class': 'form-control'}, 
       forms.EmailInput: {'class': 'form-control'}, 
       forms.PasswordInput: {'class': 'form-control'}, 
      } 

В качестве альтернативы вы можете использовать проверку пользовательских фильтров здесь: Adding css classes to formfields in Django Templates

Смежные вопросы