Django - создание подклассов мультивиджетов - воссоздание даты в посте с использованием собственного мультивиджета
Так что моя книга по джанго вернулась в университет, и я изо всех сил пытаюсь решить эту.
Я подкласс 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)
Что дает мне красивое поле для выбора даты:
Мой квест очень прост. Когда я отправляю указанную форму ее методу обработки (который использует такой процесс:
forminstance = ModelNameForm(request.POST, instance=modelinstance)
if forminstance.is_valid():
forminstance.save()
Это терпит неудачу, потому что Django не знает, как взять мой мультивиджет и преобразовать его обратно в базовый тип поля, который установлен в models.py
в DateField()
ясно.
Теперь комментарии к MultiWidget в источнике django дают мне этот полезный совет:
Возможно, вы захотите использовать этот класс с MultiValueField.
Но дело в том - я, вероятно, нет. Я хочу сохранить свой DateField()
потому что это очень полезно, и нет смысла дублировать его. Что мне нужно сделать, так это каким-то образом преобразовать эти несколько полей обратно в одну допустимую строку даты (yyyy-mm-dd
) для вставки в базу данных.
Мой вопрос тогда:
Как? Каков наилучший способ достичь этого?
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
извлекает данные всех подвиджетов из всего пост-данных. Что я сделал, так это извлек различные аналоги даты и использовал конструктор даты для проверки даты. Если это верно, мы печатаем строку в правильном формате, в противном случае мы возвращаем пустую строку, которая
forminstance.is_valid()
будет ловить
Я люблю это, когда я делаю это!