我使用了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
答案 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'}))