我已经使用以下代码解决了获取正在编辑的对象id的问题:
class CompanyUserInline(admin.StackedInline):
"""
Defines tabular rules for editing company users direct in company admin
"""
model = CompanyUser
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "user":
users = User.objects.filter( Q(is_superuser=False) )
query = Q()
for u in users:
aux = CompanyUser.objects.filter(user=u)
if aux.count() == 0:
query |= Q(pk=u.id)
try:
cpu = CompanyUser.objects.filter(company__id=int(request.path.split('/')[4]))
for p in cpu:
query |= Q(pk=p.user.id)
except:
pass
kwargs["queryset"] = User.objects.filter(query).order_by('username')
return super(CompanyUserInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
但是,int(request.path.split('/')[4]) 真的很难看。我想知道我是如何从Django AdminModel中得到id的。我确信它就在里面的某个地方,有人知道吗?
先谢谢你!D级
8条答案
按热度按时间pgpifvop1#
经过一番挖掘,我们能够获取传递给admin视图的参数(在django admin的www.example.com解析之后urls.py),并使用该参数(self_pub_id)获取对象:
一个更优雅的解决方案是使用已接受的答案建议并利用get_form ModelAdmin成员函数。
ygya80vv2#
下面的代码片段将为您提供对象ID:
样品使用:(我正在过滤显示的电话号码,以便仅显示客户的电话号码)
附言:通过调试和遍历可访问变量找到它。
nxowjjhe3#
据我所知,通过
formfield_for_...
-方法访问当前示例是不可能的,因为只会为单个字段示例调用它们!在
get_form
中可以访问整个示例/表单,这是一个更好的逻辑挂钩点,也可以覆盖表单字段的queryset!polkgigr4#
我通过重写
change_view()
使其工作那么你可以在
formfield_for_foreignkey()
中调用self.object_id
s6fujrry5#
一种更通用的方法是编写一个helper方法来获取模型示例(如果有的话),就像您通常对(绑定的)ModelForm所做的那样,并从该方法中检索id或任何其他属性:
yiytaume6#
简短回答
如果您"真的"需要
formfield_for_foreignkey()
中的对象id
,可以使用request.resolver_match.kwargs.get('object_id')
(docs),正如@mazyar-mk的回答中所建议的那样。但是,如果 * 目标 * 是基于对象过滤查询集,那么最好按照
formfield_for_foreignkey()
文档中的建议扩展ModelForm.__init__()
。参见底部的示例。
长答案(带示例)
接受的answer by @BernhardVallant建议扩展
ModelAdmin.get_form()
,注解中建议修改base_fields
属性(注意get_form()
返回的是表单 * class *,不是绑定表单)。这是很诱人的,在某些情况下,你可能会像这样侥幸逃脱:
然而,Django的文档对此提出了警告:
请注意不要更改
base_fields
属性,因为此修改将影响同一Python进程中的所有后续ContactForm
示例:...另请参见例如this answer。
answer by @fizxmike提供了一个使用
get_form()
而不修改base_fields
的替代示例,但它仍然需要formfield_for_foreignkey()
。文档中的解决方案
formfield_for_foreignkey()
的文档建议了另一种方法(另请参见this ticket和fields docs):对于更复杂的过滤器,您可以使用
ModelForm.__init__()
方法基于模型的instance
进行过滤...表单初始化后,可以访问
fields
属性来修改查询集,而且可以访问实际的对象(如self.instance
),而不仅仅是对象id。例如:
在这里,我们检查
self.instance.pk
以查看对象是否存在于数据库中(add vs change view)。这种方法也适用于内联。
smtd7mpg7#
我在处理一个类似的情况,并意识到我需要从请求的id,我可以从模型它自己,因为它是一个外键到该模型,所以它将是这样的:
或者你的模型结构所要求的。
yzuktlbb8#
我在www.example.com中创建了一个属性()model.py,它返回ID
models.py:
admin.py: