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__() 方法

在 Django 过滤器语句中,__exact 和等号 (=) 有啥区别?

在main函数中使用django模型(附django正反向的外键关联查询)