class Book(models.Model):
title = models.CharField(..., null=True)
type = models.CharField(...)
author = models.CharField(...)
我在models.py中有一个简单的类。在管理员中,我希望在保存的图书的类型为1时隐藏图书的标题(在书籍详细信息表格中)。 这怎么用最简单的方式?
答案 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)