Итак, моя книга о джанго вернулась в университет, и я изо всех сил пытаюсь решить эту.
Я вложил в подкласс 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
) для вставки в базу данных.
Тогда мой вопрос:
Как? Каков наилучший способ добиться этого?