将类添加到 Django label_tag() 输出

新手上路,请多包涵

我需要一些方法来将类属性添加到表单字段的 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'

我只需要让它也输出 <label /> 的类。

原文由 ashchristopher 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 435
2 个回答

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

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

 {{ form.as_table_with_label_classes }}

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

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

我有时会在这种情况下使用 jQuery ; _如果有效,它将改进页面,但如果无效,也不会是一场灾难_。并尽可能保持 HTML 源代码精简。

原文由 muhuk 发布,翻译遵循 CC BY-SA 4.0 许可协议

技术 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"}}

技巧二

或者,我发现的一种更有趣的技术是: Adding * to required fields

您为 BoundField.label_tag 创建一个装饰器,它将使用 适当 设置的属性调用它。然后你猴子修补 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)

原文由 user240515 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏