Техника 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)