一尘不染

将类添加到Django label_tag()输出

django

我需要一些方法来向class字段的label_tag()方法的输出中添加类属性。

我看到可以通过attrs词典,并且已经在shell中对其进行了测试,可以执行以下操作:

for field in form:
    print field.label_tag(attrs{'class':'Foo'})

我将在输出中看到class ='Foo',但是我看不到从模板添加attrs参数的方法-实际上,模板是专门针对此设计的,不是吗?

我的表单定义中是否可以定义要在标签中显示的类?

在表单中,我可以执行以下操作为输入提供一个类

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

我只需要让它也输出类。


阅读 816

收藏
2020-03-30

共2个答案

一尘不染

一个自定义模板标签似乎是解决方案。自定义过滤器也可以,尽管它可能不太优雅。但是,在两种情况下,您都需要使用自定义表单呈现。

如果这是一项高度重要的任务;我将创建一个Mixin,它允许我用标签类注释表单字段,并使用这些类提供表单呈现方法。这样以下代码即可工作:

{{ form.as_table_with_label_classes }}

但是我想问一下;您是否真的需要在标签标签上上课?我的意思是HTML设计。绝对有必要在其中添加一个类吗?不能用一些CSS来解决它:

encapsulating_selector label {
    some-attr: some-value;
}
2020-03-30
一尘不染

技术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)   
2020-03-30