Django表单-更改小部件属性

时间:2018-08-21 17:10:27

标签: django python-3.x django-forms django-2.1

我想为django class中的<option/>标签定义ChoiceField属性,我该怎么做?

我试图在 forms.py 中设置小部件类并指定类似的属性:

field = forms.ChoiceField(choices=[(1, 'foo'), (2, 'bar')], widget=forms.Select(attrs={'class': 'form-control'}))

然后像这样在我的template.html内部进行渲染:

{{ form.field }}

输出为:

<select name="field" class="form-control" id="id_field">
   <option value="1">foo</option>
   <option value="2">bar</option>
</select>

我想要的是这个东西

<select name="field" class="form-control" id="id_fields">
   <option class="form-control" value="1">foo</option>
   <option class="form-control" value="2">bar</option>
</select>

最简单的方法是什么?

2 个答案:

答案 0 :(得分:1)

最简单的方法是对Select小部件进行子类化并将option_inherits_attrs设置为True:

class CustomSelect(forms.Select):
    option_inherits_attrs = True

然后在创建表单时使用自定义窗口小部件:

class TestForm(forms.Form):
    items = forms.ChoiceField(
        choices=[(1, 'foo'), (2, 'bar')],
        widget=CustomSelect(
            attrs={'class': 'form-control'}
        )

答案 1 :(得分:0)

您可以创建 Template Tag 并编写自定义模板字段。如果要重用属性,这是最佳选择。

  

应用程序应包含一个templatetags目录,与 models.py views.py 等级别相同。如果尚不存在,请创建一个-不要忘记 __ init __。py 文件,以确保该目录被视为Python软件包。


在您应用的文件夹中创建此结构


filters.py

from django import template
register = template.Library()

@register.filter(name='addclass')
def addclass(value, arg):
    return value.as_widget(attrs={'class': arg})


{% load filters %}

之前,将{% block content %}添加到您的 template.html 中。


这就是您应用过滤器的方式:

{{form.field|addclass:'form-control'}}


现在您应该忘记在 forms.py

中将类添加到HTML元素中了

如果您不喜欢模板标记的方式,或者只是在寻找低成本的临时解决方案,则应查看此链接。

Another way of solving the same problem