标签:python django django-models django-forms django-admin
我使用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得到这个错误:int(无效的文字对于基数为10的'(TestForm’)
经过一些googeling我遇到了这种方法,它将查询集过滤放在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表单?
解决方法:
问题是你实际上是在else子句中实例化你的表单,而另一个子句返回的是类而不是实例.两个分支都需要返回一个类.
遗憾的是,ModelAdmin类中没有简单的钩子来为表单实例化提供额外的kwargs:它发生在changeform_view方法的深处,它比应该更难以覆盖.您需要做一些聪明的事情来返回一个具有get_form中的用户值的类.
标签:python,django,django-models,django-forms,django-admin 来源: https://codeday.me/bug/20190703/1361695.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。