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