РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
622 of 818 menu

Атрибут 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,
    который подключает встроенные модели к родительской
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить