Django - 将CSS类添加到SplitDateTimeWidget?

时间:2011-07-19 19:15:55

标签: django forms

我使用了SplitDateTimeWidget来覆盖模型表单中的字段。 有没有办法将css类分配给由此创建的各个字段?

widgets = {
              'my_field': SplitDateTimeWidget(),
                }

任何建议表示赞赏。

我尝试过你的代码Brandon后:

如果我尝试不通过attrs我得到: 'NoneType'对象不可迭代

表示attrs_dict = dict(attrs)行。

如果我确实包括了attrs,我得到: 'tuple'对象没有属性'copy'

位于 init ,第147行的/usr/local/lib/python2.6/dist-packages/django/forms/widgets.py

2 个答案:

答案 0 :(得分:8)

是的,您可以传入attrs = {'class':'your_class'},但它会将该类应用于DateInput和TimeInput。

如果您需要为这两个字段添加不同的类,您可能需要扩展SplitDateTimeWidget,覆盖init。

class MySplitDateTimeWidget(SplitDateTimeWidget):
    def __init__(self, attrs=None, date_format=None, time_format=None):
        date_class = attrs.pop('date_class')
        time_class = attrs.pop('time_class')

        widgets = (DateInput(attrs={'class' : date_class}, format=date_format),
               TimeInput(attrs={'class' : time_class}, format=time_format))
        super(SplitDateTimeWidget, self).__init__(widgets, attrs)

#forms.py

class MyForm(forms.Form):
    test_field = forms.DateTimeField(widget=MySplitDateTimeWidget(attrs={'date_class' : 'foo', 'time_class' : 'bar'}))

我在Django 1.3中对此进行了测试,当在一个名为“test_field”的forms.DateTimeField上使用该窗口小部件时,它将输出以下html:

<label for="id_test_field_0">Test field:</label>
<input id="id_test_field_0" class="foo" type="text" name="test_field_0">
<input id="id_test_field_1" class="bar" type="text" name="test_field_1">

我已经尝试了各种方法来复制进入的attrs以保留可能存在的任何其他参数,但我遇到了错误,不幸的是我今天已经没时间了。这应该让你前进,但只允许你修改字段的类attr。

答案 1 :(得分:0)

从Django 2.0开始,SplitDateTimeWidget支持time_attrs和date_attrs参数。

来自django docs

类似于Widget.attrs。一种 包含要在渲染器上设置的HTML属性的字典 DateInput和TimeInput小部件分别。如果这些属性 没有设置,而是使用Widget.attrs。

所以您将使用它们类似于以下内容:

class MyForm(forms.Form):
    test_field = forms.DateTimeField(widget=SplitDateTimeWidget(date_attrs={'class' : 'foo'}, time_attrs={'class' : 'bar'}))