我需要一些方法来向class字段的label_tag()方法的输出中添加类属性。
我看到可以通过attrs词典,并且已经在shell中对其进行了测试,可以执行以下操作:
for field in form: print field.label_tag(attrs{'class':'Foo'})
我将在输出中看到class ='Foo',但是我看不到从模板添加attrs参数的方法-实际上,模板是专门针对此设计的,不是吗?
class ='Foo'
我的表单定义中是否可以定义要在标签中显示的类?
在表单中,我可以执行以下操作为输入提供一个类
self.fields['some_field'].widget.attrs['class'] = 'Foo'
我只需要让它也输出类。
一个自定义模板标签似乎是解决方案。自定义过滤器也可以,尽管它可能不太优雅。但是,在两种情况下,您都需要使用自定义表单呈现。
如果这是一项高度重要的任务;我将创建一个Mixin,它允许我用标签类注释表单字段,并使用这些类提供表单呈现方法。这样以下代码即可工作:
{{ form.as_table_with_label_classes }}
但是我想问一下;您是否真的需要在标签标签上上课?我的意思是HTML设计。绝对有必要在其中添加一个类吗?不能用一些CSS来解决它:
encapsulating_selector label { some-attr: some-value; }
技术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)