Атрибут exclude

Атрибут exclude применяется в классе ModelAdmin и позволяет указать список полей модели, которые не должны отображаться в форме редактирования или создания записи. В отличие от атрибута fields, где перечисляются поля для отображения, exclude работает наоборот: из формы удаляются все поля, перечисленные в этом атрибуте.

Синтаксис

pythonfrom django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
  exclude = ('field1', 'field2')

Пример

Рассмотрим модель Article с полями title, content, author, created_at и status. Исключим из формы поля created_at и status:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=200)
  content = models.TextField()
  author = models.CharField(max_length=100)
  created_at = models.DateTimeField(auto_now_add=True)
  status = models.CharField(max_length=20, default='draft')
pythonfrom django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
  exclude = ('created_at', 'status')

admin.site.register(Article, ArticleAdmin)

В результате форма редактирования статьи в административной панели будет содержать только поля title, content и author, а поля created_at и status не будут отображаться.

Пример

Используем атрибут exclude вместе с fieldsets. Определим группу полей и исключим поле slug из формы:

pythonfrom django.db import models

class Category(models.Model):
  name = models.CharField(max_length=100)
  slug = models.SlugField(unique=True)
  description = models.TextField(blank=True)
  is_active = models.BooleanField(default=True)
pythonfrom django.contrib import admin
from .models import Category

class CategoryAdmin(admin.ModelAdmin):
  fieldsets = (
    ('Основная информация', {
      'fields': ('name', 'slug')
    }),
    ('Дополнительно', {
      'fields': ('description', 'is_active')
    }),
  )
  exclude = ('slug',)

admin.site.register(Category, CategoryAdmin)

Теперь в форме редактирования категории поле slug будет исключено из всех групп, несмотря на то, что оно указано в fieldsets.

Пример

Исключим несколько полей сразу. Рассмотрим модель UserProfile с полями user, phone, address, birth_date и bio. Исключим поля user и birth_date:

pythonfrom django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  phone = models.CharField(max_length=15, blank=True)
  address = models.TextField(blank=True)
  birth_date = models.DateField(null=True, blank=True)
  bio = models.TextField(blank=True)
pythonfrom django.contrib import admin
from .models import UserProfile

class UserProfileAdmin(admin.ModelAdmin):
  exclude = ('user', 'birth_date')

admin.site.register(UserProfile, UserProfileAdmin)

В форме редактирования профиля пользователя останутся только поля phone, address и bio. Поля user и birth_date будут скрыты.

Смотрите также

  • атрибут fields,
    который определяет порядок отображения полей в форме
  • атрибут fieldsets,
    который группирует поля в форме редактирования
  • атрибут readonly_fields,
    который делает поля доступными только для чтения
  • атрибут list_display,
    который определяет поля, отображаемые в списке записей