2011-01-11 13 views
16

Also mein Django Buch ist zurück an der Universität und ich habe Schwierigkeiten, diese eine zu arbeiten.Django Subclassing Multiwidget - Rekonstruktion Datum auf Post mit benutzerdefinierten Multiwidget

habe ich django.forms.widgets.MultiWidget wie so subclassed:

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) 

Was mir ein geschicktes Dattel Auswahlfeld wie so gibt: wirklich Nifty looking date selection thing

Mein queston ist sehr einfach. Als ich sagte, Formular senden, um seine Handhabung Methode (die ein Verfahren wie folgt verwendet:

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

Dies schlägt fehl, weil Django nicht weiß, wie mein Multi-Widget zu nehmen und sie zurück in den zugrunde liegenden Feldtyp umwandeln, der in models.py zu DateField(), klar festgelegt

Nun werden die Kommentare um die MultiWidget in der django Quelle geben Sie mir diesen nützlichen Hinweis.

Sie werden wahrscheinlich wollen diese Klasse verwenden, mit MultiVal EUField.

Aber die Sache ist - ich wahrscheinlich nicht. Ich möchte meine DateField() behalten, weil es sehr nützlich ist und es keinen Sinn hat, es zu duplizieren. Was ich dann tun muss, besteht irgendwie darin, diese mehreren Felder wieder in eine einzige gültige Datenfolge (yyyy-mm-dd) zum Einfügen in die Datenbank umzuwandeln.

Meine Frage ist dann:

Wie? Was ist der beste Weg, dies zu erreichen?

Antwort

12

beantwortete meine eigene Frage!

implementiert I diese Methode:

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 zieht die Daten aller Unter widgets aus dem gesamten Post datadict. Was ich getan habe ist, die verschiedenen Datumsgegenstücke herauszuziehen und den Datumskonstruktor zu verwenden, um das Datum zu validieren. Wenn es gültig ist, drucken wir die Zeichenfolge im richtigen Format aus, andernfalls geben wir eine leere Zeichenfolge zurück, die sich einfangen lässt.

Ich liebe es, wenn ich das tue!

Verwandte Themen