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

时间:2017-12-27 13:54:33

标签: python django django-admin

如何在djano-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返回到其他记录,在这种情况下,表中的所有记录都隐藏了作者字段。

1 个答案:

答案 0 :(得分:2)

发生这种情况的原因是,一旦"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