Атрибут prepopulated_fields

Атрибут prepopulated_fields класса ModelAdmin позволяет автоматически генерировать значение для одного или нескольких полей на основе значений других полей при создании или редактировании объекта в административной панели Django. Это особенно полезно для создания URL-идентификаторов (слаг-полей) на основе заголовков или других текстовых полей. Атрибут принимает словарь, где ключ - это поле, которое должно быть автоматически заполнено, а значение - кортеж или список полей, на основе которых оно генерируется.

Автоматическое заполнение происходит на стороне клиента с использованием JavaScript, что обеспечивает мгновенное обновление значений при вводе данных пользователем. При этом символы преобразуются в URL-совместимый формат: пробелы заменяются на дефисы, удаляются недопустимые символы, а текст приводится к нижнему регистру.

Синтаксис

pythonfrom django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
  prepopulated_fields = {
    'field_to_prepopulate': ('source_field1', 'source_field2', ...),
  }

Пример

Допустим, у нас есть модель Article с полями title и slug. Атрибут prepopulated_fields настроим для автоматического создания слага на основе заголовка:

pythonfrom django.db import models
from django.utils import timezone

class Article(models.Model):
  title = models.CharField(max_length=200)
  slug = models.SlugField(max_length=200, unique=True)
  content = models.TextField()
  published_at = models.DateTimeField(default=timezone.now)

  def __str__(self):
    return self.title
pythonfrom django.contrib import admin
from .models import Article

class ArticleAdmin(admin.ModelAdmin):
  prepopulated_fields = {
    'slug': ('title',),
  }

admin.site.register(Article, ArticleAdmin)

При вводе заголовка статьи "Моя первая статья" в поле slug автоматически появится значение "моя-первая-статья". При изменении заголовка поле слага будет обновляться автоматически.

Пример

Рассмотрим пример с комбинацией нескольких полей для создания слага на основе категории и названия:

pythonfrom django.db import models

class Category(models.Model):
  name = models.CharField(max_length=100)

  def __str__(self):
    return self.name

class Product(models.Model):
  name = models.CharField(max_length=200)
  category = models.ForeignKey(Category, on_delete=models.CASCADE)
  slug = models.SlugField(max_length=200, unique=True)
  description = models.TextField()
pythonfrom django.contrib import admin
from .models import Product, Category

class ProductAdmin(admin.ModelAdmin):
  prepopulated_fields = {
    'slug': ('category', 'name'),
  }

admin.site.register(Product, ProductAdmin)
admin.site.register(Category)

При выборе категории "электроника" и вводе названия "ноутбук" поле slug автоматически заполнится значением "электроника-ноутбук".

Пример

Атрибут prepopulated_fields может автоматически заполнять несколько полей одновременно:

pythonfrom django.db import models

class Post(models.Model):
  title = models.CharField(max_length=200)
  slug = models.SlugField(max_length=200, unique=True)
  meta_keywords = models.CharField(max_length=255, blank=True)
  content = models.TextField()

  def __str__(self):
    return self.title
pythonfrom django.contrib import admin
from .models import Post

class PostAdmin(admin.ModelAdmin):
  prepopulated_fields = {
    'slug': ('title',),
    'meta_keywords': ('title', 'content'),
  }

admin.site.register(Post, PostAdmin)

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

Важные особенности

Для корректной работы атрибута prepopulated_fields поле, которое должно автоматически заполняться (ключ в словаре), должно быть типа SlugField, CharField или аналогичного текстового поля. При использовании SlugField рекомендуется устанавливать атрибут unique=True для гарантии уникальности URL-идентификаторов.

Автоматическое заполнение работает только в административной панели Django, для обычных форм на сайте необходимо реализовывать эту логику самостоятельно. При сохранении объекта через административную панель можно дополнительно использовать метод save_model для дополнительной обработки слага.

Если в настройках административной панели используется атрибут fields или fieldsets, необходимо убедиться, что поля, указанные в prepopulated_fields, присутствуют в этих настройках, иначе автоматическое заполнение работать не будет.

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

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