Django - 在 render_change_form (ModelAdmin) 中获取对象 ID
Posted
技术标签:
【中文标题】Django - 在 render_change_form (ModelAdmin) 中获取对象 ID【英文标题】:Django - Get object id in render_change_form (ModelAdmin) 【发布时间】:2012-05-20 08:11:17 【问题描述】:我有这两个模型和模型管理员。在可用主机用户列表中添加新主机时,只会出现未分配给另一台主机的主机用户。 问题是如果我编辑一个已经创建的主机,它的实际主机用户 ID 也会被过滤,所以我想做的是排除当前分配的主机用户 ID。 如何在从 hostuser 字段中排除当前 id 时指定?
我需要的语句写在*之间
提前致谢
模型.py
class HostUser(models.Model):
name = models.CharField(max_length=200)
..More Data..
class Host(models.Model):
..More Data..
hostuser = models.ForeignKey(HostUser, blank=True, null=True)
Admin.py
class HostAdmin(admin.ModelAdmin):
..More Data..
def render_change_form(self, request, context, *args, **kwargs):
list_names = Host.objects.values_list('hostuser__id', flat=True).exclude(hostuser__id=None).exclude(hostuser__id=**ACTUAL HOSTUSER_ID**)
list_names = [int(ids) for ids in list_names]
context['adminform'].form.fields['hostuser'].queryset = HostUser.objects.exclude(id__in=list_names)
return super(HostAdmin, self).render_change_form(request, context, args, kwargs)
【问题讨论】:
不会将unique=True
添加到您的 ForeignKey 实现相同的目标,但确保您不会在代码中犯错误吗?
过滤器的应用有两个原因,第一个是禁用两个主机具有相同的hostuser,可以有效解决设置唯一性,但第二个原因是过滤器不会显示所有hostuser可供选择(可能是数百个)仅显示尚未分配的那些(它将是几个)。
如果您已解决问题,请将其作为答案发布,以便对其他人有所帮助。
【参考方案1】:
(在问题编辑中回答。转换为社区 wiki 答案。参见What is the appropriate action when the answer to a question is added to the question itself?)
OP 写道:
使用 kwargs 解决,Modeladmin 如下所示:
def render_change_form(self, request, context, *args, **kwargs): try: list_names = Host.objects.values_list('hostuser__id', flat=True).exclude(hostuser__id=None).exclude(hostuser__id=kwargs['obj'].hostuser.id) except: list_names = Host.objects.values_list('hostuser__id', flat=True).exclude(hostuser__id=None) list_names = [int(ids) for ids in list_names] context['adminform'].form.fields['hostuser'].queryset = HostUser.objects.exclude(id__in=list_names) return super(HostAdmin, self).render_change_form(request, context, args, kwargs)
【讨论】:
使用 kwargs 抓取对象,例如kwargs['obj'].这是这个答案的重要部分。以上是关于Django - 在 render_change_form (ModelAdmin) 中获取对象 ID的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能将 __getattr__ 与 Django 模型一起使用?
如何在模板中显示 Django '__all__' 表单错误?
如何在自定义 django 表单中隐藏 django 标签?
在 Python 2 上的 Django 中使用 __str__() 方法