Атрибут model
Атрибут model класса TabularInline определяет модель, записи которой будут отображаться в виде табличных строк на странице редактирования другой модели. Он является обязательным для любого класса, наследующего TabularInline. Без указания этого атрибута административная панель не сможет определить, с какой моделью работать.
Синтаксис
from django.contrib import admin
from .models import ParentModel, ChildModel
class ChildInline(admin.TabularInline):
model = ChildModel
Пример
Рассмотрим базовый пример использования атрибута model для отображения связанных объектов на странице редактирования родительской модели:
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=100)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
price = models.IntegerField()
def __str__(self):
return self.name
from django.contrib import admin
from .models import Category, Product
class ProductInline(admin.TabularInline):
model = Product
extra = 1
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
inlines = [ProductInline]
Результат выполнения кода:
"На странице редактирования категории отображается таблица с продуктами этой категории"
Пример
Атрибут model может использоваться в связках с внешними ключами. Если у модели несколько внешних ключей на одну родительскую модель, можно уточнить с помощью атрибута fk_name, но сам model остаётся обязательным:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
co_author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='co_books', null=True)
def __str__(self):
return self.title
from django.contrib import admin
from .models import Author, Book
class BookInline(admin.TabularInline):
model = Book
fk_name = 'author'
extra = 1
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
inlines = [BookInline]
Результат выполнения кода:
"На странице автора отображаются только книги, где он указан как автор, а не соавтор"
Пример
Атрибут model также работает с промежуточными моделями для связей ManyToManyField через параметр through. Это позволяет управлять дополнительными полями в такой связи прямо на странице редактирования:
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Course(models.Model):
title = models.CharField(max_length=100)
students = models.ManyToManyField(Student, through='Enrollment')
def __str__(self):
return self.title
class Enrollment(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
grade = models.CharField(max_length=2, default='A')
def __str__(self):
return f"{self.student.name} - {self.course.title}"
from django.contrib import admin
from .models import Course, Enrollment
class EnrollmentInline(admin.TabularInline):
model = Enrollment
extra = 1
@admin.register(Course)
class CourseAdmin(admin.ModelAdmin):
inlines = [EnrollmentInline]
Результат выполнения кода:
"На странице курса отображается таблица студентов с их оценками"
Смотрите также
-
атрибут
extra,
который определяет количество пустых форм для добавления -
атрибут
fk_name,
который указывает имя внешнего ключа для связи -
класс
StackedInline,
который отображает связанные модели в виде вертикального стека -
атрибут
inlines,
который подключает встроенные модели к родительской