将类添加到Django label_tag()输出

ash*_*her 29 python forms django newforms

我需要一些方法来为表单字段的label_tag()方法的输出添加一个类属性.

我看到有能力传入一个attrs字典,我已经在shell中测试了它,我可以做类似的事情:

for field in form:
    print field.label_tag(attrs{'class':'Foo'})
Run Code Online (Sandbox Code Playgroud)

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

我的表单定义中有一种方法来定义要在标签中显示的类吗?

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

self.fields['some_field'].widget.attrs['class'] = 'Foo'
Run Code Online (Sandbox Code Playgroud)

我只需要输出它的类.

use*_*515 19

技术1

我对另一个答案的断言提出异议,即过滤器会"不那么优雅".正如你所看到的,它确实非常优雅.

@register.filter(is_safe=True)
def label_with_classes(value, arg):

    return value.label_tag(attrs={'class': arg})
Run Code Online (Sandbox Code Playgroud)

在模板中使用它同样优雅:

{{ form.my_field|label_with_classes:"class1 class2"}}
Run Code Online (Sandbox Code Playgroud)

技术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)    
Run Code Online (Sandbox Code Playgroud)

  • 技术1给了我"AttributeError:'SafeText'对象没有属性'label_tag'"与Django 1.6.你能检查一下吗? (4认同)

小智 11

如何将CSS类添加到forms.py中的表单字段,如:

class MyForm(forms.Form):
    title = forms.CharField(widget=forms.TextInput(attrs={'class': 'foo'}))
Run Code Online (Sandbox Code Playgroud)

然后我在模板中执行以下操作:

<label for="id_{{form.title.name}}" class="bar">
    {{ form.title }}
</label>
Run Code Online (Sandbox Code Playgroud)

当然,可以很容易地修改它以在模板中的for循环标记内工作.

  • 您可以使用{{form.title.auto_id}}而不是假设"id_"前缀. (9认同)

muh*_*huk 8

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

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

{{ form.as_table_with_label_classes }}
Run Code Online (Sandbox Code Playgroud)

但是我想问一下; 你真的需要一个标签上的课吗?我的意思是HTML设计明智.在那里添加一个课是绝对必要的吗?无法用一些CSS解决它:

encapsulating_selector label {
    some-attr: some-value;
}
Run Code Online (Sandbox Code Playgroud)

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

  • "你真的需要在标签上加上一个类吗?",如果你使用像bootstrap或foundation这样的框架,那就是. (37认同)