我正在使用一个ModelForm,根据模型创建一个表单,以在我的网站上的各个位置使用。该表单具有外键字段,需要根据用户进行过滤。我已经成功地使用以下方法实现了这一点:
class TestForm(ModelForm):
def __init__(self,user,*args,**kwargs):
super (TestForm,self ).__init__(*args,**kwargs) # populates the post
self.fields['controller'].queryset = Controller.objects.filter(user=user)
class Meta:
model = Test
exclude = ['customer']
在我看来,使用以下代码: form = TestForm(user)
这对于我的Django管理外的表单工作得很好,但是我的网站要求模型也可以在Django管理中进行编辑。因此,我根据Django文档中的示例编写了下面的ModelAdmin代码:
class TestAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
kwargs['form'] = SuTestForm
else:
kwargs['form'] = TestForm(request.user)
return super(TestAdmin, self).get_form(request, obj, **kwargs)
我认为这应该与我的其他表单一样工作,但是django返回了以下错误:invalid literal for int() with base 10: 'TestForm'
经过一番搜索,我找到了这种方法,它将queryset筛选放在ModelAdmin内部:
form = super(TestAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['controller_fk'].queryset = Controller.objects.filter(custid=cust)
return form
这个方法可以完美地运行,但需要我创建多个ModelForm的副本,这似乎不太符合DRY原则。所以,有没有人知道如何将我的ModelForm查询集返回到ModelAdmin表单中?