Давайте додамо останню дрібку магії і розберемося з налаштуванням сторінок редагування та відображення даних.
Кастомізація сторінок редагування
У базовому налаштуванні Django Admin автоматично генерує форму редагування для об'єкта на основі полів моделі. Однак у реальних проєктах стандартна поведінка може бути недостатньою. Наприклад, ви можете захотіти змінити порядок відображення полів або приховати зайві поля. На щастя, Django надає для цього багато інструментів.
Зміна порядку полів за допомогою fields
Атрибут fields дозволяє вказати, які поля і в якому порядку мають відображатися на сторінці редагування.
Приклад:
# admin.py
from django.contrib import admin
from .models import Product
class ProductAdmin(admin.ModelAdmin):
fields = ['name', 'price', 'description'] # Вказуємо потрібні поля та їх порядок
admin.site.register(Product, ProductAdmin)
Якщо ви зайдете на сторінку редагування об'єкта Product, поля будуть відображатися у порядку, зазначеному у списку fields. Поля, не вказані у цьому списку, просто не будуть показані.
Спроба вказати поле, якого немає у моделі, викличе помилку FieldDoesNotExist. Переконайтеся, що всі зазначені поля реально існують у вашій моделі.
Групування полів за допомогою fieldsets
Якщо у вас багато полів і вони не поміщаються в одну колонку, можна використовувати fieldsets, щоб згрупувати поля в логічні блоки із заголовками.
Приклад:
# admin.py
class ProductAdmin(admin.ModelAdmin):
fieldsets = [
('Основна інформація', {'fields': ['name', 'price']}),
('Додатково', {'fields': ['description', 'created_at']}),
]
admin.site.register(Product, ProductAdmin)
На сторінці редагування ви побачите два розділи: "Основна інформація" і "Додатково". Це допомагає організувати інформацію і зробити інтерфейс більш зрозумілим.
Встановлення лише для читання за допомогою readonly_fields
Іноді потрібно зробити так, щоб поля на сторінці редагування були доступними лише для читання. Наприклад, ви хочете запобігти зміні значень важливих полів, таких як created_at.
Приклад:
# admin.py
class ProductAdmin(admin.ModelAdmin):
readonly_fields = ['created_at']
admin.site.register(Product, ProductAdmin)
Тепер поле created_at буде відображатися у формі, але його не можна буде змінити.
🤔 А чи можна зробити поле редагованим лише для адміністраторів? Так, трохи пізніше ми побачимо, як це зробити за допомогою перевизначення методів.
Кастомізовані відображення
Налаштування інтерфейсу редагування – це не тільки про порядок полів. Ви також можете кастомізувати, як саме відображаються дані, роблячи їх більш читабельними та зручними для роботи.
Динамічна зміна полів на основі об'єкта
Іноді набір полів, доступних для редагування, може залежати від самого об'єкта. Наприклад, ви хочете, щоб поле discount відображалося лише для товарів, ціна яких більше 100.
Приклад:
# admin.py
class ProductAdmin(admin.ModelAdmin):
def get_fields(self, request, obj=None):
if obj and obj.price > 100:
return ['name', 'price', 'description', 'discount']
return ['name', 'price', 'description']
admin.site.register(Product, ProductAdmin)
У методі get_fields ви можете реалізувати будь-яку логіку, яка визначає, які поля показувати залежно від атрибутів об'єкта.
Перевизначення форми редагування
Якщо вбудованих можливостей Django Admin недостатньо, ви можете повністю перевизначити форму редагування, використовуючи власний клас форми.
Приклад:
# forms.py
from django import forms
from .models import Product
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price', 'description']
def clean_price(self):
price = self.cleaned_data['price']
if price <= 0:
raise forms.ValidationError('Ціна повинна бути більше нуля!')
return price
# admin.py
from django.contrib import admin
from .forms import ProductForm
from .models import Product
class ProductAdmin(admin.ModelAdmin):
form = ProductForm
admin.site.register(Product, ProductAdmin)
Тепер при збереженні адміністратор отримає помилку, якщо вкаже від'ємну ціну.
Додавання користувацьких методів для полів
Іноді ви хочете показати, наприклад, розраховане значення або посилання на зовнішній ресурс. У таких випадках ви можете визначити метод у ModelAdmin і використовувати його замість стандартного поля.
Приклад:
# admin.py
class ProductAdmin(admin.ModelAdmin):
fields = ['name', 'price', 'discount', 'final_price']
def final_price(self, obj):
return obj.price - (obj.price * obj.discount / 100)
final_price.short_description = 'Підсумкова ціна' # Налаштування назви колонки
admin.site.register(Product, ProductAdmin)
На сторінці редагування з'явиться поле з розрахованою підсумковою ціною.
Користувацькі поля не можна редагувати прямо в адмінці. Якщо вам потрібно редагувати подібні дані, доведеться додати додаткову логіку.
Реальний приклад: кастомізація інтерфейсу для блогу
Візьмемо приклад застосунку для ведення блогу. У нас є модель Article з полями: title, content, author, status, published_at.
Код моделі:
# models.py
from django.db import models
from django.contrib.auth.models import User
class Article(models.Model):
DRAFT = 'draft'
PUBLISHED = 'published'
STATUS_CHOICES = [
(DRAFT, 'Чернетка'),
(PUBLISHED, 'Опубліковано'),
]
title = models.CharField(max_length=255)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default=DRAFT)
published_at = models.DateTimeField(null=True, blank=True)
Тепер налаштуємо адмін-зону:
# admin.py
from django.contrib import admin
from .models import Article
class ArticleAdmin(admin.ModelAdmin):
fieldsets = [
('Основна інформація', {'fields': ['title', 'content', 'author']}),
('Стан', {'fields': ['status', 'published_at']}),
]
readonly_fields = ['published_at']
def save_model(self, request, obj, form, change):
if obj.status == Article.PUBLISHED and not obj.published_at:
obj.published_at = timezone.now() # Автоматично виставляємо час публікації
super().save_model(request, obj, form, change)
admin.site.register(Article, ArticleAdmin)
Тепер адмінка виглядає акуратно, а при публікації статті автоматично заповнюється поле published_at.
На цьому етапі ви дізналися, як налаштовувати сторінки редагування та відображення об'єктів у Django Admin. Ці знання допоможуть вам робити інтерфейс адмін-зони зручним та зрозумілим для використання.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ