Атрибут form

Атрибут form применяется в классе ModelAdmin для замены стандартной формы редактирования модели на пользовательскую. Это позволяет настраивать поведение полей, добавлять валидацию, изменять отображение и управлять процессом сохранения данных. Атрибут принимает класс формы, унаследованный от forms.ModelForm.

Синтаксис

pythonfrom django.contrib import admin
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = '__all__'

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  form = ArticleForm

Пример

Давайте создадим пользовательскую форму для модели Article с добавлением валидации поля заголовка:

pythonfrom django.contrib import admin
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'content', 'status', 'category']
  
  def clean_title(self):
    title = self.cleaned_data.get('title')
    if len(title) < 5:
      raise forms.ValidationError('Title must be at least 5 characters long.')
    return title

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  form = ArticleForm

Результат выполнения кода:

python"Admin form for Article now validates title length"

Пример

Давайте добавим в форму дополнительные поля, которые не соответствуют модели, для отображения вычисляемых данных:

pythonfrom django.contrib import admin
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
  word_count = forms.IntegerField(required=False, disabled=True)
  
  class Meta:
    model = Article
    fields = ['title', 'content', 'status', 'category', 'word_count']
  
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    if self.instance and self.instance.pk:
      words = len(self.instance.content.split())
      self.fields['word_count'].initial = words

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  form = ArticleForm
  readonly_fields = ['word_count']

Результат выполнения кода:

python"Word count field appears in admin edit form"

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

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