Как скрыть некоторые поля в django-admin?
class Book(models.Model):
title = models.CharField(..., null=True)
type = models.CharField(...)
author = models.CharField(...)
У меня есть простой класс в models.py. В администраторе я хотел бы скрыть название книги (в форме формы книги), когда тип сохраненной книги - 1.
Как это делается простейшим способом?
Ответы
Ответ 1
Вы должны создать 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
Для Django> 1.8 можно напрямую установить поля, которые будут исключены в admin:
class PostCodesAdmin(admin.ModelAdmin):
exclude = ('pcname',)
Скрытые поля напрямую определяются в Django ORM путем установки атрибута поля: 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
может работать, но не будет, так как исключение - это опция 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', )
Ответ 3
По поводу @Lorenz @mrts ответа
с Django 2.1 я обнаружил, что исключение не работает, если поле уже указано через fields =.
В этом случае вы можете использовать
self.fields.remove('title')
поля должны быть определены как список [], чтобы это работало