2010-04-18 5 views
0

J'ai deux MultiWidget l'un dans l'autre, mais le problème est que le MultiWidget contenu ne retourne pas la compression, comment puis-je faire pour obtenir la bonne valeur du premier widget? Dans ce cas de SplitTimeWidgetMultiWidget dans MultiWidget comment compresser le premier?

class SplitTimeWidget(forms.MultiWidget): 
    """ 
    Widget written to split widget into hours and minutes. 
    """ 
    def __init__(self, attrs=None): 
     widgets = (
        forms.Select(attrs=attrs, choices=([(hour,hour) for hour in range(0,24)])), 
        forms.Select(attrs=attrs, choices=([(minute, str(minute).zfill(2)) for minute in range(0,60)])), 
       ) 
     super(SplitTimeWidget, self).__init__(widgets, attrs) 

    def decompress(self, value): 
     if value: 
      return [value.hour, value.minute] 
     return [None, None] 


class DateTimeSelectWidget (forms.MultiWidget): 
    """ 
    A widget that splits date into Date and Hours, minutes, seconds with selects 
    """ 
    date_format = DateInput.format 

    def __init__(self, attrs=None, date_format=None): 
     if date_format: 
      self.date_format = date_format 
     #if time_format: 
     # self.time_format = time_format 

     hours = [(hour,str(hour)+' h') for hour in range(0,24)] 
     minutes = [(minute,minute) for minute in range(0,60)] 
     seconds = minutes #not used always in 0s 
     widgets = (
      DateInput(attrs=attrs, format=self.date_format), 
      SplitTimeWidget(attrs=attrs), 
      ) 
     super(DateTimeSelectWidget,self).__init__(widgets, attrs) 

    def decompress(self, value): 
     if value: 
      return [value.date(), value.time()] 
     else: 
      [None, None, None] 

Répondre

1

Je voudrais créer un seul grand MultiWidget - quelque chose comme DateSelectTimeSplitWidget qui utilise tous les widgets standards que vous avez besoin. (3xSelect, 2xInput). Après tout, il sera stocké dans un champ timestamp, non?

+0

En fait, je suis à la recherche de 1xTextInput (date) et 2xSelect (heures, minutes), et je suis tout prêt, le fait est que je n'aime pas répéter mon auto, mais de toute façon c'est fait. Comment allez-vous faire si vous mettez la date dans select ?, je veux dire afficher 28, 30 et 31 nombre de jours dans le mois correct? javascript? – sacabuche

+0

J'utiliserais django/forms/extras/widgets.py comme point de départ. Si un utilisateur choisit de sélectionner une date invalide (par exemple 2010/02/30), alors le champ de formulaire déclenchera l'erreur ValidationError habituelle. Je n'ai jamais pris la peine d'implémenter du javascript pour ce cas. – mawimawi