Подтвердить что ты не робот

Django subclassing multiwidget - восстановление даты на почте с использованием настраиваемого мультивидкостного

Итак, моя книга о джанго снова в университете, и я изо всех сил стараюсь работать над этим.

Я подклассифицировал django.forms.widgets.MultiWidget следующим образом:

class DateSelectorWidget(widgets.MultiWidget):
    def __init__(self, attrs=None, dt=None, mode=0):  
        if dt is not None:
            self.datepos = dt
        else:
            self.datepos = date.today()    

        # bits of python to create days, months, years
        # example below, the rest snipped for neatness.

        years = [(year, year) for year in year_digits]

        _widgets = (
            widgets.Select(attrs=attrs, choices=days), 
            widgets.Select(attrs=attrs, choices=months),
            widgets.Select(attrs=attrs, choices=years),
            )
        super(DateSelectorWidget, self).__init__(_widgets, attrs)

    def decompress(self, value):
        if value:
            return [value.day, value.month, value.year]
        return [None, None, None]

    def format_output(self, rendered_widgets):
        return u''.join(rendered_widgets)

Что дает мне красивое поле выбора даты, например: Nifty looking date selection thing

Мой запрос очень прост. Когда я передаю указанную форму методу обработки (который использует такой процесс:

forminstance = ModelNameForm(request.POST, instance=modelinstance)
    if forminstance.is_valid():
        forminstance.save()

Это не удается, потому что Django не знает, как взять мой мультивибратор и преобразовать его обратно в базовый тип поля, который установлен в models.py до DateField(), очевидно.

Теперь комментарии вокруг MultiWidget в источнике django дают мне этот полезный совет:

Вероятно, вы захотите использовать этот класс с MultiValueField.

Но дело в том, что я, вероятно, этого не делаю. Я хочу сохранить мой DateField(), потому что он очень полезен, и нет смысла дублировать его. То, что мне нужно сделать, - это каким-то образом преобразовать эти несколько полей в одну допустимую дату (yyyy-mm-dd) для вставки в базу данных.

Мой вопрос:

Как? Каков наилучший способ достичь этого?

4b9b3361

Ответ 1

Отвечал на мой собственный вопрос!

Я реализовал этот метод:

def value_from_datadict(self, data, files, name):
    datelist = [widget.value_from_datadict(data, files, name + '_%s' % i) \ 
                                      for i, widget in enumerate(self.widgets)]
    try:
        D = date(day=int(datelist[0]), month=int(datelist[1]), \
             year=int(datelist[2]))
        return str(D)
    except ValueError:
        return ""

value_from_datadict извлекает данные обо всех виджетах из всего столбца postadict. То, что я сделал, состоит в том, чтобы извлечь различные сопоставления даты и использовать конструктор даты для проверки даты. Если это действительно так, мы печатаем строку в правильном формате, в противном случае мы возвращаем пустую строку, которая

forminstance.is_valid()

будет ловить.

Мне нравится, когда я это делаю!