How to hide some fields in django-admin?

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

I have a simple class in models.py. In admin I would like to hide title of the book (in book details form) when type of the saved book is 1. How do this in a simplest way?

82193 次浏览

您将在模块中创建 Admin.py(可能是 book)

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

Book课程中:

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

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

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

Hidden fields are directly defined in Django's ORM by setting the Field attribute: editable = False

例如:。

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

However, setting or changing the model's fields directly may not always be possible or advantegous. In principle the following admin.py setup could work, but won't since 排除 is an InlineModelAdmin option.

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', )

回答

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

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

self.fields.remove('title')

字段必须定义为 list []才能工作

我试图覆盖 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)

如果您想在表单中维护值(例如,根据请求设置一个值,即用户)并隐藏字段,您可以将小部件更改为 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


class BookAdmin(admin.ModelAdmin):
exclude = ("fieldname",)  # hide fields which you want

下面是一个实用的例子

class BookAdmin(admin.ModelAdmin):
def get_fieldsets(self, request, obj):
if obj is None:
return [
(
None,
{'fields': ('type', 'description',)}
)
]
elif request.user.is_superuser:
return [
(
None,
{'fields': ('type', 'status', 'author', 'store', 'description',)}
)
]
else:
return [
(
None,
{'fields': ('type', 'date', 'author', 'store',)}
)
]