2011-01-11 33 views
16

Tak więc moja książka django powraca na uniwersytet i staram się to rozwiązać.Dywizji podrzędnej Django - rekonstrukcji daty na post przy użyciu niestandardowej multiwidget

Mam podklasy django.forms.widgets.MultiWidget tak:

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) 

co daje mi ładne patrząc pole wyboru daty tak: Nifty looking date selection thing

Moja Queston jest naprawdę bardzo proste. Kiedy przesłać formularz powiedział do swojego sposobu obsługi (który wykorzystuje proces takiego:

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

nie to, ponieważ Django nie wiedzą jak brać moje multi-widget i przekształcić ją z powrotem do bazowego typu pola, który jest ustawiony w models.py do DateField() wyraźnie

teraz komentarze wokół MultiWidget w źródle django dać mi tę użyteczną wskazówkę.

prawdopodobnie będziesz chciał skorzystać z tej klasy z MultiVal ueField.

Ale chodzi o to - prawdopodobnie nie. Chcę zachować mój DateField(), ponieważ jest bardzo użyteczny i nie ma sensu go duplikować. To, co muszę zrobić, to przekonwertować te wiele pól z powrotem do jednego prawidłowego datownika (yyyy-mm-dd) w celu wstawienia do bazy danych.

Moje pytanie brzmi:

Jak? Jaki jest najlepszy sposób, aby to osiągnąć?

Odpowiedz

12

Odpowiedziałem na własne pytanie!

ja realizowane tą metodą:

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 ściąga dane z wszystkich podrzędnych widżety z całego postu datadict. To, co zrobiłem, to wyodrębnić różne odpowiedniki z dat i użyć konstruktora daty do sprawdzenia poprawności daty. Jeśli jest poprawna, wypisujemy ciąg znaków w prawidłowym formacie, w przeciwnym razie zwracamy pusty łańcuch, który będzie się przechwytywał.

Uwielbiam, kiedy to robię!