如何在django-admin中隐藏特定记录的字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在django-admin中隐藏特定记录的字段?相关的知识,希望对你有一定的参考价值。

如何在django-admin中隐藏特定记录的字段?例如,如果我有一个模型

class Book(models.Model):
    title = models.CharField(..., null=True)
    author = models.CharField(...)

我想隐藏管理员面板中的作者以记录pk = 1.我发现解决方案为

class BookAdmin(admin.ModelAdmin):
    list_display = ("pk", "get_title_or_nothing")

    def get_form(self, request, obj=None, **kwargs):
        if obj.pk == "1":
            self.exclude = ("author", )
        form = super(BookAdmin, self).get_form(request, obj, **kwargs)
        return form

它运行良好,直到我从记录与pk == 1回到其他记录,在这种情况下,表中的所有记录都隐藏了作者字段。

答案

发生这种情况的原因是因为一旦"author"字段被附加到self.exclude,它就会停留在那里。

对于Django> = 1.11:

ModelAdmin.get_exclude中更好地动态排除字段。它是在Django 1.11中引入的。

def get_exclude(self, request, obj=None, **kwargs):
    if obj and obj.pk == 1:
        # don't modify self.exclude
        # instead return it with the extra added field
        return self.exclude + ('author',)
    return self.exclude

对于Django <1.11:

对于旧版本,您可以执行以下操作:

class BookAdmin(...):
    exclude = (# common excluded fields)
    original_exclude = exclude

def get_form(self, request, obj=None, **kwargs):
    if obj and obj.pk == 1:
        self.exclude += ('author',)
    else:
        # change it back to the original_exclude
        # for other objects
        self.exclude = self.original_exclude
    form = super(BookAdmin, self).get_form(request, obj, **kwargs)
    return form

以上是关于如何在django-admin中隐藏特定记录的字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作 django 酥脆的表格来隐藏特定的字段?

如何使用 ajax 在 Django-admin 表格内联中读取/写入输入字段?

Django-admin:如何在记录更改列表中显示指向对象信息页面的链接而不是编辑表单?

如何在 Django-admin 中添加自定义搜索框?

如果自定义字段是特定值,如何隐藏它? [关闭]

Django-Admin 和 Django-Summernote 在我的表单中创建一个文件字段