django:将模型传递给表单

时间:2013-07-21 07:04:27

标签: django forms parameters model

我想将模型“modelToUse”传递给我的表单:

class ActsAddForm(forms.Form):
    def __init__(self,*args,**kwargs):
        self.modelToUse = kwargs.pop('modelToUse')
        super(ActsAddForm,self).__init__(*args,**kwargs)
    actsToValidate=forms.ModelChoiceField(queryset=modelToUse.objects.filter(validated=0), empty_label="Select an act to validate", widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))

我收到错误“name'modeToUse'未定义”。怎么了?

我想在我的观点中称之为:

addForm=ActsAddForm(modelToUse=ActsIdsModel())

1 个答案:

答案 0 :(得分:1)

你误解了范围和类在Python中的工作方式。 actsToValidate是类级属性,将在类定义时进行评估。另一方面,__init__在课程实例化时进行评估。

即使它们按照正确的顺序进行评估,它仍然无效,因为你没有将modelToUse放入类范围,字段定义可以看到它。

您需要在没有查询集的类级别定义字段,然后将其添加到__init__方法中。像这样:

class ActsAddForm(forms.Form):
    actsToValidate=forms.ModelChoiceField(empty_label="Select an act to validate", widget=forms.Select(attrs={'onchange': 'this.form.submit();'}))

    def __init__(self,*args,**kwargs):
        modelToUse = kwargs.pop('modelToUse')
        super(ActsAddForm,self).__init__(*args,**kwargs)
        self.fields['actsToValidate'].queryset=modelToUse.objects.filter(validated=0)