【发布时间】:2015-03-20 15:12:25
【问题描述】:
我正在使用 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 Admin 之外的表单,但我的网站要求模型在 Django Admin 内也可以编辑。所以我将这段代码用于我的 ModelAdmin,基于Django Docs
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'
经过一番谷歌搜索后,我发现了这种将查询集过滤置于 ModelAdmin 中的方法:
form = super(TestAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['controller_fk'].queryset = Controller.objects.filter(custid=cust)
return form
这工作得很好,但它确实需要我创建我的 ModelForm 的多个副本,这看起来不是很干。所以我想有人知道如何将我的 ModelForm 查询集返回到 ModelAdmin 表单中吗?
【问题讨论】:
-
我不太确定问题出在哪里(您还没有提供完整的堆栈跟踪来查看查询出错的地方)但是您可以尝试直接从
get_form方法返回您的表单实例吗?看看会发生什么?
标签: python django django-models django-forms django-admin