Django - Указание атрибута по умолчанию для пользовательского виджета - PullRequest
2 голосов
/ 28 марта 2012

Я создал этот виджет

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 в неправильном месте. Где я должен это указать?

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Во-первых, атрибуты 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)
3 голосов
/ 28 марта 2012

Я вижу несколько проблем:

  • Чтобы переопределить 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()}
...