Подтвердить что ты не робот

Как скрыть некоторые поля в django-admin?

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

У меня есть простой класс в models.py. В администраторе я хотел бы скрыть название книги (в форме формы книги), когда тип сохраненной книги - 1. Как это делается простейшим способом?

4b9b3361

Ответ 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')

поля должны быть определены как список [], чтобы это работало