2011-01-11 7 views
16

Django kitabım üniversiteye geri döndü ve bunu çözmek için uğraşıyorum.Django alt sınıf multiwidget - özel multiwidget kullanarak gönderide yeniden yapılandırma tarihi

ben şöyle django.forms.widgets.MultiWidget sınıflandırma ettik: Nifty looking date selection thing

Benim queston gerçekten çok basittir: şöyle bana şık görünümlü tarih seçme alanını verir

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) 

. Böyle bir işlem kullanır ki (onun ele yöntemine formu söyledi gönderirim zaman:

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

Django benim çok widget'ı almak biliyorum ve altta yatan alan türü geri dönüştürmek için bu, başarısız, hangi açıkça DateField() için models.py ayarlanır

Şimdi, django kaynağında MultiWidget etrafında yapılan yorumlar beni bu yararlı ipucu vermek. muhtemelen MultiVal ile bu sınıfı kullanmak isteyeceksiniz

ueField.

Ama şey - Muhtemelen yok. DateField() numaramı tutmak istiyorum, çünkü çok kullanışlıdır ve kopyalamanın bir anlamı yoktur. Yapmam gereken şey, bir şekilde bu çoklu alanları, veritabanına eklemek için tek geçerli bir test (yyyy-mm-dd) haline dönüştürmektir.

sorum o zaman:

nasıl? Bunu başarmanın en iyi yolu nedir?

cevap

12

Kendi sorumu yanıtladı!

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 mesajlarda datadict, bütün alt aletler veri çeker:

bu yöntemi uygulamaya. Yaptığım şey, çeşitli tarih karşılıklarını çıkarmak ve tarihi doğrulamak için tarih yapıcıyı kullanmaktır. o geçerliyse, aksi takdirde, biz

forminstance.is_valid() 

yakalayacak boş bir dize döndürür, doğru biçimde dize çıktısını.

Bunu yaptığımda seviyorum!

İlgili konular