Атрибут model

Атрибут model класса TabularInline определяет модель, записи которой будут отображаться в виде табличных строк на странице редактирования другой модели. Он является обязательным для любого класса, наследующего TabularInline. Без указания этого атрибута административная панель не сможет определить, с какой моделью работать.

Синтаксис

pythonfrom django.contrib import admin
from .models import ParentModel, ChildModel

class ChildInline(admin.TabularInline):
  model = ChildModel

Пример

Рассмотрим базовый пример использования атрибута model для отображения связанных объектов на странице редактирования родительской модели:

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=100)
  category = models.ForeignKey(Category, on_delete=models.CASCADE)
  price = models.IntegerField()

  def __str__(self):
    return self.name
pythonfrom 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]

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

python"На странице редактирования категории отображается таблица с продуктами этой категории"

Пример

Атрибут model может использоваться в связках с внешними ключами. Если у модели несколько внешних ключей на одну родительскую модель, можно уточнить с помощью атрибута fk_name, но сам model остаётся обязательным:

pythonfrom 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
pythonfrom 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]

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

python"На странице автора отображаются только книги, где он указан как автор, а не соавтор"

Пример

Атрибут model также работает с промежуточными моделями для связей ManyToManyField через параметр through. Это позволяет управлять дополнительными полями в такой связи прямо на странице редактирования:

pythonfrom 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}"
pythonfrom 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]

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

python"На странице курса отображается таблица студентов с их оценками"

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

  • атрибут extra,
    который определяет количество пустых форм для добавления
  • атрибут fk_name,
    который указывает имя внешнего ключа для связи
  • класс StackedInline,
    который отображает связанные модели в виде вертикального стека
  • атрибут inlines,
    который подключает встроенные модели к родительской