我有一个工厂方法,可以像这样生成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
也不会返回任何内容。
谢谢, 皮特
答案 0 :(得分: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