如何在django-admin中隐藏一些字段?

时间:2012-04-26 09:43:17

标签: django django-admin

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

我在models.py中有一个简单的类。在管理员中,我希望在保存的图书的类型为1时隐藏图书的标题(在书籍详细信息表格中)。 这怎么用最简单的方式?

4 个答案:

答案 0 :(得分:101)

对于 Django> 1.8可以directly set the fields to be excluded in admin

 class PostCodesAdmin(admin.ModelAdmin):
      exclude = ('pcname',)

通过设置Field属性,在Django的ORM中直接定义隐藏字段:editable = False

e.g。

class PostCodes(models.Model):
  gisid  = models.IntegerField(primary_key=True)
  pcname = models.CharField(max_length=32, db_index=True, editable=False)
  ...

但是,直接设置或更改模型的字段可能并不总是可行或有利的。原则上,以下admin.py设置可能有效,但由于exclude是InlineModelAdmin选项,因此不会。

class PostCodesAdmin(admin.ModelAdmin):
     exclude = ('pcname',)
....

至少在Django 1.4中运行的解决方案(以及可能的更新版本号)是:

class PostCodesAdmin(admin.ModelAdmin):
  def get_form(self, request, obj=None, **kwargs):
      form = super(PostCodesAdmin, self).get_form(request, obj, **kwargs)
      del form.base_fields['enable_comments'] 
      return form

对于项目的管理列表视图,只需省略不需要的字段即可: 例如

class PostCodesAdmin(admin.ModelAdmin):
  list_display = ('id', 'gisid', 'title', )

答案 1 :(得分:16)

您要在模块中创建 admin.py (可能预订

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

预订课程中:

class Book:
    ...
    def get_title_or_nothing(self):
        if self.type == WEIRD_TYPE:
            return ""
        return self.title

<强>更新:

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

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

答案 2 :(得分:0)

Apropos @Lorenz @mrts答案

在Django 2.1中,我发现如果已通过fields =指定字段,则排除不起作用。

在这种情况下,您可以使用

self.fields.remove('title')

必须将字段定义为列表[]才能起作用

答案 3 :(得分:0)

我尝试覆盖get_form()函数,但是当我切换不同的记录时会发生一些混淆错误。我发现有一个可以覆盖的get_exclude()函数。

使用:

class BookAdmin(admin.ModelAdmin):
    def get_exclude(self, request, obj=None):
        if obj and obj.type == "1":
            # When you create new data the obj is None
            return ("title", )
        return super().get_exclude(request, obj)