📜  django 嵌套内联 - Python (1)

📅  最后修改于: 2023-12-03 15:14:44.115000             🧑  作者: Mango

Django 嵌套内联

Django 内联 (inline) 功能提供了一种可以在同一个编辑页面中管理一对多关系的方式。内联对象通常用于管理与其所属的主要对象具有层次关系的子对象。

Django 内联又被称为嵌套内联,因为您可以使用内联来管理另一个内联关系。

内联的类型

Django 支持三种内联类型:

  1. TabularInline:内联子对象以表格形式呈现
  2. StackedInline:内联子对象以堆叠块的形式呈现
  3. CollapsibleInline:内联子对象以可折叠块的形式呈现

在下面的例子中,我们将使用 TabularInline 类型的内联对象。

内联实现步骤

为了实现内联功能,您需要完成以下两个步骤:

  1. 确保您的模型和视图实现了正确的关系
  2. 创建内联对象并将其添加到主要对象的管理器中
步骤一:创建相关模型和视图

假设我们有一个 Author 模型和一个 Book 模型。每个作者可以有多本书。我们的目标是创建一个 Author 管理页面,其中每个作者下面列出了他/她所写的所有书籍。

模型代码如下:

class Author(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=50)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

视图代码如下:

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'author')
    list_filter = ('author',)

admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)
步骤二:创建内联对象

我们将创建一个内联对象 BookInline,将其作为 AuthorAdmin 视图的一部分。BookInline 对象将使用 TabularInline 类型。

class BookInline(admin.TabularInline):
    model = Book
    extra = 1

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')
    inlines = [BookInline]

完成后,更新相关代码后,重新运行服务器,访问 Author 管理页面,您现在应该看到每个作者下面列出的所有书籍。

总结

内联提供了一种在单个编辑页面上管理对父对象的多个子对象的方式。 Django 支持三种内联类型:TabularInlineStackedInlineCollapsibleInline

要实现内联功能,您需要创建内联模型并将它们添加到主模型的管理器中。