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

我在models.py 中有一个简单的类。在管理员中,当保存的图书类型为 1 时,我想隐藏图书的标题(以图书详细信息形式)。如何以最简单的方式做到这一点?

4

5 回答 5

170

对于Django > 1.8,可以直接在 admin 中设置要排除的字段

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

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

例如

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', )
于 2013-09-03T11:45:32.260 回答
30

你要在你的模块中创建admin.py (可能是book

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
于 2012-04-26T11:52:56.290 回答
1

我试图覆盖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)
于 2020-10-11T15:51:59.233 回答
0

中肯的@Lorenz @mrts 答案

使用 Django 2.1,我发现如果该字段已通过 fields = 指定,则 exclude 不起作用。

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

self.fields.remove('title')

必须将字段定义为列表 [] 才能正常工作

于 2019-05-14T19:30:23.210 回答
0

如果要保持表单中的值(例如根据请求设置值,即用户)并隐藏字段,可以将小部件更改为forms.HiddenInput()

from django import forms

...

    def get_form(self, request, obj=None, **kwargs):
        """Set defaults based on request user"""
        # update user field with logged user as default
        form = super().get_form(request, obj, **kwargs)
        form.base_fields["user"].initial = request.user.id
        form.base_fields["user"].widget = forms.HiddenInput()
        return form

于 2021-10-07T00:32:36.183 回答