2010-04-08 5 views
0

J'ai une méthode de fabrication qui génère des classes de formes django comme ceci:Pourquoi ces attributs de classe ne sont-ils pas enregistrés?

def get_indicator_form(indicator, patient): 
    class IndicatorForm(forms.Form): 
     #These don't work! 
     indicator_id = forms.IntegerField(initial=indicator.id, widget=forms.HiddenInput()) 
     patient_id = forms.IntegerField(initial=patient.id, widget=forms.HiddenInput()) 

     def __init__(self, *args, **kwargs): 
      forms.Form.__init__(self, *args, **kwargs) 
      self.indicator = indicator 
      self.patient = patient 

    #These do! 
    setattr(IndicatorForm, 'indicator_id', forms.IntegerField(initial=indicator.id, widget=forms.HiddenInput())) 
    setattr(IndicatorForm, 'patient_id', forms.IntegerField(initial=patient.id, widget=forms.HiddenInput())) 

    for field in indicator.indicatorfield_set.all(): 
     setattr(IndicatorForm, field.name, copy(field.get_field_type())) 

    return type('IndicatorForm', (forms.Form,), dict(IndicatorForm.__dict__)) 

J'essaie de comprendre pourquoi les déclarations de champ de formulaire haut ne fonctionnent pas, mais la méthode SetAttr ci-dessous est le travail. Je suis relativement novice en python, donc je pense que c'est une caractéristique du langage que je ne comprends pas bien. Pouvez-vous m'aider à comprendre pourquoi les déclarations de champ en haut de la classe n'ajoutent pas les champs à la classe?

Dans une remarque éventuellement connexe, lorsque ces classes sont instanciées, instance.media ne renvoie rien même si certains champs ont des widgets avec des médias associés.

Merci, Pete

Répondre

1

Essayez ceci:

def get_indicator_form(indicator, patient): 
    class IndicatorForm(forms.Form): 
     indicator_id = forms.IntegerField(initial=indicator.id, widget=forms.HiddenInput()) 
     patient_id = forms.IntegerField(initial=patient.id, widget=forms.HiddenInput()) 

     def __init__(self, *args, **kwargs): 
      forms.Form.__init__(self, *args, **kwargs) 
      self.indicator = indicator 
      self.patient = patient 

    for field in indicator.indicatorfield_set.all(): 
     IndicatorForm.base_fields[field.name] = field.get_field_type() 

    return IndicatorForm 
+0

Merci, cela a fonctionné. Comme Chris m'a expliqué dans IRC, Il a à voir avec le DeclaritiveFieldsMetaClass de la forme. Classe de classe mangeant les champs dans mon code original avant qu'ils aient été convertis en dict. – slypete

Questions connexes