gpt4 book ai didi

python - Django ModelAdmin 从 ModelForm 获取查询集

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:42 27 4
gpt4 key购买 nike

我正在使用 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 表单中吗?

最佳答案

问题在于您实际上是在 else 子句中实例化表单,而 other 子句返回类而不是实例。两个分支都需要返回一个类。

不幸的是,ModelAdmin 类中没有简单的钩子(Hook)来为表单实例化提供额外的 kwargs:它发生在 changeform_view 方法的深处,这比它应该的更难覆盖。您需要做一些聪明的事情来返回一个类,其中包含从 get_form 中嵌入的用户值。

关于python - Django ModelAdmin 从 ModelForm 获取查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28078419/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com