Атрибут prepopulated_fields
Атрибут prepopulated_fields класса ModelAdmin позволяет автоматически генерировать значение для одного или нескольких полей на основе значений других полей при создании или редактировании объекта в административной панели Django. Это особенно полезно для создания URL-идентификаторов (слаг-полей) на основе заголовков или других текстовых полей. Атрибут принимает словарь, где ключ - это поле, которое должно быть автоматически заполнено, а значение - кортеж или список полей, на основе которых оно генерируется.
Автоматическое заполнение происходит на стороне клиента с использованием JavaScript, что обеспечивает мгновенное обновление значений при вводе данных пользователем. При этом символы преобразуются в URL-совместимый формат: пробелы заменяются на дефисы, удаляются недопустимые символы, а текст приводится к нижнему регистру.
Синтаксис
from 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 настроим для автоматического создания слага на основе заголовка:
from 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
from django.contrib import admin
from .models import Article
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {
'slug': ('title',),
}
admin.site.register(Article, ArticleAdmin)
При вводе заголовка статьи "Моя первая статья" в поле slug автоматически появится значение "моя-первая-статья". При изменении заголовка поле слага будет обновляться автоматически.
Пример
Рассмотрим пример с комбинацией нескольких полей для создания слага на основе категории и названия:
from 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()
from 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 может автоматически заполнять несколько полей одновременно:
from 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
from 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,
который делает поля только для чтения в форме редактирования