Добавить класс в Django label_tag ()

Мне нужно каким-то образом добавить атрибут класса к выходу метода label_tag () для поля формы.

Я вижу, что есть возможность пройти в словаре attrs, и я протестировал его в оболочке, и я могу сделать что-то вроде:

  • Не удается пройти через форму с помощью
  • Изменения отслеживания формы Python / Django в некоторых полях, но не для других
  • В чем причина ошибочного запроса при отправке формы в приложение «Колба»?
  • Разбор массива имен форм HTML в Pyramid (Python)
  • mechanize._mechanize.FormNotFoundError: имя соответствия формы 'q'
  • Использование Mechanize (Python) для заполнения формы
  • for field in form: print field.label_tag(attrs{'class':'Foo'}) 

    Я увижу class = 'Foo' в моем выпуске, но я не вижу способа добавить аргумент attrs из шаблона – на самом деле, шаблоны специально разработаны против этого, нет?

    Есть ли способ в определении формы для определения класса, который будет отображаться в метке?

    В форме я могу сделать следующее, чтобы дать входные данные классу

     self.fields['some_field'].widget.attrs['class'] = 'Foo' 

    Мне просто нужно, чтобы он выдавал класс для этого.

  • Установка значения по умолчанию для поля в наборе форм в Django
  • Как бороться с «частичными» датами (2010-00-00) от MySQL в Django?
  • Как использовать Matplotlib в Django?
  • Необязательно получить параметры в django?
  • Django: запрос фильтра на основе пользовательской функции
  • Как TRUNCATE TABLE с помощью ORM Django?
  • 7 Solutions collect form web for “Добавить класс в Django label_tag ()”

    Решением является настраиваемый тег шаблона . Пользовательский фильтр также будет делать, хотя он может быть менее изящным. Но в обоих случаях вам нужно вернуться к оформлению пользовательской формы.

    Если это очень важная задача; Я бы создал Mixin, который позволяет мне аннотировать поля формы с классами ярлыков и поставляет формы методов рендеринга с использованием этих классов. Чтобы следующий код работал:

     {{ form.as_table_with_label_classes }} 

    Но я хотел бы спросить; Вам действительно нужен класс на ярлыке метки? Я имею в виду HTML-дизайн. Нужно ли добавлять туда класс? Не удалось ли его решить с помощью CSS:

     encapsulating_selector label { some-attr: some-value; } 

    Иногда я использую jQuery для таких случаев; он улучшит страницу, если она будет работать, но это не будет катастрофой, если она не будет . И сохраните источник HTML как можно более скудным.

    Техника 1

    Я беру вопрос с утверждением другого ответа о том, что фильтр будет «менее изящным». Как вы можете видеть, это очень элегантно.

     @register.filter(is_safe=True) def label_with_classes(value, arg): return value.label_tag(attrs={'class': arg}) 

    Использование этого в шаблоне столь же изящно:

     {{ form.my_field|label_with_classes:"class1 class2"}} 

    Техника 2

    В качестве альтернативы, один из наиболее интересных методов, я нашел: Добавление * в обязательные поля .

    Вы создаете декоратор для BoundField.label_tag, который будет соответствующим образом называть его attrs . Затем вы обезьяны патч BoundField, так что вызов BoundField.label_tag вызывает украшенную функцию.

     from django.forms.forms import BoundField def add_control_label(f): def control_label_tag(self, contents=None, attrs=None): if attrs is None: attrs = {} attrs['class'] = 'control-label' return f(self, contents, attrs) return control_label_tag BoundField.label_tag = add_control_label(BoundField.label_tag) 

    Как насчет добавления класса CSS в поле формы в forms.py, например:

     class MyForm(forms.Form): title = forms.CharField(widget=forms.TextInput(attrs={'class': 'foo'})) 

    то я просто делаю следующее в шаблоне:

     <label for="id_{{form.title.name}}" class="bar"> {{ form.title }} </label> 

    Конечно, это можно легко изменить, чтобы работать в теге for loop в шаблоне.

    Немного поздно, но столкнулся с подобной проблемой. Надеюсь, это поможет вам.

     class MyForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(MyForm, self).__init__(*args, **kwargs) self.fields['myfield1'].widget.attrs.update( {'class': 'form-control'}) self.fields['myfield2'].widget.attrs.update( {'class': 'form-control'}) def as_two_col_layout(self): return self._html_output( normal_row='<div class="form-group"><span class="col-xs-2">%(label)s</span> <div class="col-xs-10">%(field)s%(help_text)s</div></div>', error_row='%s', row_ender='</div>', help_text_html=' <span class="helptext">%s</span>', errors_on_separate_row=True) class Meta: model = mymodel fields = ['myfield1', 'myfield2'] 

    Я согласен с ответом номер один, css это можно сделать, но. Каков резонанс для этого в источнике джанго?

    В django.forms.forms.py есть это определение, которое показывает, что есть код для отображения attrs в методах:

     class BoundField(StrAndUnicode): # .... def label_tag(self, contents=None, attrs=None): contents = u'<label for="%s"%s>%s</label>' % (widget.id_for_label(id_), attrs, unicode(contents)) 

    но _html_output вызывает эту функцию без attrs:

     label = bf.label_tag(label) or '' 

    Поэтому кажется, что джанго частично подготовлен к этому, но на самом деле он его не использовал.

     @register.simple_tag def advanced_label_tag(field): """ Return form field label html marked to fill by `*` """ classes = [] attrs = {} contents = force_unicode(escape(field.label)) if field.field.required: classes.append(u'required') contents = force_unicode('%s <span>*</span>'%escape(field.label)) if classes: attrs['class'] = u' '.join(classes) return field.label_tag(contents=contents, attrs=attrs) 
     class CustomBoundField(BoundField): def label_tag(self, contents=None, attrs=None): if self.field.required: attrs = {'class': 'required'} return super(CustomBoundField, self).label_tag(contents, attrs) class ImportViewerForm(forms.Form): url = fields.URLField(widget=forms.TextInput(attrs={'class': 'vTextField'})) type = fields.ChoiceField(choices=[('o', 'Organisation'), ('p', 'Program')], widget=forms.RadioSelect, help_text='Url contain infornation about this type') source = fields.ChoiceField(choices=[('h', 'hodex'), ('s', 'studyfinder')], initial='h', widget=forms.RadioSelect) def __getitem__(self, name): "Returns a BoundField with the given name." try: field = self.fields[name] except KeyError: raise KeyError('Key %r not found in Form' % name) return CustomBoundField(self, field, name) class Media: css = {'all': [settings.STATIC_URL + 'admin/css/forms.css']} 

    Вам нужно изменить метод label_tag в классе BoundField и использовать его в форме

    Python - лучший язык программирования в мире.