首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自定义选项卡中的Django admin StackedInline

基础概念

Django Admin 是 Django 框架中的一个内置应用,用于提供一个用户友好的界面来管理数据库中的数据。StackedInline 是 Django Admin 中的一个类,用于在同一个页面中嵌入相关模型的编辑表单。

相关优势

  1. 用户体验:StackedInline 允许用户在编辑主模型时,直接在同一页面编辑相关联的模型,提高了操作的便捷性。
  2. 减少页面跳转:避免了频繁的页面跳转,提升了工作效率。
  3. 数据一致性:在编辑主模型和相关模型时,可以保持数据的一致性,减少错误。

类型与应用场景

类型

  • StackedInline:垂直堆叠的表单,适合字段较少的模型。
  • TabularInline:表格形式的表单,适合字段较多且需要展示多个实例的场景。

应用场景

  • 一对多关系:当一个模型有多个相关联的子模型时,使用 StackedInline 可以方便地进行批量编辑。
  • 嵌套表单:需要在编辑主模型时,同时编辑其关联的子模型。

示例代码

假设我们有两个模型 AuthorBook,其中 AuthorBook 是一对多的关系:

代码语言:txt
复制
# models.py
from django.db import models

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

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

admin.py 中配置 StackedInline:

代码语言:txt
复制
# admin.py
from django.contrib import admin
from .models import Author, Book

class BookInline(admin.StackedInline):
    model = Book
    extra = 1  # 默认显示一个额外的空表单

class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline]

admin.site.register(Author, AuthorAdmin)

遇到的问题及解决方法

问题1:StackedInline 表单不显示

原因:可能是由于模型字段未正确导入或配置错误。

解决方法: 确保模型字段正确导入,并且在 StackedInline 中正确指定了模型。

代码语言:txt
复制
from .models import Author, Book

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

问题2:StackedInline 表单过多导致页面加载缓慢

原因:当关联的子模型实例非常多时,页面加载会变慢。

解决方法

  1. 使用 extra 参数控制默认显示的空表单数量。
  2. 考虑使用 TabularInline 替代 StackedInline,因为表格形式更适合展示多个实例。
代码语言:txt
复制
class BookInline(admin.TabularInline):
    model = Book
    extra = 5

问题3:StackedInline 表单中的字段验证失败

原因:可能是由于字段验证规则设置不当或数据不一致。

解决方法

  1. 检查模型字段的验证规则,确保其符合预期。
  2. StackedInline 中添加自定义的验证逻辑。
代码语言:txt
复制
from django.core.exceptions import ValidationError

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

    def clean(self):
        super().clean()
        # 自定义验证逻辑
        for form in self.forms:
            if form.cleaned_data.get('title') == '':
                raise ValidationError("Title cannot be empty.")

通过以上方法,可以有效解决在使用 Django Admin 的 StackedInline 时遇到的常见问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Django快速入门——投票程序(7) 自定义后台

    自定义后台 自定义表单 通过admin.site.register(Question)注册Question模型,Django会创建默认的表单在后台显示。...但有时需要自定义后台的显示,可以通过继承admin.ModelAdmin实现: # polls/admin.py from django.contrib import admin from .models...通过 TabularInline (替代 StackedInline ),关联对象以一种表格式的方式展示,显得更加紧凑。...自定义后台更改列表 现在投票的后台页看起来很不错,让我们对问题列表页面进行一些调整——改成一个能展示系统中所有投票的页面。默认情况下,Django 显示每个对象的 str() 返回的值。...为此,使用 list_display属性,它是一个包含要显示的字段名的元组,在更改列表页中以列的形式展示这个对象: class QuestionAdmin(admin.ModelAdmin):

    24240

    Django学习笔记 1.7 自定义 admin 站点

    1 自定义后台表单 polls/admin.py 通过 admin.site.register(Question) 注册 Question 模型,Django 能够构建一个默认的表单用于展示。...通常来说,你期望能自定义表单的外观和工作方式。你可以在注册模型时将这些设置告诉 Django。...当我们的拥有数十个字段的表单,我们肯定会期望将表单分为几个字段集,这样会更清晰一点: from django.contrib import admin from .models import Question...默认提供 3 个足够的选项字段。” 3 自定义后台更改列表 3.1 显示列表 默认情况下,Django 显示每个对象的 str() 返回的值。但有时如果我们能够显示单个字段,它会更有帮助。...为此,使用 list_display 后台选项,它是一个包含要显示的字段名的元组,在更改列表页中以列的形式展示这个对象: class QuestionAdmin(admin.ModelAdmin):

    99420

    Django后台管理之Admin actions自定义

    通常情况下,admin的工作模式是“选中目标,然后修改目标”,但在同时修改大量目标的时候,这种模式就变得重复、繁琐。 为此,admin提供了自定义功能函数actions的手段,可以批量对数据进行修改。...下面以一个新闻应用的文章模型为例,介绍一个批量更新的自定义actions,它将选择的文章由“草稿”状态更新为“发布”状态: 首先是模型的代码: from django.db import models...当前的HttpRequest对象(即request) 被选择的对象(即QuerySet) 在应用中的admin.py文件中写入: def make_published(modeladmin, request...处理错误: 这其中,如果你能够预知在自定义的操作中可能产生的错误,请处理该错误,并通过django.contrib.admin.ModelAdmin.message_user()以友好的方式给予用户提示信息...中携带别选择的对象作为参数传递过去,然后在这个新的视图中接收这个参数,并编写具体的更加复杂的业务逻辑,如下面的代码所示: from django.contrib import admin from django.contrib.contenttypes.models

    2.2K50

    django 学习笔记一

    也可以放在 setting 中 自定义设置要求 设置名称全部是大写 不要使用一个已经存在的设置 global_setting.py 目录中并没有此文件,此文件路径在 django/conf/global_setting...进入登录界面 ---- 让我们自定义的 APP 出现在界面中 站点注册一个模型,则页面中可直接显示,修改 admin.py from .models import Question admin.site.register...(Question) ---- 自定义管理表单 更改顺序 得来全不费工夫,只需使用admin.site.register(Question)注册Question模型,Django就能构造一个默认的表单表示...通常,你会想要自定义管理界面中表单的外观和功能。 你可以通过在注册对象的时候告知Django一些你想要的选项来完成。 让我们通过对编辑表单上的字段重新排序来看一下它是如何工作的。...# 关联其他模型 # StackedInline 宽松型的 TabularInline 是紧凑型的 class ChoiceInline(admin.StackedInline): model

    1K20

    django 1.8 官方文档翻译: 6-4-2 编写自定义的django-admin命令

    编写自定义的django-admin命令 应用可以通过manage.py注册它们自己的动作。例如,你可能想为你正在发布的Django应用添加一个manage.py动作。...在本页文档中,我们将为教程中的 polls应用构建一个自定义的 closepoll命令。 要做到这点,只需向该应用添加一个management/commands目录。...Django将为该目录中名字没有以下划线开始的每个Python模块注册一个manage.py命令。...如果,出于某些原因,你的自定义的管理命令需要使用一个固定的区域设置,你需要在你的handle()方法中利用I18N支持代码提供的函数手工地启用和停用它: from django.core.management.base...如果你决定在你自定义的命令中修改该选项的值,请确保你知道你正在做什么。

    70420

    自定义 Django 管理界面中的多对多内联模型

    问题背景在 Django 管理界面中,用户可以使用内联模型来管理一对多的关系。但是,当一对多关系是多对多时,Django 提供的默认内联模型可能并不适合。...例如,如果存在一个产品模型和一个发票模型,并且产品和发票之间是多对多的关系,那么在发票的管理界面中,Django 会显示一个表格,其中包含所有产品及其对应的复选框。...具体步骤如下:创建一个新的内联模型类。这个类继承自 admin.TabularInline 或 admin.StackedInline。在新的内联模型类中,重写 get_formset() 方法。...下面是一个示例代码,演示了如何自定义多对多内联模型的显示方式:from django.contrib import adminfrom django.contrib.admin.utils import...return qs.filter(is_deleted=False)# 将自定义的内联模型类添加到 ModelAdmin 类中admin.site.register(Invoice, InvoiceAdmin

    12510

    Django 1.10中文文档-第一个应用Part7-自定义管理站点

    自定义管理表单 通过admin.site.register(Question)注册了Question后,Django可以自动构建一个默认的表单。如果您需要自定义管理表单的外观和功能。...自定义项目模板 在项目的路劲下(包含manage.py的目录)创建一个名为templates目录。Templates可以放在你的文件系统中Django所能访问到的任何地方。...自定义应用模板 聪明的读者可能会问:但是DIRS默认是空的,Django是如何找到默认的admin模板呢?...我们的投票应用不太复杂,因此不需要自定义admin模板。但是如果它变得越来越复杂,因为某些功能而需要修改Django的标准admin模板,那么修改的模板就比修改项目的模板更加明智。...-第一个应用Part6-静态文件 Django 1.10中文文档-第一个应用Part7-自定义管理站点 文档地址

    3.6K60

    Django 自定义后台

    个人学习笔记,参考 django 官方文档:https://docs.djangoproject.com/zh-hans/3.2/ 一、自定义后台   Django 提供了相应的接口供我们自定义 Django...polls这是我们自己写的应用,我们是在admin.py 里注册到后台的,对应的后台配置也在这里。 polls/admin.py # django的接口,默认已经引入。...from django.contrib import admin # 引入我们自己写的数据表(类) from .models import * # 引用默认的API来自定义后台。...(admin.StackedInline): model = Choice extra = 3 class QuestionAdmin(admin.ModelAdmin):...当然,Django 官方文档还对展示页面等等进行了自定义,这块我没继续学习! 三、Simple UI 快速上手   根据 Django 的官方文档,你完全可以自定义后台的各各方面!

    67210

    Django教程 —— 初步完善图书管理系统

    引言 在 Django模型设计 中我们只设计了一个BookInfo模型类,内容好单调,接下来我们初步完善一下BMSTes图书管理系统。...自定义后台管理 模型设计好了,接下来就是在 admin.py 下注册模型了,在注册模型中,我新增了 inlines 、list_per_page 、search_fields属性 inlines: 用于嵌入编辑关联的对象...admin.TabularInline: 嵌入编辑关联的对象的编辑样式为表格式类 admin.StackedInline: 嵌入编辑关联的对象的编辑样式为堆放式类 model: 关联的子对象..., HeroInfo class BookTypeInline(admin.StackedInline): model = BookInfo # 关联的子对象 extra =...建议: 如果关联的模型(表)属性较多,建议使用 堆放式(admin.StackedInline),且不要放置太多,建议1个或者不设置。

    54420

    python测试开发django-19.admin后台自定义显示

    前言 django的admin后台默认显示的内容很少,只显示了表的相关信息,查看字段内容需点开详情才能查看,不是很直观。...在admin.py文件里面是可以自定义相关的展示内容的,也可以添加搜索框,快速的搜索相关内容 优化列表显示 django的表信息列表显示默认值显示了表的相关属性 ?...如果我们想让表里面的字段内容全部显示出来,需在admin.py文件添加list_display 属性,相关代码如下 # admin.py from django.contrib import admin...熟悉,设置搜索的条件,按user_name搜索 from django.contrib import admin from hello import models # Register your models...class ControlUser(admin.ModelAdmin): '''自定义列表中栏目 添加list_display 属性''' # 显示的字段 list_display

    58320
    领券