class Book(models.Model):
title = models.CharField(..., null=True)
type = models.CharField(...)
author = models.CharField(...)
我在models.py 中有一个简单的类。在管理员中,当保存的图书类型为 1 时,我想隐藏图书的标题(以图书详细信息形式)。如何以最简单的方式做到这一点?
class Book(models.Model):
title = models.CharField(..., null=True)
type = models.CharField(...)
author = models.CharField(...)
我在models.py 中有一个简单的类。在管理员中,当保存的图书类型为 1 时,我想隐藏图书的标题(以图书详细信息形式)。如何以最简单的方式做到这一点?
对于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', )
你要在你的模块中创建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
我试图覆盖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)
中肯的@Lorenz @mrts 答案
使用 Django 2.1,我发现如果该字段已通过 fields = 指定,则 exclude 不起作用。
在这种情况下,您可以使用
self.fields.remove('title')
必须将字段定义为列表 [] 才能正常工作
如果要保持表单中的值(例如根据请求设置值,即用户)并隐藏字段,可以将小部件更改为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