1

我想为djangoclass中的标签定义一个属性,我该怎么做?<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>

最简单的方法是什么?

4

2 回答 2

2

实现这一点的最简单方法是将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'}
        )
于 2018-10-20T06:10:19.047 回答
0

您可以创建模板标签并编写自定义模板字段。如果您想重用属性,这是最好的选择。

该应用程序应该包含一个 templatetags 目录,与models.pyviews.py等处于同一级别。如果这不存在,请创建它 - 不要忘记__init__.py文件以确保该目录被视为一个 Python 包。


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


内部过滤器.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 %}到您的template.html之前{% block content %}


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

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


现在您应该忘记在forms.py中向 HTML 元素添加类


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

解决相同问题的另一种方法

于 2018-08-23T14:24:58.733 回答