Прям сначала пришла в голову идея реализации такой фишки, но предварительно порыл в исходники джанги, дабы удостоверится, что не мастерю лисипед. Оказалось таки мастырю.
В Джанго есть MultiWidget, при инициализации которого можно указывать массив виджетов, которые будут принадлежать одному полю и выведены в ряд. При этом значение, возвращаемое этим виджетом – очевидно будет массив.
Правда просто так он почему-то не захотел работать. Разработчики почему-то захотели, чтоб его использовали всегда только как базовый класс, а не как конечный, и требуют переопределения decompress. Поэтому переопределив его мы сделали конечный и многоразового использования.
Ниже пример поля с датой из 3х выпадающих списков:
-
from datetime import date
-
-
from django import forms
-
from django.utils.translation import ugettext_lazy as _
-
-
class ListMultiWidget(forms.MultiWidget):
-
def decompress(self,values):
-
if values:
-
return values
-
return [None]*(len(self.widgets))
-
-
YEARS_CHOICES = map(lambda a: (a,a), range(1950,2011))
-
MONTH_CHOICES = map(lambda a: (a,a), range(1,13))
-
DAY_CHOICES = map(lambda a: (a,a), range(1,32))
-
-
SplitDates = ListMultiWidget((forms.Select(choices=YEARS_CHOICES),
-
forms.Select(choices =MONTH_CHOICES),
-
forms.Select(choices =DAY_CHOICES )))
-
-
class SplitDatesField(forms.Field):
-
widget = SplitDates
-
def to_python(self,value):
-
try:
-
return date(int(value[0]),int(value[1]),int(value[2]))
-
except ValueError:
-
raise forms.ValidationError(_(u'Wrong Date'))

Recent Comments