【问题标题】:Django Forms - Change widget attributesDjango Forms - 更改小部件属性
【发布时间】:2018-10-20 14:10:19
【问题描述】:

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

我尝试设置小部件类,并在 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>

最简单的方法是什么?

【问题讨论】:

  • 显然不是很有帮助,但最后一分钟你可以使用 JS ;)
  • @J.C.Rocamonde 我知道,但我想知道在 Django 中是否有办法做到这一点......

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


【解决方案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'}
        )

【讨论】:

  • 哇,就这么简单!谢谢!
【解决方案2】:

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

应用程序应该包含一个 templatetags 目录,与 models.pyviews.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})


在您的 template.html 中添加 {% load filters %},在 {% block content %}

之前


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

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


现在你应该忘记在 forms.py

中为 HTML 元素添加类了

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

Another way of solving the same problem

【讨论】:

  • 我可以使用模板标签方法,但它仍然不会将class 属性应用于子&lt;option&gt; 元素,仅应用于父&lt;select&gt;,这与指定相同小部件的属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2015-04-02
  • 2019-01-21
相关资源
最近更新 更多