Django - 为自定义小部件指定默认属性

Pie*_*NAY 3 django django-forms django-widget

我已经创建了这个小部件

class DateTimeWidget(forms.TextInput):
  attr = {'class': 'datetimepicker'}
  class Media:
    js = ('js/jquery-ui-timepicker-addon.js',)
Run Code Online (Sandbox Code Playgroud)

然后我在我的表格上使用它

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()
Run Code Online (Sandbox Code Playgroud)

没有 cssclass应用于我的字段(我希望datetimepicker应用于两者start_time& end_time)。
我想我放attr错了位置。我应该在哪里指定它?

Ala*_*air 5

首先,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)
Run Code Online (Sandbox Code Playgroud)