Python 为什么不';这些类属性不注册吗?

Python 为什么不';这些类属性不注册吗?,python,django,django-forms,Python,Django,Django Forms,我有一个生成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 = fo

我有一个生成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
不会返回任何内容,即使某些字段有与媒体相关的小部件

谢谢, 皮特

试试这个:

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

谢谢,这很有效。正如Chris在IRC中向我解释的那样,它与forms.Form类的DeclaritiveFieldsMetaClass有关,Form类在将原始代码中的字段转换为dict之前会占用它们。