我创建了这个小部件
class DateTimeWidget(forms.TextInput):
attr = {'class': 'datetimepicker'}
class Media:
js = ('js/jquery-ui-timepicker-addon.js',)
然后我在表格上使用它
class SessionForm(forms.ModelForm):
class Meta:
model = Session
def __init__(self, *args, **kwargs):
super(SessionForm, self).__init__(*args, **kwargs)
self.fields['start_time'].widget = DateTimeWidget()
self.fields['end_time'].widget = DateTimeWidget()
没有css class
适用于我的字段(我希望 datetimepicker 适用于start_time
和end_time
)。
我想我已将attr
放在错误的位置。我应该在哪里指定它?
答案 0 :(得分:4)
首先,html属性存储在widget.attrs
中,而不是attr
中。
其次,您无法在窗口小部件定义中声明attrs = {'class': 'datetimepicker'}
,因为__init__
方法将覆盖self.attrs
。
相反,您可以在attrs
方法中设置__init__
。
这是一个相当天真的实现。您可能需要添加一些额外的检查,以确保不覆盖kwargs['attrs']
中的任何现有项目。请注意,我们已将DateTimeInput
代替TextInput
。
class DateTimeWidget(DateTimeInput):
def __init__(self, *args, **kwargs):
kwargs['attrs'] = {'class': 'datepicker'}
super(DatePickerWidget, self).__init__(*args, **kwargs)
答案 1 :(得分:3)
我看到了多个问题:
要覆盖attrs,您需要覆盖init并更新attrs。或者你可以在初始化小部件时给予attrs。见:https://github.com/django/django/blob/master/django/forms/widgets.py#L163
小部件也可以定义为:
class SessionForm(forms.ModelForm):
class Meta:
model = Session
widgets = {'start_time': DateTimeWidget(),
'end_time': DateTimeWidget()}