跳转到主要内容

Django的行内更改列表

项目描述

Django的行内更改列表

概览

Django Admin自带 行内,允许您在父对象的更改表单中显示用于编辑相关对象的表单。虽然技术上可以使用此基础设施显示相关对象的列表,但这很快就会变得很复杂。

这就是 django-changelist-inline 发挥作用的地方。它允许您将标准对象列表作为行内嵌入到父对象的更改表单中。内部,它使用 ModelAdmin 的子类,这意味着您可以像通常那样自定义列表。此外,您还可以在对象列表下方显示链接。

使用示例

假设您有一个包含两个模型 - ThingRelatedThing 的Django项目,并且您想在 Thing 的更改表单中作为行内显示 RelatedThing 对象的列表。以下代码片段提供了一个使用 django-changelist-inline 实现此功能的示例

# -*- coding: utf-8 -*-
from urllib.parse import urlencode

from django.contrib import admin
from django.urls import reverse
from django.utils.safestring import mark_safe
from django_changelist_inline import (
    ChangelistInline,
    ChangelistInlineAdmin,
    ChangelistInlineModelAdmin,
)

from testing.models import RelatedThing, Thing


@admin.register(RelatedThing)
class RelatedThingModelAdmin(admin.ModelAdmin):
    list_display = ('pk', 'name')


class RelatedThingChangelistInline(ChangelistInline):
    model = RelatedThing

    class ChangelistModelAdmin(ChangelistInlineModelAdmin):
        list_display = ('name', 'format_actions')
        list_display_links = None
        list_per_page = 5

        def get_queryset(self, request):
            return RelatedThing.objects.filter(thing=self.parent_instance)

        @mark_safe
        def format_actions(self, obj=None):
            if obj is None:
                return self.empty_value_display

            change_link_url = reverse(
                'admin:{app_label}_{model_name}_change'.format(
                    app_label=RelatedThing._meta.app_label,
                    model_name=RelatedThing._meta.model_name,
                ),
                args=[obj.pk],
            )

            return (
                f'<a class="button" href="{change_link_url}">'
                    'Edit'
                '</a>'
            )
        format_actions.short_description = 'Actions'

        @property
        def title(self):
            return 'Linked Related Things'

        @property
        def no_results_message(self):
            return 'No Related Things?'

        def get_add_url(self, request):
            result = super().get_add_url(request)
            if result is not None:
                return result + '?' + urlencode({
                    'thing': self.parent_instance.pk,
                })

            return result

        def get_show_all_url(self, request):
            result = super().get_show_all_url(request)
            if result is not None:
                return result + '?' + urlencode({
                    'thing': self.parent_instance.pk,
                })

            return result

        def get_toolbar_links(self, request):
            return (
                '<a href="https://www.bthlabs.pl/">'
                    'BTHLabs'
                '</a>'
            )


@admin.register(Thing)
class ThingModelAdmin(ChangelistInlineAdmin):
    inlines = (RelatedThingChangelistInline,)

API

ChangelistInline 对象

ChangelistInline 类是API的核心。它旨在用于 ModelAdmininlines

为了使其正常工作,您需要定义 model 属性并嵌入 ChangelistModelAdmin 类,它应该是 ChangelistInlineModelAdmin 的子类。

ChangelistInlineModelAdmin 对象

ChangelistInlineModelAdmin 是一个定制的 ModelAdmin 子类,它为内联变更列表提供合理的默认值和附加功能。

变更列表清理

此子类覆盖了 ModelAdmin 的以下属性和方法以提供合理的默认值

  • list_editable - 设置为空元组以禁用列表编辑

  • list_filter - 设置为空元组以禁用列表过滤

  • search_fields - 设置为空元组以禁用搜索

  • date_hierarchy - 设置为 None

  • sortable_by - 设置为空元组以禁用排序

  • get_actions() - 返回空列表以禁用操作

附加功能

为了允许自定义并公开附加功能,ChangelistInlineModelAdmin 提供了以下附加方法

  • title 属性 - 默认返回模型的 verbose name

  • no_results_message 属性 - 返回在从数据库中未检索到对象时在表格中显示的文本

  • get_add_url(request) - 如果用户具有添加权限,则返回模型添加表单的 URL。返回 None 以隐藏添加链接

  • get_show_all_url(request) - 如果用户具有查看权限,则返回模型变更列表的 URL。返回 None 以隐藏显示所有链接

  • get_toolbar_links(request) - 默认返回 None。覆盖此方法以返回要在工具栏中渲染的附加 <a/> 元素组成的字符串。模板中的返回值是标记为安全的

ChangelistInlineAdmin 对象

ChangelistInlineAdmin 类是使用内联变更列表的 ModelAdmin 子类的基类

ChangelistInlineAdminMixin

一个混合类,用于在父 ModelAdmin 中正确配置变更列表内联。覆盖 get_inlines(request, obj=None)get_inline_instances(request, obj=None) 方法。

如果您不能使用 ChangelistInlineAdmin 作为基类,则可以使用此混合类启用内联变更列表

@admin.register(Thing)
class ThingModelAdmin(ChangelistInlineAdminMixin, MyBaseModelAdmin):
    ...

作者

django-changelist-inlineTomek Wójcik 开发。

许可

django-changelist-inline 根据 MIT 许可证授权。

项目详细信息


下载文件

下载适合您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

django-changelist-inline-1.0.3.tar.gz (8.5 kB 查看哈希值)

上传时间

构建分布

django_changelist_inline-1.0.3-py3-none-any.whl (7.6 kB 查看哈希值)

上传时间 Python 3

由以下支持