2010-04-08 63 views
0

我有一個生成像這樣的Django表單類工廠方法:爲什麼這些類屬性沒有註冊?

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__)) 

我試圖理解爲什麼頂形態字段聲明不工作,但低於SETATTR方法確實可行。我對python相當陌生,所以我懷疑這是我誤解的某種語言功能。你能幫我理解爲什麼這個類頂部的字段聲明不會將這些字段添加到類中嗎?

在一個可能相關的說明中,當這些類被實例化時,即使某些字段具有關聯媒體的小部件,instance.media也不會返回任何內容。

感謝, 皮特

回答

1

試試這個:

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

謝謝,這個工作。正如克里斯在IRC中向我解釋的那樣,它與Forms.Form類的DeclaritiveFieldsMetaClass有關,它們在轉換爲字典之前會在原始代碼中佔用字段。 – slypete 2010-04-09 02:06:22

相關問題