{"title":"Django 管理站点","version":"6.1","locale":"zh-hans","docname":"ref/contrib/admin/index","url":"/zh-hans/6.1/ref/contrib/admin/","canonical":"https://djangodocs.dev/zh-hans/6.1/ref/contrib/admin/","summary":"Django 最强大的部分之一是自动管理界面。它从你的模型中读取元数据，提供一个快速的、以模型为中心的界面，受信任的用户可以管理你网站上的内容。","html":"<span id=\"the-django-admin-site\"></span><h1>Django 管理站点<a class=\"heading-anchor\" href=\"#module-django.contrib.admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django 最强大的部分之一是自动管理界面。它从你的模型中读取元数据，提供一个快速的、以模型为中心的界面，受信任的用户可以管理你网站上的内容。管理的推荐使用范围仅限于一个组织的内部管理工具。它不打算用于围绕你的整个前端构建。</p>\n<p>管理有很多用于定制的钩子，但要注意不要试图专门使用这些钩子。如果你需要提供一个更以流程为中心的接口，抽象掉数据库表和字段的实现细节，那么可能是时候编写自己的视图了。</p>\n<p>在本文档中，我们将讨论如何激活、使用和定制 Django 的管理界面。</p>\n<section id=\"overview\">\n<h2>概况<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\">startproject</code></a> 使用的默认项目模板中启用了管理。</p>\n<p>如果你没有使用默认的项目模板，这里是要求：</p>\n<ol class=\"arabic simple\">\n<li><p>将 <code class=\"docutils literal notranslate\">'django.contrib.admin'</code> 和它的依赖关系 —— <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a>、<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.contenttypes</code></a>、<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/messages/#module-django.contrib.messages\" title=\"django.contrib.messages: Provides cookie- and session-based temporary message storage.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.messages</code></a> 和 <code class=\"xref py py-mod docutils literal notranslate\">django.contrib.session</code> 添加到你的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 配置中。</p></li>\n<li><p>在你的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\">TEMPLATES</code></a> 配置中设置一个在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-TEMPLATES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\">OPTIONS</code></a> 的 <code class=\"docutils literal notranslate\">'context_processors'</code> 选项中包含 <code class=\"docutils literal notranslate\">django.template.context_processors.request</code>、<code class=\"docutils literal notranslate\">django.contrib.auth.context_processors.auth</code> 和 <code class=\"docutils literal notranslate\">django.contrib.messages.context_processors.messages</code> 的 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/templates/#django.template.backends.django.DjangoTemplates\" title=\"django.template.backends.django.DjangoTemplates\"><code class=\"xref py py-class docutils literal notranslate\">DjangoTemplates</code></a> 后端：</p></li>\n<li><p>如果你自定义了 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> 设置，必须包含 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/middleware/#django.contrib.sessions.middleware.SessionMiddleware\" title=\"django.contrib.sessions.middleware.SessionMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.sessions.middleware.SessionMiddleware</code></a>、<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.auth.middleware.AuthenticationMiddleware</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/middleware/#django.contrib.messages.middleware.MessageMiddleware\" title=\"django.contrib.messages.middleware.MessageMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.messages.middleware.MessageMiddleware</code></a>。</p></li>\n<li><p><a class=\"reference internal\" href=\"#hooking-adminsite-to-urlconf\"><span class=\"std std-ref\">把管理的网址挂到你的 URLconf 里</span></a>。</p></li>\n</ol>\n<p>在你采取了这些步骤之后，你就可以通过访问你挂接的 URL（默认是 <code class=\"docutils literal notranslate\">/admin/</code>）来使用管理站点。</p>\n<p>如果需要创建一个用户来登录，请使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\">createsuperuser</code></a> 命令。默认情况下，登录管理需要用户的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/auth/#django.contrib.auth.models.User.is_staff\" title=\"django.contrib.auth.models.User.is_staff\"><code class=\"xref py py-attr docutils literal notranslate\">is_staff</code></a> 属性设置为 <code class=\"docutils literal notranslate\">True</code>。</p>\n<p>最后，确定你的应用程序的哪些模型应该在管理界面中是可编辑的。对于这些模型中的每一个，按照 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> 中的描述，在管理处注册它们。</p>\n<section id=\"other-topics\">\n<h3>其他主题<a class=\"heading-anchor\" href=\"#other-topics\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/actions/\">管理动作</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/filters/\"><code class=\"docutils literal notranslate\">ModelAdmin</code> 列表过滤器</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/admindocs/\">Django 管理文档生成器</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/javascript/\">管理的 JavaScript 自定义</a></li>\n</ul>\n</div>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">See also</p>\n<p>关于在生产中服务与管理相关的静态文件（图像、JavaScript 和 CSS）的信息，请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/howto/deployment/wsgi/modwsgi/#serving-files\"><span class=\"std std-ref\">提供文件服务</span></a>。</p>\n<p>有问题？ 试试 <a class=\"reference internal\" href=\"/zh-hans/6.1/faq/admin/\"><span class=\"doc\">FAQ：管理</span></a>。</p>\n</aside>\n<aside class=\"admonition-there-are-community-maintained-solutions admonition\" role=\"note\">\n<p class=\"admonition-title\">There are community-maintained solutions!</p>\n<p>Django has a vibrant ecosystem. There are solutions for customizing and\nextending the admin highlighted on the <a class=\"reference external\" href=\"https://www.djangoproject.com/community/ecosystem/#admin\">Community Ecosystem</a> page. The\nDjango Packages <a class=\"reference external\" href=\"https://djangopackages.org/grids/g/admin-interface/\">Admin interface grid</a> has even more options for you!</p>\n</aside>\n</section>\n</section>\n<section id=\"modeladmin-objects\">\n<h2><code class=\"docutils literal notranslate\">ModelAdmin</code> 对象<a class=\"heading-anchor\" href=\"#modeladmin-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ModelAdmin</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">ModelAdmin</code> 类是管理界面中模型的表示。通常，这些都存储在你的应用程序中一个名为 <code class=\"docutils literal notranslate\">admin.py</code> 的文件中。让我们来看看 <code class=\"docutils literal notranslate\">ModelAdmin</code> 的一个例子：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Author<span class=\"p\">,</span> AuthorAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition-do-you-need-a-modeladmin-object-at-all admonition\" role=\"note\">\n<p class=\"admonition-title\">你是否需要一个 <code class=\"docutils literal notranslate\">ModelAdmin</code> 对象？</p>\n<p>在前面的例子中，<code class=\"docutils literal notranslate\">ModelAdmin</code> 类没有定义任何自定义值（还没有）。因此，将提供默认的管理界面。如果你对默认的管理界面满意，你根本不需要定义一个 <code class=\"docutils literal notranslate\">ModelAdmin</code> 对象 —— 你可以不提供 <code class=\"docutils literal notranslate\">ModelAdmin</code> 描述而注册模型类。前面的例子可以简化为：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Author<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</dd></dl>\n\n<section id=\"the-register-decorator\">\n<h3><code class=\"docutils literal notranslate\">register</code> 装饰器<a class=\"heading-anchor\" href=\"#the-register-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.register\">\n<span class=\"sig-name descname\">register</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>models</em>, <em class=\"sig-param\">site<span class=\"o\">=</span><span class=\"default_value\">django.contrib.admin.sites.site</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.register\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>还有一个装饰器用于注册你的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 类：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Author\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span>register<span class=\"p\">(</span>Author<span class=\"p\">)</span>\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>它接受一个或多个模型类，让它在 <code class=\"docutils literal notranslate\">ModelAdmin</code> 注册。如果你使用的是自定义的 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite\" title=\"django.contrib.admin.AdminSite\"><code class=\"xref py py-class docutils literal notranslate\">AdminSite</code></a>，请使用 <code class=\"docutils literal notranslate\">site</code> 关键字参数传递它：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Author<span class=\"p\">,</span> Editor<span class=\"p\">,</span> Reader\n<span class=\"kn\">from</span> <span class=\"nn\">myproject.admin_site</span> <span class=\"kn\">import</span> custom_admin_site\n\n\n<span class=\"nd\">@admin</span><span class=\"o\">.</span>register<span class=\"p\">(</span>Author<span class=\"p\">,</span> Reader<span class=\"p\">,</span> Editor<span class=\"p\">,</span> site<span class=\"o\">=</span>custom_admin_site<span class=\"p\">)</span>\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<p>如果你必须在你的模型管理类的 <code class=\"docutils literal notranslate\">__init__()</code> 方法中引用你的模型管理类，例如 <code class=\"docutils literal notranslate\">super(PersonAdmin, self).__init__(*args, **kwargs)</code>，你就不能使用这个装饰器。你可以使用 <code class=\"docutils literal notranslate\">super().__init__(*args, **kwargs)</code>。</p>\n</dd></dl>\n\n</section>\n<section id=\"discovery-of-admin-files\">\n<h3>发现管理文件<a class=\"heading-anchor\" href=\"#discovery-of-admin-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>当你在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 配置中放入 <code class=\"docutils literal notranslate\">'django.contrib.admin'</code> 时，Django 会自动在每个应用程序中寻找 <code class=\"docutils literal notranslate\">admin</code> 模块并导入它。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.apps.AdminConfig\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">apps.</span><span class=\"sig-name descname\">AdminConfig</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.apps.AdminConfig\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This is the default <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/applications/#django.apps.AppConfig\" title=\"django.apps.AppConfig\"><code class=\"xref py py-class docutils literal notranslate\">AppConfig</code></a> class for the admin.\nIt calls <a class=\"reference internal\" href=\"#django.contrib.admin.autodiscover\" title=\"django.contrib.admin.autodiscover\"><code class=\"xref py py-func docutils literal notranslate\">autodiscover()</code></a> when Django starts.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.apps.SimpleAdminConfig\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">apps.</span><span class=\"sig-name descname\">SimpleAdminConfig</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.apps.SimpleAdminConfig\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This class works like <a class=\"reference internal\" href=\"#django.contrib.admin.apps.AdminConfig\" title=\"django.contrib.admin.apps.AdminConfig\"><code class=\"xref py py-class docutils literal notranslate\">AdminConfig</code></a>,\nexcept it doesn't call <a class=\"reference internal\" href=\"#django.contrib.admin.autodiscover\" title=\"django.contrib.admin.autodiscover\"><code class=\"xref py py-func docutils literal notranslate\">autodiscover()</code></a>.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.apps.SimpleAdminConfig.default_site\">\n<span class=\"sig-name descname\">default_site</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.apps.SimpleAdminConfig.default_site\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个点分隔的导入路径，用于导入默认的管理站点类，或者导入一个返回站点实例的可调用类。默认为 <code class=\"docutils literal notranslate\">'django.contrib.admin.sites.AdminSite'</code>。使用方法参见 <a class=\"reference internal\" href=\"#overriding-default-admin-site\"><span class=\"std std-ref\">覆盖默认的管理站点</span></a>。</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.autodiscover\">\n<span class=\"sig-name descname\">autodiscover</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.autodiscover\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>该函数试图在每个已安装的应用程序中导入一个 <code class=\"docutils literal notranslate\">admin</code> 模块。这些模块将向管理注册模型。</p>\n<p>通常情况下，你不需要直接调用这个函数，因为 <a class=\"reference internal\" href=\"#django.contrib.admin.apps.AdminConfig\" title=\"django.contrib.admin.apps.AdminConfig\"><code class=\"xref py py-class docutils literal notranslate\">AdminConfig</code></a> 会在 Django 启动时调用它。</p>\n</dd></dl>\n\n<p>如果你使用的是自定义的 <code class=\"docutils literal notranslate\">AdminSite</code>，通常会将所有的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 子类导入到你的代码中，并将它们注册到自定义的 <code class=\"docutils literal notranslate\">AdminSite</code>。在这种情况下，为了禁止自动发现，你应该在你的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 配置中加入 <code class=\"docutils literal notranslate\">'django.contrib.admin.apps.SimpleAdminConfig'</code> 而不是 <code class=\"docutils literal notranslate\">'django.contrib.admin'</code>。</p>\n</section>\n<section id=\"modeladmin-options\">\n<h3><code class=\"docutils literal notranslate\">ModelAdmin</code> 选项<a class=\"heading-anchor\" href=\"#modeladmin-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">ModelAdmin</code> 非常灵活。它有几个选项用于处理自定义界面。所有选项都在 <code class=\"docutils literal notranslate\">ModelAdmin</code> 子类中定义：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    date_hierarchy <span class=\"o\">=</span> <span class=\"s2\">&quot;pub_date&quot;</span>\n</code></pre></div>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.actions\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">actions</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.actions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>要在变更列表页上提供的动作列表。详见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/actions/\"><span class=\"doc\">管理动作</span></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.actions_on_top\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">actions_on_top</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.actions_on_top\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.actions_on_bottom\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">actions_on_bottom</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.actions_on_bottom\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Controls where on the admin changelist page the actions bar appears. By\ndefault, the admin changelist displays actions at the top of the page\n(<code class=\"docutils literal notranslate\">actions_on_top = True; actions_on_bottom = False</code>).</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.actions_selection_counter\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">actions_selection_counter</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.actions_selection_counter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>控制是否在动作下拉菜单旁边显示选择计数器。默认情况下，管理员变更列表会显示它（<code class=\"docutils literal notranslate\">actions_selection_counter = True</code>）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.date_hierarchy\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">date_hierarchy</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.date_hierarchy\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>将 <code class=\"docutils literal notranslate\">date_hierarchy</code> 设置为你的模型中 <code class=\"docutils literal notranslate\">DateField</code> 或 <code class=\"docutils literal notranslate\">DateTimeField</code> 的名称，变化列表页将包括一个基于日期的向下扩展。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>date_hierarchy <span class=\"o\">=</span> <span class=\"s2\">&quot;pub_date&quot;</span>\n</code></pre></div>\n<p>你也可以使用 <code class=\"docutils literal notranslate\">__</code> 查找来指定相关模型上的字段，例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>date_hierarchy <span class=\"o\">=</span> <span class=\"s2\">&quot;author__pub_date&quot;</span>\n</code></pre></div>\n<p>这将根据可用的数据智能地填充自己，例如，如果所有的日期都在一个月内，它将只显示日级的向下扩展。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\">date_hierarchy</code> 内部使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.datetimes\" title=\"django.db.models.query.QuerySet.datetimes\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.datetimes()</code></a>。当启用时区支持时，请参考它的文档中的一些注意事项（<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ = True</code></a>）。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.empty_value_display\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">empty_value_display</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.empty_value_display\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>该属性覆盖记录字段为空（<code class=\"docutils literal notranslate\">None</code>、空字符串等）的默认显示值。默认值是 <code class=\"docutils literal notranslate\">-</code> （破折号）。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    empty_value_display <span class=\"o\">=</span> <span class=\"s2\">&quot;-empty-&quot;</span>\n</code></pre></div>\n<p>你也可以用 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.empty_value_display\" title=\"django.contrib.admin.AdminSite.empty_value_display\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.empty_value_display</code></a> 覆盖所有管理页面的 <code class=\"docutils literal notranslate\">empty_value_display</code>，或者像这样覆盖特定字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;view_birth_date&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>empty_value<span class=\"o\">=</span><span class=\"s2\">&quot;???&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">view_birth_date</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        <span class=\"k\">return</span> obj<span class=\"o\">.</span>birth_date\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.exclude\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">exclude</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.exclude\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果给定了这个属性，那么这个属性应该是一个要从表单中排除的字段名列表。</p>\n<p>例如，我们考虑以下模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n    birth_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">(</span>blank<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你想让 <code class=\"docutils literal notranslate\">Author</code> 模型的表格只包括 <code class=\"docutils literal notranslate\">name</code> 和 <code class=\"docutils literal notranslate\">title</code> 字段，你可以指定 <code class=\"docutils literal notranslate\">fields</code> 或 <code class=\"docutils literal notranslate\">exclude</code> ，如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    exclude <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>由于 Author 模型只有三个字段，即 <code class=\"docutils literal notranslate\">name</code>、<code class=\"docutils literal notranslate\">title</code> 和 <code class=\"docutils literal notranslate\">birth_date</code>，因此上述声明所产生的表单将包含完全相同的字段。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用 <code class=\"docutils literal notranslate\">fields</code> 选项在 “添加” 和 “更改” 页面的表单中进行简单的布局修改，比如只显示可用字段的子集，修改它们的顺序，或者将它们分成几行。例如，你可以为 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/flatpages/#django.contrib.flatpages.models.FlatPage\" title=\"django.contrib.flatpages.models.FlatPage\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.flatpages.models.FlatPage</code></a> 模型定义一个更简单的管理表单版本，如下所示：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">FlatPageAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;url&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>在上面的例子中，只有 <code class=\"docutils literal notranslate\">url</code>、<code class=\"docutils literal notranslate\">title</code> 和 <code class=\"docutils literal notranslate\">content</code> 等字段会依次显示。<code class=\"docutils literal notranslate\">fields</code> 可以包含 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.readonly_fields</code></a> 中定义的值，以只读方式显示。</p>\n<p>对于更复杂的布局需求，请参阅 <code class=\"xref py py-attr docutils literal notranslate\">fieldets</code> 选项。</p>\n<p><code class=\"docutils literal notranslate\">fields</code> 选项接受与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">list_display</code></a> 相同类型的值，但不接受可调用对象和用于相关字段的 <code class=\"docutils literal notranslate\">__</code> 查找。模型和模型管理方法的名称只有在 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">readonly_fields</code></a> 中列出时才会被使用。</p>\n<p>要在同一行显示多个字段，将这些字段包在自己的元组中。在这个例子中，<code class=\"docutils literal notranslate\">url</code> 和 <code class=\"docutils literal notranslate\">title</code> 字段将显示在同一行，<code class=\"docutils literal notranslate\">content</code> 字段将显示在它们下面的一行：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">FlatPageAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    fields <span class=\"o\">=</span> <span class=\"p\">[(</span><span class=\"s2\">&quot;url&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition-possible-confusion-with-the-modeladmin-fieldsets-option admonition\" role=\"note\">\n<p class=\"admonition-title\">可能会与 <code class=\"docutils literal notranslate\">ModelAdmin.fieldsets</code> 选项混淆</p>\n<p>这个 <code class=\"docutils literal notranslate\">fields</code> 选项不应与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\">fieldsets</code></a> 选项中的 <code class=\"docutils literal notranslate\">fields</code> 字典键混淆，下一节将介绍。</p>\n</aside>\n<p>如果未设置 <code class=\"docutils literal notranslate\">fields</code> 或 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\">fieldsets</code></a> 选项，Django 将默认在单个字段集中显示每个非 <code class=\"docutils literal notranslate\">AutoField</code> 且具有 <code class=\"docutils literal notranslate\">editable=True</code> 的字段，其顺序与模型中的字段定义顺序一致，其后会显示 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">readonly_fields</code></a> 中定义的任何字段。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.fieldsets\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">fieldsets</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.fieldsets\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">fieldsets</code> 来控制管理员 “添加” 和 “更改” 页面的布局。</p>\n<p><code class=\"docutils literal notranslate\">fieldsets</code> 是一个包含多个二元元组的列表，每个二元元组表示管理表单页面上的一个 <code class=\"docutils literal notranslate\">&lt;fieldset&gt;</code> （<code class=\"docutils literal notranslate\">&lt;fieldset&gt;</code> 是表单的一个 &quot;section&quot;）。</p>\n<p>这些二元元组的格式是 <code class=\"docutils literal notranslate\">(name, field_options)</code>，其中 <code class=\"docutils literal notranslate\">name</code> 是表示 fieldset 标题的字符串，而 <code class=\"docutils literal notranslate\">field_options</code> 是关于 fieldset 的信息的字典，包括要在其中显示的字段列表。</p>\n<p>一个完整的例子，取自 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/flatpages/#django.contrib.flatpages.models.FlatPage\" title=\"django.contrib.flatpages.models.FlatPage\"><code class=\"xref py py-class docutils literal notranslate\">django.contrib.flatpages.models.FlatPage</code></a> 模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">FlatPageAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    fieldsets <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span>\n            <span class=\"kc\">None</span><span class=\"p\">,</span>\n            <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;url&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;sites&quot;</span><span class=\"p\">],</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">),</span>\n        <span class=\"p\">(</span>\n            <span class=\"s2\">&quot;Advanced options&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;collapse&quot;</span><span class=\"p\">],</span>\n                <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;registration_required&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;template_name&quot;</span><span class=\"p\">],</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>这样一来，管理页面就变成了这样：</p>\n<img alt=\"/zh-hans/6.1/_images/fieldsets.png\" src=\"/zh-hans/6.1/_images/fieldsets.png\" />\n<p>如果 <code class=\"docutils literal notranslate\">fieldsets</code> 或 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> 选项都不存在，Django 将默认在一个单一的表单集中显示每个非 <code class=\"docutils literal notranslate\">AutoField</code> 且有 <code class=\"docutils literal notranslate\">editable=True</code> 的字段，顺序与模型中定义的字段相同。</p>\n<p><code class=\"docutils literal notranslate\">field_options</code> 字典可以有以下键：</p>\n<ul>\n<li><dl>\n<dt><code class=\"docutils literal notranslate\">fields</code></dt><dd><p>要在此字段集中显示的字段名称的列表或元组。这个键是必需的。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span>\n    <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;address&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;city&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;state&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> 选项一样，要在同一行显示多个字段，请将这些字段封装在自己的元组中。在这个例子中，<code class=\"docutils literal notranslate\">first_name</code> 和 <code class=\"docutils literal notranslate\">last_name</code> 字段将显示在同一行：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span>\n    <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[(</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;address&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;city&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;state&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">fields</code> 可以包含 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">readonly_fields</code></a> 中定义的值，以只读方式显示。</p>\n<p>如果你将可调用的名称添加到 <code class=\"docutils literal notranslate\">fields</code> 中，与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> 选项的规则相同：可调用的名称必须列在 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">readonly_fields</code></a> 中。</p>\n</dd>\n</dl>\n</li>\n<li><dl>\n<dt><code class=\"docutils literal notranslate\">classes</code></dt><dd><p>A list or tuple containing extra CSS classes to apply to the fieldset.\nThis can include any custom CSS class defined in the project, as well\nas the CSS class provided by Django: <code class=\"docutils literal notranslate\">collapse</code>.</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span>\n    <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;collapse&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Fieldsets with a name and the <code class=\"docutils literal notranslate\">collapse</code> style will be initially\ncollapsed, using an expandable widget with a toggle for switching\ntheir visibility.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The <code class=\"docutils literal notranslate\">wide</code> class has been removed, as it was made obsolete by the\nnew admin layout.</p>\n</aside>\n</dd>\n</dl>\n</li>\n<li><dl>\n<dt><code class=\"docutils literal notranslate\">description</code></dt><dd><p>一个可选的额外文本字符串，显示在每个 fieldset 的顶部，位于 fieldset 标题下方。</p>\n<p>请注意，当这个值在管理界面显示时，它不是 <em>HTML 转义后的</em>。如果你愿意的话，这可以让你包含 HTML。或者你可以使用纯文本和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/utils/#django.utils.html.escape\" title=\"django.utils.html.escape\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.html.escape()</code></a> 来转义任何 HTML 特殊字符。</p>\n</dd>\n</dl>\n</li>\n</ul>\n<aside class=\"admonition-class-django-contrib-admin-tabularinline-has-limited-support-for-fieldsets admonition\" role=\"note\">\n<p class=\"admonition-title\"><a class=\"reference internal\" href=\"#django.contrib.admin.TabularInline\" title=\"django.contrib.admin.TabularInline\"><code class=\"xref py py-class docutils literal notranslate\">TabularInline</code></a> 对 <code class=\"docutils literal notranslate\">fieldsets</code> 的支持有限。</p>\n<p>在 <a class=\"reference internal\" href=\"#django.contrib.admin.TabularInline\" title=\"django.contrib.admin.TabularInline\"><code class=\"xref py py-class docutils literal notranslate\">TabularInline</code></a> 中使用 <code class=\"docutils literal notranslate\">fieldsets</code> 功能有限。你可以通过在 <code class=\"docutils literal notranslate\">field_options</code> 字典中定义 <code class=\"docutils literal notranslate\">fields</code> 来指定哪些字段将显示以及它们在 <code class=\"docutils literal notranslate\">TabularInline</code> 布局中的顺序。</p>\n<p>所有其他功能均不支持。这包括使用 <code class=\"docutils literal notranslate\">name</code> 来定义一组字段的标题。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.filter_horizontal\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">filter_horizontal</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.filter_horizontal\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，在管理网站中显示一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> 是 <code class=\"docutils literal notranslate\">&lt;select multiple&gt;</code>。但是，多选框在选择很多项目时，会很难用。在这个列表中添加一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>，就可以改用一个不显眼的 JavaScript “过滤器” 界面，在选项中进行搜索。未选择和选择的选项并排出现在两个框中。参见 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.filter_vertical\" title=\"django.contrib.admin.ModelAdmin.filter_vertical\"><code class=\"xref py py-attr docutils literal notranslate\">filter_vertical</code></a> 来使用垂直界面。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.filter_vertical\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">filter_vertical</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.filter_vertical\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.filter_horizontal\" title=\"django.contrib.admin.ModelAdmin.filter_horizontal\"><code class=\"xref py py-attr docutils literal notranslate\">filter_horizontal</code></a> 相同，但使用垂直显示过滤界面，未选择的选项框出现在选择选项框的上方。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.form\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">form</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，会为你的模型动态创建一个 <code class=\"docutils literal notranslate\">ModelForm</code>。它用于创建在添加／更改页面上显示的表单。你可以很容易地提供你自己的 <code class=\"docutils literal notranslate\">ModelForm</code> 来覆盖添加／更改页面上的任何默认表单行为。另外，你可以使用 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_form\" title=\"django.contrib.admin.ModelAdmin.get_form\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.get_form()</code></a> 方法来定制默认的表单，而不是指定一个全新的表单。</p>\n<p>示例请参见 <a class=\"reference internal\" href=\"#admin-custom-validation\"><span class=\"std std-ref\">在管理中添加自定义验证</span></a> 一节。</p>\n<aside class=\"admonition-omit-the-meta-model-attribute admonition\" role=\"note\">\n<p class=\"admonition-title\">省略 <code class=\"docutils literal notranslate\">Meta.model</code> 属性</p>\n<p>如果你在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> 上定义了 <code class=\"docutils literal notranslate\">Meta.model</code> 属性，你也必须定义 <code class=\"docutils literal notranslate\">Meta.fields</code> 属性（或 <code class=\"docutils literal notranslate\">Meta.exclude</code> 属性）。但是，由于管理有自己定义字段的方式，所以 <code class=\"docutils literal notranslate\">Meta.field</code> 属性将被忽略。</p>\n<p>如果 <code class=\"docutils literal notranslate\">ModelForm</code> 只用于管理，最简单的解决办法是省略 <code class=\"docutils literal notranslate\">Meta.model</code> 属性，因为 <code class=\"docutils literal notranslate\">ModelAdmin</code> 将提供正确的模型。或者，你可以在 <code class=\"docutils literal notranslate\">Meta</code> 类中设置 <code class=\"docutils literal notranslate\">fields = []</code> 以满足 <code class=\"docutils literal notranslate\">ModelForm</code> 的验证。</p>\n</aside>\n<aside class=\"admonition-modeladmin-exclude-takes-precedence admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">ModelAdmin.exclude</code> 优先级较高</p>\n<p>如果你的 <code class=\"docutils literal notranslate\">ModelForm</code> 和 <code class=\"docutils literal notranslate\">ModelAdmin</code> 都定义了 <code class=\"docutils literal notranslate\">exclude</code> 选项，那么 <code class=\"docutils literal notranslate\">ModelAdmin</code> 优先：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Person\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        model <span class=\"o\">=</span> Person\n        exclude <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    exclude <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;age&quot;</span><span class=\"p\">]</span>\n    form <span class=\"o\">=</span> PersonForm\n</code></pre></div>\n<p>在上面的例子中，“年龄” 字段将被排除，但 “姓名” 字段将被包含在生成的表单中。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.formfield_overrides\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">formfield_overrides</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.formfield_overrides\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这提供了一个快速而简单的方法来覆盖一些 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> 选项，以便在管理中使用。<code class=\"docutils literal notranslate\">formfield_overrides</code> 是一个字典，它将字段类映射成一个参数的字典，以便在构造时传递给字段。</p>\n<p>由于这有点抽象，我们来看一个具体的例子。<code class=\"docutils literal notranslate\">formfield_overrides</code> 最常见的用法是为某一类型的字段添加一个自定义部件。所以，想象一下，我们写了一个 <code class=\"docutils literal notranslate\">RichTextEditorWidget</code>，我们想用于大文本字段，而不是默认的 <code class=\"docutils literal notranslate\">&lt;textarea&gt;</code>。下面是我们要做的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"c1\"># Import our custom widget and our model from where they&#39;re defined</span>\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> MyModel\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.widgets</span> <span class=\"kn\">import</span> RichTextEditorWidget\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    formfield_overrides <span class=\"o\">=</span> <span class=\"p\">{</span>\n        models<span class=\"o\">.</span>TextField<span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;widget&quot;</span><span class=\"p\">:</span> RichTextEditorWidget<span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n</code></pre></div>\n<p>注意，字典中的键是实际的字段类，<em>不是</em> 字符串。值是另一个字典；这些参数将被传递给表单字段的 <code class=\"docutils literal notranslate\">__init__()</code> 方法。详见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/api/\"><span class=\"doc\">表单 API</span></a>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>如果你想使用一个带有关系字段的自定义部件（例如 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a>），确保你没有在 <code class=\"docutils literal notranslate\">raw_id_fields</code>、<code class=\"docutils literal notranslate\">radio_fields</code> 或 <code class=\"docutils literal notranslate\">autocomplete_fields</code> 中包含该字段的名称。</p>\n<p><code class=\"docutils literal notranslate\">formfield_overrides</code> 不会让你改变有 <code class=\"docutils literal notranslate\">raw_id_fields</code>、<code class=\"docutils literal notranslate\">radio_fields</code> 或 <code class=\"docutils literal notranslate\">autocomplete_fields</code> 设置的关系字段上的部件。这是因为 <code class=\"docutils literal notranslate\">raw_id_fields</code>、<code class=\"docutils literal notranslate\">radio_fields</code> 和 <code class=\"docutils literal notranslate\">autocomplete_fields</code> 意味着自己的自定义部件。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.inlines\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">inlines</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.inlines\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>参见下面的 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a> 对象以及 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_formsets_with_inlines\" title=\"django.contrib.admin.ModelAdmin.get_formsets_with_inlines\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.get_formsets_with_inlines()</code></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.list_display\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">list_display</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.list_display\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">list_display</code> 来控制哪些字段显示在管理的变更列表页面。</p>\n<p>举例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>如果你不设置 <code class=\"docutils literal notranslate\">list_display</code>，管理网站将显示一个单列，显示每个对象的 <code class=\"docutils literal notranslate\">__str__()</code> 表示。</p>\n<p><code class=\"docutils literal notranslate\">list_display</code> 中可以使用五种类型的值。除了最简单的类型外，其他类型都可以使用 <a class=\"reference internal\" href=\"#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> 装饰器，该装饰器用于自定义字段的显示方式：</p>\n<ul>\n<li><p>模型字段的名称。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>相关字段的名称，使用 <code class=\"docutils literal notranslate\">__</code> 符号。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;city__name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>一个接受一个参数的可调用对象，即模型实例。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>description<span class=\"o\">=</span><span class=\"s2\">&quot;Name&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">upper_case_name</span><span class=\"p\">(</span>obj<span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span>obj<span class=\"o\">.</span>first_name<span class=\"si\">}</span><span class=\"s2\"> </span><span class=\"si\">{</span>obj<span class=\"o\">.</span>last_name<span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span>upper<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span>upper_case_name<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>表示 <code class=\"docutils literal notranslate\">ModelAdmin</code> 方法的字符串，该方法接受一个参数，即模型实例。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;upper_case_name&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>description<span class=\"o\">=</span><span class=\"s2\">&quot;Name&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">upper_case_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span>obj<span class=\"o\">.</span>first_name<span class=\"si\">}</span><span class=\"s2\"> </span><span class=\"si\">{</span>obj<span class=\"o\">.</span>last_name<span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"o\">.</span>upper<span class=\"p\">()</span>\n</code></pre></div>\n</li>\n<li><p>代表模型属性或方法的字符串（没有任何必要的参数）。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    birthday <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>description<span class=\"o\">=</span><span class=\"s2\">&quot;Birth decade&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">decade_born_in</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        decade <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>birthday<span class=\"o\">.</span>year <span class=\"o\">//</span> <span class=\"mi\">10</span> <span class=\"o\">*</span> <span class=\"mi\">10</span>\n        <span class=\"k\">return</span> <span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span>decade<span class=\"si\">}</span><span class=\"s2\">’s&quot;</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;decade_born_in&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</li>\n</ul>\n<p>关于 <code class=\"docutils literal notranslate\">list_display</code> 要注意的几个特殊情况：</p>\n<ul>\n<li><p>如果字段是 <code class=\"docutils literal notranslate\">ForeignKey</code>，Django 会显示相关对象的 <code class=\"docutils literal notranslate\">__str__()</code>。</p></li>\n<li><p><code class=\"docutils literal notranslate\">ManyToManyField</code> 字段不被支持，因为这需要为表中的每一行单独执行一条 SQL 语句。如果你还是想这样做，请给你的模型一个自定义方法，并将该方法的名称添加到 <code class=\"docutils literal notranslate\">list_display</code> 中。（更多关于 <code class=\"docutils literal notranslate\">list_display</code> 中的自定义方法，请参见下文）。</p></li>\n<li><p>如果字段是 <code class=\"docutils literal notranslate\">BooleanField</code>，Django 会显示一个漂亮的 “是”、“否” 或 “未知” 图标，而不是 <code class=\"docutils literal notranslate\">True</code>、<code class=\"docutils literal notranslate\">False</code> 或 <code class=\"docutils literal notranslate\">None</code>。</p></li>\n<li><p>如果给定的字符串是模型的一个方法，<code class=\"docutils literal notranslate\">ModelAdmin</code> 或者是一个可调用的方法，Django 默认会对输出进行 HTML 转义。如果要转义用户的输入，并允许你自己使用未转义的标签，可以使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/utils/#django.utils.html.format_html\" title=\"django.utils.html.format_html\"><code class=\"xref py py-func docutils literal notranslate\">format_html()</code></a>。</p>\n<p>下面是一个完整的示例模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.html</span> <span class=\"kn\">import</span> format_html\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    color_code <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display\n    <span class=\"k\">def</span> <span class=\"nf\">colored_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> format_html<span class=\"p\">(</span>\n            <span class=\"s1\">&#39;&lt;span style=&quot;color: #</span><span class=\"si\">{}</span><span class=\"s1\">;&quot;&gt;</span><span class=\"si\">{}</span><span class=\"s1\"> </span><span class=\"si\">{}</span><span class=\"s1\">&lt;/span&gt;&#39;</span><span class=\"p\">,</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>color_code<span class=\"p\">,</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>first_name<span class=\"p\">,</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>last_name<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;colored_name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>正如一些例子已经证明的那样，当使用一个可调用对象、一个模型方法或一个 <code class=\"docutils literal notranslate\">ModelAdmin</code> 方法时，你可以通过用 <a class=\"reference internal\" href=\"#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> 装饰器包装可调用对象，并传递 <code class=\"docutils literal notranslate\">description</code> 参数来自定义列的标题。</p></li>\n<li><p>如果一个字段的值是 <code class=\"docutils literal notranslate\">None</code>，一个空字符串，或者一个没有元素的可迭代字段，Django 将显示 <code class=\"docutils literal notranslate\">-</code> （破折号）。你可以用 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.empty_value_display\" title=\"django.contrib.admin.AdminSite.empty_value_display\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.empty_value_display</code></a> 来覆盖这一点：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>empty_value_display <span class=\"o\">=</span> <span class=\"s2\">&quot;(None)&quot;</span>\n</code></pre></div>\n<p>你也可以使用 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.empty_value_display\" title=\"django.contrib.admin.ModelAdmin.empty_value_display\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.empty_value_display</code></a> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    empty_value_display <span class=\"o\">=</span> <span class=\"s2\">&quot;unknown&quot;</span>\n</code></pre></div>\n<p>或在字段级别：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birth_date_view&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>empty_value<span class=\"o\">=</span><span class=\"s2\">&quot;unknown&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">birth_date_view</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        <span class=\"k\">return</span> obj<span class=\"o\">.</span>birth_date\n</code></pre></div>\n</li>\n<li><p>如果给定的字符串是模型的一个方法，<code class=\"docutils literal notranslate\">ModelAdmin</code> 或一个返回 <code class=\"docutils literal notranslate\">True</code>、<code class=\"docutils literal notranslate\">False</code> 或 <code class=\"docutils literal notranslate\">None</code> 的可调用对象，如果你用 <a class=\"reference internal\" href=\"#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> 装饰器包装该方法，传递 <code class=\"docutils literal notranslate\">boolean</code> 参数，并将其值设置为 <code class=\"docutils literal notranslate\">True</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    birthday <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>boolean<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">born_in_fifties</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"mi\">1950</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>birthday<span class=\"o\">.</span>year <span class=\"o\">&lt;</span> <span class=\"mi\">1960</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;born_in_fifties&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">__str__()</code> 方法在 <code class=\"docutils literal notranslate\">list_display</code> 中和其他模型方法一样有效，所以完全可以这样做：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;__str__&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;some_other_field&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>通常情况下，<code class=\"docutils literal notranslate\">list_display</code> 的元素如果不是实际的数据库字段，就不能用于排序（因为 Django 在数据库层面进行了所有的排序）。</p>\n<p>但是，如果 <code class=\"docutils literal notranslate\">list_display</code> 的元素代表某个数据库字段，你可以通过在方法上使用 <a class=\"reference internal\" href=\"#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> 装饰器，传递 <code class=\"docutils literal notranslate\">ordering</code> 参数来表明这个事实：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.html</span> <span class=\"kn\">import</span> format_html\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    color_code <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>ordering<span class=\"o\">=</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">colored_first_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> format_html<span class=\"p\">(</span>\n            <span class=\"s1\">&#39;&lt;span style=&quot;color: #</span><span class=\"si\">{}</span><span class=\"s1\">;&quot;&gt;</span><span class=\"si\">{}</span><span class=\"s1\">&lt;/span&gt;&#39;</span><span class=\"p\">,</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>color_code<span class=\"p\">,</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>first_name<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;colored_first_name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>上面会告诉 Django 在管理中按 <code class=\"docutils literal notranslate\">colored_first_name</code> 排序时，按 <code class=\"docutils literal notranslate\">first_name</code> 字段排序。</p>\n<p>要用 <code class=\"docutils literal notranslate\">ordering</code> 参数表示降序，可以在字段名上使用连字符前缀。使用上面的例子，它看起来像：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>ordering<span class=\"o\">=</span><span class=\"s2\">&quot;-first_name&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">colored_first_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">ordering</code> 参数支持查询查找，在相关模型上按值排序。这个例子在列表显示中包含了一个 “作者的姓” 列，并允许按姓排序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Blog</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">)</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Person<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">BlogAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;author_first_name&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>ordering<span class=\"o\">=</span><span class=\"s2\">&quot;author__first_name&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">author_first_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        <span class=\"k\">return</span> obj<span class=\"o\">.</span>author<span class=\"o\">.</span>first_name\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/\"><span class=\"doc\">查询表达式</span></a> 可与 <code class=\"docutils literal notranslate\">ordering</code> 参数一起使用：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Value\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models.functions</span> <span class=\"kn\">import</span> Concat\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>ordering<span class=\"o\">=</span>Concat<span class=\"p\">(</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> Value<span class=\"p\">(</span><span class=\"s2\">&quot; &quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">def</span> <span class=\"nf\">full_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>first_name <span class=\"o\">+</span> <span class=\"s2\">&quot; &quot;</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span>last_name\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">list_display</code> 的元素也可以是属性：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    first_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    last_name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n\n    <span class=\"nd\">@property</span>\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>\n        ordering<span class=\"o\">=</span><span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">,</span>\n        description<span class=\"o\">=</span><span class=\"s2\">&quot;Full name of the person&quot;</span><span class=\"p\">,</span>\n        boolean<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">full_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>first_name <span class=\"o\">+</span> <span class=\"s2\">&quot; &quot;</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span>last_name\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;full_name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>注意 <code class=\"docutils literal notranslate\">&#64;property</code> 必须在 <code class=\"docutils literal notranslate\">&#64;display</code> 之上。如果你使用老方法 —— 直接设置与 display 相关的属性，而不是使用 <a class=\"reference internal\" href=\"#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> 装饰器 —— 请注意，必须使用 <code class=\"docutils literal notranslate\">property()</code> 函数，而 <strong>不是</strong> <code class=\"docutils literal notranslate\">&#64;property</code> 装饰器：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_property</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>first_name <span class=\"o\">+</span> <span class=\"s2\">&quot; &quot;</span> <span class=\"o\">+</span> <span class=\"bp\">self</span><span class=\"o\">.</span>last_name\n\n\nmy_property<span class=\"o\">.</span>short_description <span class=\"o\">=</span> <span class=\"s2\">&quot;Full name of the person&quot;</span>\nmy_property<span class=\"o\">.</span>admin_order_field <span class=\"o\">=</span> <span class=\"s2\">&quot;last_name&quot;</span>\nmy_property<span class=\"o\">.</span>boolean <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\nfull_name <span class=\"o\">=</span> <span class=\"nb\">property</span><span class=\"p\">(</span>my_property<span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p><code class=\"docutils literal notranslate\">list_display</code> 中的字段名也会以 CSS 类的形式出现在 HTML 输出中，在每个 <code class=\"docutils literal notranslate\">&lt;th&gt;</code> 元素上以 <code class=\"docutils literal notranslate\">column-&lt;field_name&gt;</code> 的形式出现。例如，这可以用来在 CSS 文件中设置列宽。</p></li>\n<li><p>Django 会尝试按照这个顺序解释 <code class=\"docutils literal notranslate\">list_display</code> 的每个元素：</p>\n<ul class=\"simple\">\n<li><p>模型中的字段或相关字段中的字段。</p></li>\n<li><p>一个可调用对象。</p></li>\n<li><p>一个代表 <code class=\"docutils literal notranslate\">ModelAdmin</code> 属性的字符串。</p></li>\n<li><p>一个代表模型属性的字符串。</p></li>\n</ul>\n<p>例如，如果你有 <code class=\"docutils literal notranslate\">first_name</code> 作为一个模型字段和 <code class=\"docutils literal notranslate\">ModelAdmin</code> 属性，将使用模型字段。</p>\n</li>\n</ul>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.list_display_links\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">list_display_links</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.list_display_links\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>使用 <code class=\"docutils literal notranslate\">list_display_links</code> 来控制 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">list_display</code></a> 中的字段是否以及哪些字段应该被链接到对象的 “更改” 页面。</p>\n<p>默认情况下，更改列表页将把第一列 —— <code class=\"docutils literal notranslate\">list_display</code> 中指定的第一个字段 —— 链接到每个项目的更改页面。但是 <code class=\"docutils literal notranslate\">list_display_links</code> 让你改变这一点：</p>\n<ul>\n<li><p>将其设置为 <code class=\"docutils literal notranslate\">None</code>，则完全没有链接。</p></li>\n<li><p>将它设置为一个列表或元组字段（格式与 <code class=\"docutils literal notranslate\">list_display</code> 相同），你希望将其列转换为链接。</p>\n<p>你可以指定一个或多个字段。只要字段出现在 <code class=\"docutils literal notranslate\">list_display</code> 中，Django 就不会关心链接了多少（或多少）字段。唯一的要求是，如果你想以这种方式使用 <code class=\"docutils literal notranslate\">list_display_links</code>，你必须定义 <code class=\"docutils literal notranslate\">list_display</code>。</p>\n</li>\n</ul>\n<p>在这个例子中，<code class=\"docutils literal notranslate\">first_name</code> 和 <code class=\"docutils literal notranslate\">last_name</code> 字段将在更改列表页面上被链接：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;birthday&quot;</span><span class=\"p\">]</span>\n    list_display_links <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>在这个例子中，更改列表页网格将没有链接：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">AuditEntryAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;timestamp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;message&quot;</span><span class=\"p\">]</span>\n    list_display_links <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\" id=\"admin-list-editable\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.list_editable\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">list_editable</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.list_editable\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>将 <code class=\"docutils literal notranslate\">list_editable</code> 设置为模型上允许在更改列表页上编辑的字段名称列表。也就是说，在 <code class=\"docutils literal notranslate\">list_editable</code> 中列出的字段将作为表单部件显示在变更列表页上，允许用户一次编辑和保存多行。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p><code class=\"docutils literal notranslate\">list_editable</code> 以特定方式与其他几个选项进行交互；你应该注意以下规则：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">list_editable</code> 中的任何字段都必须在 <code class=\"docutils literal notranslate\">list_display</code> 中。你不能编辑一个没有显示的字段！</p></li>\n<li><p>同一字段不能同时列在 <code class=\"docutils literal notranslate\">list_editable</code> 和 <code class=\"docutils literal notranslate\">list_display_links</code> 中 —— 一个字段不能既是表单又是链接。</p></li>\n</ul>\n<p>如果这些规则中的任何一条被破坏，你会得到一个验证错误。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.list_filter\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">list_filter</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.list_filter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">list_filter</code> 以在管理员的更改列表页面右侧边栏上激活过滤器。</p>\n<p>在最简单的情况下，<code class=\"docutils literal notranslate\">list_filter</code> 接受一个字段名称的列表或元组以激活过滤，但还有更多高级选项可供选择。详细信息请参阅 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/filters/#modeladmin-list-filters\"><span class=\"std std-ref\">ModelAdmin 列表过滤器</span></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.list_max_show_all\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">list_max_show_all</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.list_max_show_all\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">list_max_show_all</code> 来控制 “全部显示” 的管理员更改列表页面上可以出现多少个项目。只有当总结果数小于或等于此配置时，管理才会在更改列表中显示 “全部显示” 链接。默认情况下，这个配置为 <code class=\"docutils literal notranslate\">200</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.list_per_page\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">list_per_page</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.list_per_page\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">list_per_page</code> 来控制每个分页的管理变更列表页面上出现多少个项目。默认情况下，设置为 <code class=\"docutils literal notranslate\">100</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.list_select_related\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">list_select_related</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.list_select_related\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">list_select_related</code> 告诉 Django 在检索管理变更列表页的对象列表时使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a>。这样可以省去一堆数据库查询。</p>\n<p>该值应是布尔值、列表或元组。默认值是 <code class=\"docutils literal notranslate\">False</code>。</p>\n<p>当值为 <code class=\"docutils literal notranslate\">True</code> 时，<code class=\"docutils literal notranslate\">select_related()</code> 总是会被调用。当值设置为 <code class=\"docutils literal notranslate\">False</code> 时，Django 将查看 <code class=\"docutils literal notranslate\">list_display</code>，如果有 <code class=\"docutils literal notranslate\">ForeignKey</code>，则调用 <code class=\"docutils literal notranslate\">select_related()</code>。</p>\n<p>如果你需要更精细的控制，可以使用元组（或列表）作为 <code class=\"docutils literal notranslate\">list_select_related</code> 的值。空元组将阻止 Django 调用 <code class=\"docutils literal notranslate\">select_related</code>。任何其他元组将直接传递给 <code class=\"docutils literal notranslate\">select_related</code> 作为参数。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_select_related <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;category&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>将调用 <code class=\"docutils literal notranslate\">select_related('author', 'category')</code>。</p>\n<p>如果需要根据请求指定一个动态值，可以实现一个 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_list_select_related\" title=\"django.contrib.admin.ModelAdmin.get_list_select_related\"><code class=\"xref py py-meth docutils literal notranslate\">get_list_select_related()</code></a> 方法。</p>\n<aside class=\"version-note version-deprecated\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 6.1</p><p><span class=\"versionmodified deprecated\">Deprecated since version 6.1: </span>Using <code class=\"docutils literal notranslate\">True</code> for <code class=\"docutils literal notranslate\">list_select_related</code> is deprecated. Use a list or\ntuple of field names instead.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\">select_related()</code></a> 已经在变更列表的 <code class=\"docutils literal notranslate\">QuerySet</code> 上被调用时，<code class=\"docutils literal notranslate\">ModelAdmin</code> 会忽略这个属性。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.ordering\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">ordering</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.ordering\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">ordering</code> 来指定对象列表在 Django 管理视图中的排序方式。这应该是一个列表或元组，格式与模型的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ordering</code></a> 参数相同。</p>\n<p>如果没有提供，Django 管理员将使用模型的默认排序。</p>\n<p>如果你需要指定一个动态的顺序（例如取决于用户或语言），你可以实现一个 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_ordering\" title=\"django.contrib.admin.ModelAdmin.get_ordering\"><code class=\"xref py py-meth docutils literal notranslate\">get_ordering()</code></a> 方法。</p>\n<aside class=\"admonition-performance-considerations-with-ordering-and-sorting admonition\" role=\"note\">\n<p class=\"admonition-title\">排序和分类的性能考虑</p>\n<p>为了确保结果的确定性排序，如果不能找到一个单一的或唯一的字段集，提供总的排序，那么变更表就会在排序中增加 <code class=\"docutils literal notranslate\">pk</code>。</p>\n<p>例如，如果默认的排序是按非唯一的 <code class=\"docutils literal notranslate\">name</code> 字段排序，那么更改列表就按 <code class=\"docutils literal notranslate\">name</code> 和 <code class=\"docutils literal notranslate\">pk</code> 排序。如果你有很多行，而且在 <code class=\"docutils literal notranslate\">name</code> 和 <code class=\"docutils literal notranslate\">pk</code> 上没有索引，这可能会表现得很差。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.paginator\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">paginator</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.paginator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于分页的分页器类。默认情况下，使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/paginator/#django.core.paginator.Paginator\" title=\"django.core.paginator.Paginator\"><code class=\"xref py py-class docutils literal notranslate\">django.core.paginator.Paginator</code></a>。如果自定义的分页器类没有和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/paginator/#django.core.paginator.Paginator\" title=\"django.core.paginator.Paginator\"><code class=\"xref py py-class docutils literal notranslate\">django.core.paginator.Paginator</code></a> 一样的构造函数接口，你还需要为 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_paginator\" title=\"django.contrib.admin.ModelAdmin.get_paginator\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.get_paginator()</code></a> 提供一个实现。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.prepopulated_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">prepopulated_fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.prepopulated_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>将 <code class=\"docutils literal notranslate\">prepopulated_fields</code> 设置为一个字典，将字段名称映射到它应该预先填充的字段：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    prepopulated_fields <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">]}</span>\n</code></pre></div>\n<p>当设置时，给定的字段将使用一点 JavaScript 从分配的字段中填充。这个功能的主要用途是从一个或多个其他字段自动生成 <code class=\"docutils literal notranslate\">SlugField</code> 字段的值。生成的值是通过连接源字段的值，然后将结果转化为有效的 slug（例如，用破折号代替空格，使用 ASCII 字母的小写字母）。</p>\n<p>预填充的字段在保存值后不会被 JavaScript 修改。通常情况下，不希望 slug 发生变化（如果对象中使用了 slug，会导致对象的 URL 发生变化）。</p>\n<p><code class=\"docutils literal notranslate\">prepopulated_fields</code> 不接受 <code class=\"docutils literal notranslate\">DateTimeField</code>、<code class=\"docutils literal notranslate\">ForeignKey</code>、<code class=\"docutils literal notranslate\">OneToOneField</code> 和 <code class=\"docutils literal notranslate\">ManyToManyField</code> 字段。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.preserve_filters\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">preserve_filters</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.preserve_filters\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，在创建、编辑或删除对象后，应用的过滤器会被保存在列表视图中。您可以通过将此属性设置为 <code class=\"docutils literal notranslate\">False</code> 来清除过滤器。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.show_facets\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">show_facets</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.show_facets\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>控制是否在管理列表中显示筛选器的 facet 计数。默认值为 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.ShowFacets.ALLOW\" title=\"django.contrib.admin.ModelAdmin.ShowFacets.ALLOW\"><code class=\"xref py py-attr docutils literal notranslate\">ShowFacets.ALLOW</code></a>。</p>\n<p>当显示时，facet 计数会根据当前应用的筛选器而更新。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.ShowFacets\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ShowFacets</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.ShowFacets\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对于 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.show_facets\" title=\"django.contrib.admin.ModelAdmin.show_facets\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.show_facets</code></a> 的允许值的枚举。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.ShowFacets.ALWAYS\">\n<span class=\"sig-name descname\">ALWAYS</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.ShowFacets.ALWAYS\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>始终显示 facet 计数。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.ShowFacets.ALLOW\">\n<span class=\"sig-name descname\">ALLOW</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.ShowFacets.ALLOW\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>当提供 <code class=\"docutils literal notranslate\">_facets</code> 查询字符串参数时显示 facet 计数。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.ShowFacets.NEVER\">\n<span class=\"sig-name descname\">NEVER</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.ShowFacets.NEVER\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>从不显示 facet 计数。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>将 <code class=\"docutils literal notranslate\">show_facets</code> 设置为所需的 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.ShowFacets\" title=\"django.contrib.admin.ModelAdmin.ShowFacets\"><code class=\"xref py py-class docutils literal notranslate\">ShowFacets</code></a> 值。例如，要始终显示 facet 计数而无需提供查询参数：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"c1\"># Have facets always shown for this model admin.</span>\n    show_facets <span class=\"o\">=</span> admin<span class=\"o\">.</span>ShowFacets<span class=\"o\">.</span>ALWAYS\n</code></pre></div>\n<aside class=\"admonition-performance-considerations-with-facets admonition\" role=\"note\">\n<p class=\"admonition-title\">性能考虑与 facets</p>\n<p>启用 facet 过滤器将增加与筛选器数量相匹配的管理列表页面上的查询数量。这些查询可能会引发性能问题，特别是对于大型数据集。在这些情况下，将 <code class=\"docutils literal notranslate\">show_facets</code> 设置为 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.ShowFacets.NEVER\" title=\"django.contrib.admin.ModelAdmin.ShowFacets.NEVER\"><code class=\"xref py py-attr docutils literal notranslate\">ShowFacets.NEVER</code></a> 可以完全禁用 faceting。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.radio_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">radio_fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.radio_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，Django 的管理对于 <code class=\"docutils literal notranslate\">ForeignKey</code> 或设置了 <code class=\"docutils literal notranslate\">choices</code> 的字段使用选择框界面（&lt;select&gt;）。如果字段存在于 <code class=\"docutils literal notranslate\">radio_fields</code> 中，Django 将使用单选按钮接口代替。假设 <code class=\"docutils literal notranslate\">group</code> 是 <code class=\"docutils literal notranslate\">Person</code> 模型上的一个 <code class=\"docutils literal notranslate\">ForeignKey</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    radio_fields <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;group&quot;</span><span class=\"p\">:</span> admin<span class=\"o\">.</span>VERTICAL<span class=\"p\">}</span>\n</code></pre></div>\n<p>你可以在 <code class=\"docutils literal notranslate\">django.contrib.admin</code> 模块中选择使用 <code class=\"docutils literal notranslate\">HORIZONTAL</code> 或 <code class=\"docutils literal notranslate\">VERTICAL</code>。</p>\n<p>不要在 <code class=\"docutils literal notranslate\">radio_fields</code> 中包含一个字段，除非它是 <code class=\"docutils literal notranslate\">ForeignKey</code> 或已设置 <code class=\"docutils literal notranslate\">choices</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.autocomplete_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">autocomplete_fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.autocomplete_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">autocomplete_fields</code> 是一个 <code class=\"docutils literal notranslate\">ForeignKey</code> 和／或 <code class=\"docutils literal notranslate\">ManyToManyField</code> 字段的列表，你想将其改为 <a class=\"reference external\" href=\"https://select2.org/\">Select2</a> 自动完成输入。</p>\n<p><code class=\"docutils literal notranslate\">autocomplete_fields</code> 是一个 <code class=\"docutils literal notranslate\">ForeignKey</code> 和／或的列表，默认情况下，管理对这些字段使用选择框接口（<code class=\"docutils literal notranslate\">&lt;select&gt;</code>）。有时你不想产生选择所有相关实例在下拉中显示的开销。<code class=\"docutils literal notranslate\">ManyToManyField</code> 字段你想改成 <a class=\"reference external\" href=\"https://select2.org/\">Select2</a> 自动完成输入。</p>\n<p>Select2 输入看起来与默认输入类似，但自带搜索功能，异步加载选项。如果相关模型有很多实例，这样会更快、更方便用户使用。</p>\n<p>你必须在相关对象的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 上定义 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\">search_fields</code></a>，因为自动完成搜索使用它。</p>\n<p>为了避免未经授权的数据泄露，用户必须拥有相关对象的 <code class=\"docutils literal notranslate\">view</code> 或 <code class=\"docutils literal notranslate\">change</code> 权限才能使用自动完成。</p>\n<p>结果的排序和分页由相关的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 的 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_ordering\" title=\"django.contrib.admin.ModelAdmin.get_ordering\"><code class=\"xref py py-meth docutils literal notranslate\">get_ordering()</code></a> 和 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_paginator\" title=\"django.contrib.admin.ModelAdmin.get_paginator\"><code class=\"xref py py-meth docutils literal notranslate\">get_paginator()</code></a> 方法控制。</p>\n<p>在下面的例子中，<code class=\"docutils literal notranslate\">ChoiceAdmin</code> 对 <code class=\"docutils literal notranslate\">Question</code> 有一个 <code class=\"docutils literal notranslate\">ForeignKey</code> 的自动完成字段。结果由 <code class=\"docutils literal notranslate\">question_text</code> 字段过滤，并由 <code class=\"docutils literal notranslate\">date_created</code> 字段排序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    ordering <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;date_created&quot;</span><span class=\"p\">]</span>\n    search_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ChoiceAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    autocomplete_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition-performance-considerations-for-large-datasets admonition\" role=\"note\">\n<p class=\"admonition-title\">大型数据集的性能考虑</p>\n<p>使用 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.ordering\" title=\"django.contrib.admin.ModelAdmin.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.ordering</code></a> 排序可能会导致性能问题，因为在一个大的查询集上排序会很慢。</p>\n<p>此外，如果你的搜索字段包括没有被数据库索引的字段，你可能会在极大的表上遇到性能不佳的情况。</p>\n<p>对于这些情况，最好是使用全文索引搜索来编写自己的 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_search_results\" title=\"django.contrib.admin.ModelAdmin.get_search_results\"><code class=\"xref py py-func docutils literal notranslate\">ModelAdmin.get_search_results()</code></a> 实现。</p>\n<p>你可能还想改变非常大的表的 <code class=\"docutils literal notranslate\">Paginator</code>，因为默认的分页器总是执行 <code class=\"docutils literal notranslate\">count()</code> 查询。例如，你可以覆盖 <code class=\"docutils literal notranslate\">Paginator.count</code> 属性的默认实现。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.raw_id_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">raw_id_fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.raw_id_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，Django 的管理员对 <code class=\"docutils literal notranslate\">ForeignKey</code> 的字段使用选择框接口（&lt;select&gt;）。有时候，你不想产生必须选择所有相关的实例来显示在下拉框中的开销。</p>\n<p><code class=\"docutils literal notranslate\">raw_id_fields</code> 是你想改变为 <code class=\"docutils literal notranslate\">ForeignKey</code> 或 <code class=\"docutils literal notranslate\">ManyToManyField</code> 的 <code class=\"docutils literal notranslate\">Input</code> 部件的字段列表：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    raw_id_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;newspaper&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\">raw_id_fields</code> <code class=\"docutils literal notranslate\">Input</code> widget should contain a primary key if the\nfield is a <code class=\"docutils literal notranslate\">ForeignKey</code> or a comma separated list of values if the field\nis a <code class=\"docutils literal notranslate\">ManyToManyField</code>. The <code class=\"docutils literal notranslate\">raw_id_fields</code> widget shows a magnifying\nglass button next to the field which allows users to search for and select\na value:</p>\n<img alt=\"/zh-hans/6.1/_images/raw_id_fields.png\" src=\"/zh-hans/6.1/_images/raw_id_fields.png\" />\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.readonly_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">readonly_fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，管理会将所有字段显示为可编辑。该选项中的任何字段（应该是 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code>）将按原样显示其数据，不可编辑；它们也被排除在用于创建和编辑的 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> 中。请注意，当指定 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.fields</code></a> 或 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.fieldsets</code></a> 时，只读字段必须存在才能显示（否则将被忽略）。</p>\n<p>如果没有通过 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.fields</code></a> 或 <code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.fielets</code> 定义明确的顺序就使用 <code class=\"docutils literal notranslate\">readonly_fields</code>，它们将在所有可编辑字段之后最后添加。</p>\n<p>一个只读字段不仅可以显示模型字段的数据，还可以显示模型的方法或 <code class=\"docutils literal notranslate\">ModelAdmin</code> 类本身的方法的输出。这与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.list_display</code></a> 的行为方式非常相似。这提供了一种方法来使用管理员接口来提供被编辑对象的状态反馈，例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.html</span> <span class=\"kn\">import</span> format_html_join\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.safestring</span> <span class=\"kn\">import</span> mark_safe\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    readonly_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;address_report&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"c1\"># description functions like a model field&#39;s verbose_name</span>\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>description<span class=\"o\">=</span><span class=\"s2\">&quot;Address&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">address_report</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> instance<span class=\"p\">):</span>\n        <span class=\"c1\"># assuming get_full_address() returns a list of strings</span>\n        <span class=\"c1\"># for each line of the address and you want to separate each</span>\n        <span class=\"c1\"># line by a linebreak</span>\n        <span class=\"k\">return</span> format_html_join<span class=\"p\">(</span>\n            mark_safe<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;br&gt;&quot;</span><span class=\"p\">),</span>\n            <span class=\"s2\">&quot;</span><span class=\"si\">{}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">((</span>line<span class=\"p\">,)</span> <span class=\"k\">for</span> line <span class=\"ow\">in</span> instance<span class=\"o\">.</span>get_full_address<span class=\"p\">()),</span>\n        <span class=\"p\">)</span> <span class=\"ow\">or</span> mark_safe<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;span class=&#39;errors&#39;&gt;I can&#39;t determine this address.&lt;/span&gt;&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.save_as\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">save_as</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.save_as\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">save_as</code>，在管理更改表格时启用 “另存为新” 功能。</p>\n<p>通常情况下，对象有三个保存选项。“保存”、“保存并继续编辑” 和 “保存并添加另一个”。如果 <code class=\"docutils literal notranslate\">save_as</code> 为 <code class=\"docutils literal notranslate\">True</code>，则 “保存并添加另一个” 将被 “另存为新” 按钮所取代，该按钮将创建一个新的对象（具有新的 ID），而不是更新现有的对象。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">save_as</code> 被设置为 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.save_as_continue\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">save_as_continue</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.save_as_continue\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>当 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.save_as\" title=\"django.contrib.admin.ModelAdmin.save_as\"><code class=\"xref py py-attr docutils literal notranslate\">save_as=True</code></a> 时，保存新对象后默认重定向到该对象的变更视图。如果设置 <code class=\"docutils literal notranslate\">save_as_continue=False</code>，则重定向到变更列表视图。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">save_as_continue</code> 被设置为 <code class=\"docutils literal notranslate\">True</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.save_on_top\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">save_on_top</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.save_on_top\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">save_on_top</code> 来在你的管理更改表格的顶部添加保存按钮。</p>\n<p>通常情况下，保存按钮只出现在表格的底部。如果设置 <code class=\"docutils literal notranslate\">save_on_top</code>，按钮将同时出现在顶部和底部。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">save_on_top</code> 被设置为 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.search_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">search_fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.search_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">search_fields</code>，在管理更改列表页面上启用搜索框。这应该被设置为字段名的列表，每当有人在该文本框中提交搜索查询时，就会被搜索到。</p>\n<p>These fields are typically text fields such as <code class=\"docutils literal notranslate\">CharField</code> or\n<code class=\"docutils literal notranslate\">TextField</code>, but non-text fields like <code class=\"docutils literal notranslate\">IntegerField</code> can also be\nsearched. Adding an explicit lookup, such as <code class=\"docutils literal notranslate\">age__exact</code>, lets the\nsearch use that lookup directly instead of casting the value to text. You\ncan also perform a related lookup on a <code class=\"docutils literal notranslate\">ForeignKey</code> or\n<code class=\"docutils literal notranslate\">ManyToManyField</code> with the lookup API &quot;follow&quot; notation:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>search_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;foreign_key__related_fieldname&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>例如，如果你有一个有作者的博客条目，下面的定义将可以通过作者的电子邮件地址搜索博客条目：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>search_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;user__email&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>When somebody does a search in the admin search box, Django splits the\nsearch query into search terms and returns all objects that contain each\nof them in at least one of <code class=\"docutils literal notranslate\">search_fields</code>. By default, the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#std-fieldlookup-icontains\"><code class=\"xref std std-lookup docutils literal notranslate\">icontains</code></a> lookup is used for text fields. For non-text fields\nwith an explicit lookup (e.g., <code class=\"docutils literal notranslate\">age__exact</code>), the specified lookup is\nused, and search terms that are invalid for that field type are skipped.</p>\n<p>For example, if <code class=\"docutils literal notranslate\">search_fields</code> is set to\n<code class=\"docutils literal notranslate\">['first_name', 'last_name', 'age__exact']</code> and a user searches for\n<code class=\"docutils literal notranslate\">john 25</code>, Django will do the equivalent of this SQL <code class=\"docutils literal notranslate\">WHERE</code> clause:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">WHERE</span> <span class=\"p\">(</span>first_name <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%john%&#39;</span> <span class=\"k\">OR</span> last_name <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%john%&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">AND</span> <span class=\"p\">(</span>first_name <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%25%&#39;</span> <span class=\"k\">OR</span> last_name <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%25%&#39;</span> <span class=\"k\">OR</span> age <span class=\"o\">=</span> <span class=\"mi\">25</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Note that <code class=\"docutils literal notranslate\">john</code> is not searched on <code class=\"docutils literal notranslate\">age</code> because it's not a valid\ninteger, while <code class=\"docutils literal notranslate\">25</code> is searched on all three fields.</p>\n<p>搜索查询可以包含带空格的引号短语。例如，如果用户搜索 <code class=\"docutils literal notranslate\">&quot;john winston&quot;</code> 或 <code class=\"docutils literal notranslate\">'john winston'</code>，Django 会做相当于这个 SQL 的 <code class=\"docutils literal notranslate\">WHERE</code> 子句：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">WHERE</span> <span class=\"p\">(</span>first_name <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%john winston%&#39;</span> <span class=\"k\">OR</span> last_name <span class=\"k\">ILIKE</span> <span class=\"s1\">&#39;%john winston%&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你不想使用 <code class=\"docutils literal notranslate\">icontains</code> 作为查找，你可以通过附加字段来使用任何查找。例如，你可以通过设置 <code class=\"docutils literal notranslate\">search_fields</code> 为 <code class=\"docutils literal notranslate\">['first_name__exact']</code> 来使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\">exact</code></a>。</p>\n<p>还可以使用一些（较老的）快捷方式来指定字段查找。你可以在 <code class=\"docutils literal notranslate\">search_fields</code> 中的字段前加上以下字符，相当于在字段中加上 <code class=\"docutils literal notranslate\">__&lt;lookup&gt;</code>。</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>前缀</p></th>\n<th class=\"head\"><p>查找</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p>^</p></td>\n<td><p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#std-fieldlookup-istartswith\"><code class=\"xref std std-lookup docutils literal notranslate\">istartswith</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>=</p></td>\n<td><p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\">iexact</code></a></p></td>\n</tr>\n<tr class=\"row-even\"><td><p>&#64;</p></td>\n<td><p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/postgres/search/#std-fieldlookup-search\"><code class=\"xref std std-lookup docutils literal notranslate\">search</code></a></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>None</p></td>\n<td><p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#std-fieldlookup-icontains\"><code class=\"xref std std-lookup docutils literal notranslate\">icontains</code></a></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>如果你需要自定义搜索，你可以使用 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_search_results\" title=\"django.contrib.admin.ModelAdmin.get_search_results\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.get_search_results()</code></a> 来提供额外的或替代的搜索行为。</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>On earlier versions, search terms invalid for a given field type were\nnot skipped.</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.search_help_text\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">search_help_text</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.search_help_text\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">search_help_text</code>，为搜索框指定一个描述性文本，显示在它的下面。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.show_full_result_count\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">show_full_result_count</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.show_full_result_count\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">show_full_result_count</code> 来控制是否应该在过滤后的管理页面上显示全部对象的数量（例如： <code class=\"docutils literal notranslate\">99 results (103 total)</code>）。如果这个选项被设置为 <code class=\"docutils literal notranslate\">False</code>，则会显示 <code class=\"docutils literal notranslate\">99 results (Show all)</code> 这样的文字。</p>\n<p>默认的 <code class=\"docutils literal notranslate\">show_full_result_count=True</code> 会生成一个对表进行完整计数的查询，如果表包含大量的行，那么这个查询可能会很昂贵。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.sortable_by\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">sortable_by</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.sortable_by\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，变更列表页面允许按 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">list_display</code></a> 中指定的所有模型字段（以及使用 <a class=\"reference internal\" href=\"#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> 装饰器的 <code class=\"docutils literal notranslate\">ordering</code> 参数或具有 <code class=\"docutils literal notranslate\">admin_order_field</code> 属性的可调用对象）进行排序。</p>\n<p>如果你想禁止对某些列进行排序，请将 <code class=\"docutils literal notranslate\">sortable_by</code> 设置为你想排序的 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">list_display</code></a> 子集的一个集合（例如 <code class=\"docutils literal notranslate\">list`</code>、<code class=\"docutils literal notranslate\">tuple</code> 或 <code class=\"docutils literal notranslate\">set</code>）。一个空的集合会禁用所有列的排序。</p>\n<p>如果你需要动态地指定这个列表，可以实现一个 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_sortable_by\" title=\"django.contrib.admin.ModelAdmin.get_sortable_by\"><code class=\"xref py py-meth docutils literal notranslate\">get_sortable_by()</code></a> 方法来代替。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.view_on_site\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">view_on_site</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.view_on_site\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>设置 <code class=\"docutils literal notranslate\">view_on_site</code> 来控制是否显示 “在站点上查看” 链接。这个链接应该把你带到一个可以显示保存对象的 URL。</p>\n<p>这个值可以是一个布尔标志，也可以是一个可调用对象。如果 <code class=\"docutils literal notranslate\">True</code> （默认），对象的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#django.db.models.Model.get_absolute_url\" title=\"django.db.models.Model.get_absolute_url\"><code class=\"xref py py-meth docutils literal notranslate\">get_absolute_url()</code></a> 方法将被用来生成网址。</p>\n<p>如果你的模型有一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#django.db.models.Model.get_absolute_url\" title=\"django.db.models.Model.get_absolute_url\"><code class=\"xref py py-meth docutils literal notranslate\">get_absolute_url()</code></a> 方法，但你不想让 “在站点上查看” 按钮出现，你只需要将 <code class=\"docutils literal notranslate\">view_on_site</code> 设置为 <code class=\"docutils literal notranslate\">False</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    view_on_site <span class=\"o\">=</span> <span class=\"kc\">False</span>\n</code></pre></div>\n<p>如果它是一个可调用对象，它接受模型实例作为参数。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">view_on_site</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        url <span class=\"o\">=</span> reverse<span class=\"p\">(</span><span class=\"s2\">&quot;person-detail&quot;</span><span class=\"p\">,</span> kwargs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> obj<span class=\"o\">.</span>slug<span class=\"p\">})</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;https://example.com&quot;</span> <span class=\"o\">+</span> url\n</code></pre></div>\n</dd></dl>\n\n<section id=\"custom-template-options\">\n<h4>自定义模板选项<a class=\"heading-anchor\" href=\"#custom-template-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <a class=\"reference internal\" href=\"#admin-overriding-templates\"><span class=\"std std-ref\">覆盖管理模板</span></a> section describes how to override or\nextend the default admin templates. Use the following options to override the\ndefault templates used by the <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> views:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.add_form_template\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">add_form_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.add_form_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>自定义模板的路径，由 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.add_view\" title=\"django.contrib.admin.ModelAdmin.add_view\"><code class=\"xref py py-meth docutils literal notranslate\">add_view()</code></a> 使用。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.change_form_template\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">change_form_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.change_form_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>自定义模板的路径，由 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.change_view\" title=\"django.contrib.admin.ModelAdmin.change_view\"><code class=\"xref py py-meth docutils literal notranslate\">change_view()</code></a> 使用。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.change_list_template\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">change_list_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.change_list_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>自定义模板的路径，由 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.changelist_view\" title=\"django.contrib.admin.ModelAdmin.changelist_view\"><code class=\"xref py py-meth docutils literal notranslate\">changelist_view()</code></a> 使用。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.delete_confirmation_template\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">delete_confirmation_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.delete_confirmation_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>自定义模板的路径，由 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.delete_view\" title=\"django.contrib.admin.ModelAdmin.delete_view\"><code class=\"xref py py-meth docutils literal notranslate\">delete_view()</code></a> 用于在删除一个或多个对象时显示确认页面。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.delete_selected_confirmation_template\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">delete_selected_confirmation_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.delete_selected_confirmation_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>自定义模板的路径，由 <code class=\"docutils literal notranslate\">delete_selected</code> 动作方法使用，在删除一个或多个对象时显示确认页面。参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/actions/\"><span class=\"doc\">动作文档</span></a>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.delete_confirmation_max_display\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">delete_confirmation_max_display</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.delete_confirmation_max_display\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.1</p></aside>\n<p>Set <code class=\"docutils literal notranslate\">delete_confirmation_max_display</code> to control how many objects are\ndisplayed on the delete confirmation pages before truncating the remainder\nwith an ellipsis.</p>\n<p>The limit applies to the total number of displayed objects across the\nrelationship hierarchy. This is purely a display setting and does not\naffect the total number of objects retrieved from the database.</p>\n<p>This applies to <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.delete_view\" title=\"django.contrib.admin.ModelAdmin.delete_view\"><code class=\"xref py py-meth docutils literal notranslate\">delete_view()</code></a> and the <code class=\"docutils literal notranslate\">delete_selected</code>\naction if specified for <code class=\"docutils literal notranslate\">ModelAdmin</code>, and to protected deletion\nvalidation messages if specified for <code class=\"docutils literal notranslate\">InlineModelAdmin</code>. By default,\nthis is <code class=\"docutils literal notranslate\">None</code> (no truncation).</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.object_history_template\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">object_history_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.object_history_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>自定义模板的路径，由 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.history_view\" title=\"django.contrib.admin.ModelAdmin.history_view\"><code class=\"xref py py-meth docutils literal notranslate\">history_view()</code></a> 使用。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.popup_response_template\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">popup_response_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.popup_response_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.response_add\" title=\"django.contrib.admin.ModelAdmin.response_add\"><code class=\"xref py py-meth docutils literal notranslate\">response_add()</code></a>、 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.response_change\" title=\"django.contrib.admin.ModelAdmin.response_change\"><code class=\"xref py py-meth docutils literal notranslate\">response_change()</code></a> 和 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.response_delete\" title=\"django.contrib.admin.ModelAdmin.response_delete\"><code class=\"xref py py-meth docutils literal notranslate\">response_delete()</code></a> 使用的自定义模板的路径。</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"modeladmin-methods\">\n<span id=\"model-admin-methods\"></span><h3><code class=\"docutils literal notranslate\">ModelAdmin</code> 方法<a class=\"heading-anchor\" href=\"#modeladmin-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>当覆盖 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.save_model\" title=\"django.contrib.admin.ModelAdmin.save_model\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.save_model()</code></a> 和 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.delete_model\" title=\"django.contrib.admin.ModelAdmin.delete_model\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.delete_model()</code></a> 时，你的代码必须保存／删除对象。它们不是为了否决的目的，而是允许你执行额外的操作。</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.save_model\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">save_model</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj</em>, <em class=\"sig-param\">form</em>, <em class=\"sig-param\">change</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.save_model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">save_model</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>、一个模型实例、一个 <code class=\"docutils literal notranslate\">ModelForm</code> 实例和一个基于是否添加或更改对象的布尔值。覆盖这个方法可以进行保存前或保存后的操作。调用 <code class=\"docutils literal notranslate\">super().save_model()</code> 使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#django.db.models.Model.save\" title=\"django.db.models.Model.save\"><code class=\"xref py py-meth docutils literal notranslate\">Model.save()</code></a> 保存对象。</p>\n<p>例如，在保存之前将 <code class=\"docutils literal notranslate\">request.user</code> 附加到对象上：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">save_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"p\">,</span> form<span class=\"p\">,</span> change<span class=\"p\">):</span>\n        obj<span class=\"o\">.</span>user <span class=\"o\">=</span> request<span class=\"o\">.</span>user\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>save_model<span class=\"p\">(</span>request<span class=\"p\">,</span> obj<span class=\"p\">,</span> form<span class=\"p\">,</span> change<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.delete_model\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">delete_model</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.delete_model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">delete_model</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code> 和一个模型实例。覆盖该方法可以进行删除前或删除后的操作。调用 <code class=\"docutils literal notranslate\">super().delete_model()</code> 使用 <code class=\"xref py py-meth docutils literal notranslate\">Model.delete`()</code> 删除对象。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.delete_queryset\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">delete_queryset</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">queryset</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.delete_queryset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The <code class=\"docutils literal notranslate\">delete_queryset()</code> method is given the <code class=\"docutils literal notranslate\">HttpRequest</code> and a\n<code class=\"docutils literal notranslate\">QuerySet</code> of objects to be deleted. Override this method to customize\nthe deletion process for the &quot;delete selected objects&quot; <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/actions/\"><span class=\"doc\">action</span></a>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.save_formset\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">save_formset</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">form</em>, <em class=\"sig-param\">formset</em>, <em class=\"sig-param\">change</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.save_formset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">save_formset</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>、父 <code class=\"docutils literal notranslate\">ModelForm</code> 实例和一个基于是否添加或更改父对象的布尔值。</p>\n<p>例如，将 <code class=\"docutils literal notranslate\">request.user</code> 附加到每一个改变了的表单集模型实例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">save_formset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> form<span class=\"p\">,</span> formset<span class=\"p\">,</span> change<span class=\"p\">):</span>\n        instances <span class=\"o\">=</span> formset<span class=\"o\">.</span>save<span class=\"p\">(</span>commit<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n        <span class=\"k\">for</span> obj <span class=\"ow\">in</span> formset<span class=\"o\">.</span>deleted_objects<span class=\"p\">:</span>\n            obj<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n        <span class=\"k\">for</span> instance <span class=\"ow\">in</span> instances<span class=\"p\">:</span>\n            instance<span class=\"o\">.</span>user <span class=\"o\">=</span> request<span class=\"o\">.</span>user\n            instance<span class=\"o\">.</span>save<span class=\"p\">()</span>\n        formset<span class=\"o\">.</span>save_m2m<span class=\"p\">()</span>\n</code></pre></div>\n<p>另见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#saving-objects-in-the-formset\"><span class=\"std std-ref\">在表单集中保存对象</span></a>。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>所有返回 <code class=\"docutils literal notranslate\">ModelAdmin</code> 属性的钩子都返回属性本身，而不是其值的副本。动态修改该值可能会导致意外的结果。</p>\n<p>让我们以 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_readonly_fields\" title=\"django.contrib.admin.ModelAdmin.get_readonly_fields\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.get_readonly_fields()</code></a> 为例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    readonly_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_readonly_fields</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        readonly <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_readonly_fields<span class=\"p\">(</span>request<span class=\"p\">,</span> obj<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_superuser<span class=\"p\">:</span>\n            readonly<span class=\"o\">.</span>append<span class=\"p\">(</span><span class=\"s2\">&quot;age&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># Edits the class attribute.</span>\n        <span class=\"k\">return</span> readonly\n</code></pre></div>\n<p>这会导致 <code class=\"docutils literal notranslate\">readonly_fields</code> 变成 <code class=\"docutils literal notranslate\">[&quot;name&quot;, &quot;age&quot;, &quot;age&quot;, ...]</code>，即使对于超级用户也是如此，因为每次非超级用户访问页面时都会添加 <code class=\"docutils literal notranslate\">&quot;age&quot;</code>。</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_ordering\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_ordering</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_ordering\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_ordering</code> 方法以 <code class=\"docutils literal notranslate\">request</code> 为参数，并期望返回一个类似于 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.ordering\" title=\"django.contrib.admin.ModelAdmin.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ordering</code></a> 属性的 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code> 的排序。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_ordering</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        <span class=\"k\">if</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_superuser<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;rank&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_search_results\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_search_results</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">queryset</em>, <em class=\"sig-param\">search_term</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_search_results\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_search_results</code> 方法将显示的对象列表修改为符合所提供的搜索词的对象。它接受请求、应用当前过滤器的查询集和用户提供的搜索词。它返回一个元组，其中包含一个修改后实现搜索的查询集，以及一个布尔值，表示结果是否包含重复。</p>\n<p>默认的实现是搜索 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.search_fields</code></a> 中命名的字段。</p>\n<p>这个方法可以被你自己定制的搜索方法覆盖。例如，你可能希望按整数字段搜索，或使用外部工具如 <a class=\"reference external\" href=\"https://solr.apache.org\">Solr</a> 或 <a class=\"reference external\" href=\"https://haystacksearch.org\">Haystack</a>。你必须确定你的搜索方法实施的查询集更改是否可能引入重复的结果，并在返回值的第二个元素中返回 <code class=\"docutils literal notranslate\">True</code>。</p>\n<p>例如，如果要按 <code class=\"docutils literal notranslate\">name</code> 和 <code class=\"docutils literal notranslate\">age</code> 进行搜索，你可以使用：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    list_display <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;age&quot;</span><span class=\"p\">]</span>\n    search_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_search_results</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> queryset<span class=\"p\">,</span> search_term<span class=\"p\">):</span>\n        queryset<span class=\"p\">,</span> may_have_duplicates <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_search_results<span class=\"p\">(</span>\n            request<span class=\"p\">,</span>\n            queryset<span class=\"p\">,</span>\n            search_term<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            search_term_as_int <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span>search_term<span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n            <span class=\"k\">pass</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            queryset <span class=\"o\">|=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>model<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>age<span class=\"o\">=</span>search_term_as_int<span class=\"p\">)</span>\n        <span class=\"k\">return</span> queryset<span class=\"p\">,</span> may_have_duplicates\n</code></pre></div>\n<p>这个实现比 <code class=\"docutils literal notranslate\">search_fields = ('name', '=age')</code> 更有效，因为后者的结果是对数字字段进行字符串比较，例如 <code class=\"docutils literal notranslate\">... OR UPPER(&quot;polls_choice&quot;.&quot;votes&quot;::text) = UPPER('4')</code> 在 PostgreSQL 上。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.save_related\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">save_related</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">form</em>, <em class=\"sig-param\">formsets</em>, <em class=\"sig-param\">change</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.save_related\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">save_related</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>、父 <code class=\"docutils literal notranslate\">ModelForm</code> 实例、内联表单集列表和一个基于父对象是否被添加或更改的布尔值。在这里可以对父对象相关的对象进行任何保存前或保存后的操作。请注意，此时父对象及其窗体已经被保存。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_autocomplete_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_autocomplete_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_autocomplete_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_autocomplete_fields()</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>，预计将返回一个 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code> 字段名，这些字段名将与自动完成部件一起显示，如上面 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.autocomplete_fields\" title=\"django.contrib.admin.ModelAdmin.autocomplete_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.autocomplete_fields</code></a> 部分所述。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_readonly_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_readonly_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_readonly_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_readonly_fields</code> 方法是给定 <code class=\"docutils literal notranslate\">HttpRequest</code> 和被编辑的 <code class=\"docutils literal notranslate\">obj``（或者在添加表单中给定 ``None</code>），并期望返回一个 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code> 的字段名，这些字段名将被显示为只读，如上面 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.readonly_fields</code></a> 部分所述。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_prepopulated_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_prepopulated_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_prepopulated_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_prepopulated_fields</code> 方法是给定 <code class=\"docutils literal notranslate\">HttpRequest</code> 和被编辑的 <code class=\"docutils literal notranslate\">obj</code> （或者在添加表单中给定 <code class=\"docutils literal notranslate\">None</code>），并期望返回一个 <code class=\"docutils literal notranslate\">dictionary</code>，如上面 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.prepopulated_fields\" title=\"django.contrib.admin.ModelAdmin.prepopulated_fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.prepopulated_fields</code></a> 一节所述。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_list_display\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_list_display</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_list_display\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_list_display</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>，预计将返回一个 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code> 的字段名，这些字段名将显示在变更列表视图上，如上面 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.list_display</code></a> 一节所述。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_list_display_links\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_list_display_links</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">list_display</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_list_display_links\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_list_display_links</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code> 和由 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_list_display\" title=\"django.contrib.admin.ModelAdmin.get_list_display\"><code class=\"xref py py-meth docutils literal notranslate\">ModelAdmin.get_list_display()</code></a> 返回的 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code>。如 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display_links\" title=\"django.contrib.admin.ModelAdmin.list_display_links\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.list_display_links</code></a> 一节所述，预计它将返回变化列表中的 <code class=\"docutils literal notranslate\">None</code> 或 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code> 字段名，这些字段名将被链接到变化视图。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_exclude\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_exclude</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_exclude\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_exclude</code> 方法是给定 <code class=\"docutils literal notranslate\">HttpRequest</code> 和被编辑的 <code class=\"docutils literal notranslate\">obj</code> （或者在添加表单中给定 <code class=\"docutils literal notranslate\">None</code>），并期望返回一个字段列表，如 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.exclude\" title=\"django.contrib.admin.ModelAdmin.exclude\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.exclude</code></a> 中所述。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_fields</code> 方法是给定 <code class=\"docutils literal notranslate\">HttpRequest</code> 和被编辑的 <code class=\"docutils literal notranslate\">obj</code> （或者在添加表单中给定 <code class=\"docutils literal notranslate\">None</code>），并期望返回一个字段列表，如上面 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.fields</code></a> 一节所述。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_fieldsets\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_fieldsets</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_fieldsets\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_fieldsets</code> 方法接收 <code class=\"docutils literal notranslate\">HttpRequest</code> 和正在编辑的 <code class=\"docutils literal notranslate\">obj</code> （或在添加表单上为 <code class=\"docutils literal notranslate\">None</code>），并期望返回一个包含多个 2-元组的列表，其中每个 2-元组表示管理员表单页面上的一个 <code class=\"docutils literal notranslate\">&lt;fieldset&gt;</code>，如上述的 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.fieldsets</code></a> 部分所描述的那样。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_list_filter\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_list_filter</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_list_filter\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_list_filter</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>，并期望返回与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\">list_filter</code></a> 属性相同的序列类型。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_list_select_related\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_list_select_related</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_list_select_related\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_list_select_related</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>，应该像 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_select_related\" title=\"django.contrib.admin.ModelAdmin.list_select_related\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.list_select_related</code></a> 那样返回一个布尔值或列表。</p>\n<aside class=\"version-note version-deprecated\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 6.1</p><p><span class=\"versionmodified deprecated\">Deprecated since version 6.1: </span>Returning <code class=\"docutils literal notranslate\">True</code> is deprecated. Return a list or tuple of field names\ninstead.</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_search_fields\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_search_fields</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_search_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_search_fields</code> 方法被赋予 <code class=\"docutils literal notranslate\">HttpRequest</code>，并期望返回与 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\">search_fields</code></a> 属性相同的序列类型。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_sortable_by\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_sortable_by</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_sortable_by\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_sortable_by()</code> 方法被传递给 <code class=\"docutils literal notranslate\">HttpRequest</code>，并期望返回一个字段名的集合（例如 <code class=\"docutils literal notranslate\">list</code>、<code class=\"docutils literal notranslate\">tuple</code> 或 <code class=\"docutils literal notranslate\">set</code>），这些字段名将在更改列表页中被排序。</p>\n<p>如果设置了，它的默认实现将返回 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.sortable_by\" title=\"django.contrib.admin.ModelAdmin.sortable_by\"><code class=\"xref py py-attr docutils literal notranslate\">sortable_by</code></a>，否则将服从 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_list_display\" title=\"django.contrib.admin.ModelAdmin.get_list_display\"><code class=\"xref py py-meth docutils literal notranslate\">get_list_display()</code></a>。</p>\n<p>例如，要防止一列或多列无法排序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_sortable_by</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"o\">*</span><span class=\"bp\">self</span><span class=\"o\">.</span>get_list_display<span class=\"p\">(</span>request<span class=\"p\">)}</span> <span class=\"o\">-</span> <span class=\"p\">{</span><span class=\"s2\">&quot;rank&quot;</span><span class=\"p\">}</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_inline_instances\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_inline_instances</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_inline_instances\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_inline_instances</code> 方法接收 <code class=\"docutils literal notranslate\">HttpRequest</code> 以及正在编辑的 <code class=\"docutils literal notranslate\">obj``（在添加表单中为 ``None</code>），并应返回一个由 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a> 对象组成的 <code class=\"docutils literal notranslate\">list</code> 或 <code class=\"docutils literal notranslate\">tuple</code>，如下文 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a> 章节所述。例如，以下实现将返回内联对象，且不会基于添加、更改、删除和查看权限进行默认过滤：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>MyInline<span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_inline_instances</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"p\">[</span>inline<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>model<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span>admin_site<span class=\"p\">)</span> <span class=\"k\">for</span> inline <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>inlines<span class=\"p\">]</span>\n</code></pre></div>\n<p>如果你覆盖了这个方法，请确保返回的内联是 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.inlines\" title=\"django.contrib.admin.ModelAdmin.inlines\"><code class=\"xref py py-attr docutils literal notranslate\">inlines</code></a> 中定义的类的实例，否则在添加相关对象时可能会遇到 “Bad Request” 错误。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_inlines\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_inlines</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_inlines\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">get_inlines</code> 方法是给定 <code class=\"docutils literal notranslate\">HttpRequest</code> 和被编辑的 <code class=\"docutils literal notranslate\">obj</code> （或在添加表单中给定 <code class=\"docutils literal notranslate\">None</code>），并期望返回一个可迭代对象的内联。你可以覆盖这个方法，根据请求或模型实例动态添加内联，而不是在 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.inlines\" title=\"django.contrib.admin.ModelAdmin.inlines\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.inlines</code></a> 中指定它们。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_urls\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_urls</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_urls\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The <code class=\"docutils literal notranslate\">get_urls</code> method on a <code class=\"docutils literal notranslate\">ModelAdmin</code> returns the URLs to be used for\nthat ModelAdmin in the same way as a URLconf. Therefore you can extend\nthem as documented in <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/http/urls/\"><span class=\"doc\">URL调度器</span></a>, using the\n<code class=\"docutils literal notranslate\">AdminSite.admin_view()</code> wrapper on your views:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.template.response</span> <span class=\"kn\">import</span> TemplateResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_urls</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        urls <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_urls<span class=\"p\">()</span>\n        my_urls <span class=\"o\">=</span> <span class=\"p\">[</span>path<span class=\"p\">(</span><span class=\"s2\">&quot;my_view/&quot;</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span>admin_site<span class=\"o\">.</span>admin_view<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>my_view<span class=\"p\">))]</span>\n        <span class=\"k\">return</span> my_urls <span class=\"o\">+</span> urls\n\n    <span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        context <span class=\"o\">=</span> <span class=\"nb\">dict</span><span class=\"p\">(</span>\n            <span class=\"c1\"># Include common variables for rendering the admin template.</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>admin_site<span class=\"o\">.</span>each_context<span class=\"p\">(</span>request<span class=\"p\">),</span>\n            <span class=\"c1\"># Anything else you want in the context...</span>\n            key<span class=\"o\">=</span>value<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n        <span class=\"k\">return</span> TemplateResponse<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;sometemplate.html&quot;</span><span class=\"p\">,</span> context<span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你想使用管理布局，从 <code class=\"docutils literal notranslate\">admin/base_site.html</code> 扩展：</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;admin/base_site.html&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n...\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>注意到 <code class=\"docutils literal notranslate\">self.my_view</code> 函数被包装在 <code class=\"docutils literal notranslate\">self.admin_site.admin_view</code> 中。这很重要，因为它确保了两件事情：</p>\n<ol class=\"arabic simple\">\n<li><p>权限检查被运行，确保只有活跃的工作人员用户可以访问视图。</p></li>\n<li><p>应用了 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/http/decorators/#django.views.decorators.cache.never_cache\" title=\"django.views.decorators.cache.never_cache\"><code class=\"xref py py-func docutils literal notranslate\">django.views.decorators.cache.never_cache()</code></a> 装饰器以防止缓存，确保返回的信息是最新的。</p></li>\n</ol>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>请注意，自定义模式包含在常规的管理 URL <em>之前</em>：管理 URL 模式是非常宽松的，几乎可以匹配任何东西，所以你通常会希望将你的自定义 URL 添加到内置的 URL 中。</p>\n<p>在这个例子中，<code class=\"docutils literal notranslate\">my_view</code> 将在 <code class=\"docutils literal notranslate\">/admin/myapp/mymodel/my_view/</code> 中被访问（假设在 <code class=\"docutils literal notranslate\">/admin/</code> 中包含了管理的 URL）。</p>\n</aside>\n<p>如果页面是可缓存的，但你仍然希望进行权限检查，你可以传递一个 <code class=\"docutils literal notranslate\">cacheable=True</code> 参数到 <code class=\"docutils literal notranslate\">AdminSite.admin_view()</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>path<span class=\"p\">(</span><span class=\"s2\">&quot;my_view/&quot;</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span>admin_site<span class=\"o\">.</span>admin_view<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>my_view<span class=\"p\">,</span> cacheable<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">ModelAdmin</code> 视图有 <code class=\"docutils literal notranslate\">model_admin</code> 属性。其他 <code class=\"docutils literal notranslate\">AdminSite</code> 视图有 <code class=\"docutils literal notranslate\">admin_site</code> 属性。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_form\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_form</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> 类，用于管理员添加和更改视图，参见 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.add_view\" title=\"django.contrib.admin.ModelAdmin.add_view\"><code class=\"xref py py-meth docutils literal notranslate\">add_view()</code></a> 和 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.change_view\" title=\"django.contrib.admin.ModelAdmin.change_view\"><code class=\"xref py py-meth docutils literal notranslate\">change_view()</code></a>。</p>\n<p>基本实现使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/models/#django.forms.models.modelform_factory\" title=\"django.forms.models.modelform_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelform_factory()</code></a> 来子类 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.form\" title=\"django.contrib.admin.ModelAdmin.form\"><code class=\"xref py py-attr docutils literal notranslate\">form</code></a>，通过 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> 和 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.exclude\" title=\"django.contrib.admin.ModelAdmin.exclude\"><code class=\"xref py py-attr docutils literal notranslate\">exclude</code></a> 等属性进行修改。所以，例如，如果你想为超级用户提供额外的字段，你可以像这样换一个不同的基本表单：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_form</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">if</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_superuser<span class=\"p\">:</span>\n            kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;form&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> MySuperuserForm\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_form<span class=\"p\">(</span>request<span class=\"p\">,</span> obj<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<p>你也可以直接返回一个自定义的 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> 类。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_formsets_with_inlines\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_formsets_with_inlines</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_formsets_with_inlines\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>产生 (<code class=\"docutils literal notranslate\">FormSet</code>, <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a>) 对，用于管理添加和更改视图。</p>\n<p>例如，如果你想只在变化视图中显示一个特定的内联，你可以覆盖 <code class=\"docutils literal notranslate\">get_formsets_with_inlines</code> 如下：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>MyInline<span class=\"p\">,</span> SomeOtherInline<span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_formsets_with_inlines</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"k\">for</span> inline <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_inline_instances<span class=\"p\">(</span>request<span class=\"p\">,</span> obj<span class=\"p\">):</span>\n            <span class=\"c1\"># hide MyInline in the add view</span>\n            <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span>inline<span class=\"p\">,</span> MyInline<span class=\"p\">)</span> <span class=\"ow\">or</span> obj <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n                <span class=\"k\">yield</span> inline<span class=\"o\">.</span>get_formset<span class=\"p\">(</span>request<span class=\"p\">,</span> obj<span class=\"p\">),</span> inline\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.formfield_for_foreignkey\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">formfield_for_foreignkey</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">db_field</em>, <em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.formfield_for_foreignkey\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">ModelAdmin</code> 上的 <code class=\"docutils literal notranslate\">formfield_for_foreignkey</code> 方法允许你覆盖外键字段的默认 formfield。例如，要根据用户返回这个外键字段的对象子集：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">if</span> db_field<span class=\"o\">.</span>name <span class=\"o\">==</span> <span class=\"s2\">&quot;car&quot;</span><span class=\"p\">:</span>\n            kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;queryset&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> Car<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>owner<span class=\"o\">=</span>request<span class=\"o\">.</span>user<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>formfield_for_foreignkey<span class=\"p\">(</span>db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<p>这使用 <code class=\"docutils literal notranslate\">HttpRequest</code> 实例过滤 <code class=\"docutils literal notranslate\">Car</code> 外键字段，只显示 <code class=\"docutils literal notranslate\">User</code> 实例拥有的汽车。</p>\n<p>对于更复杂的过滤器，你可以使用 <code class=\"docutils literal notranslate\">ModelForm.__init__()</code> 方法来基于你的模型的 <code class=\"docutils literal notranslate\">instance</code> 进行过滤（参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/fields/#fields-which-handle-relationships\"><span class=\"std std-ref\">处理关系的字段</span></a>）。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">CountryAdminForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>fields<span class=\"p\">[</span><span class=\"s2\">&quot;capital&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span>queryset <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>instance<span class=\"o\">.</span>cities<span class=\"o\">.</span>all<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">CountryAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    form <span class=\"o\">=</span> CountryAdminForm\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.formfield_for_manytomany\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">formfield_for_manytomany</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">db_field</em>, <em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.formfield_for_manytomany\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>与 <code class=\"docutils literal notranslate\">formfield_for_foreignkey</code> 方法一样，<code class=\"docutils literal notranslate\">formfield_for_manytomany</code> 方法也可以被重写，以改变多对多字段的默认字段。例如，如果一个车主可以拥有多辆汽车，而汽车可以属于多个车主 —— 多对多关系 —— 你可以过滤 <code class=\"docutils literal notranslate\">Car</code> 外键字段，只显示 <code class=\"docutils literal notranslate\">User</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">if</span> db_field<span class=\"o\">.</span>name <span class=\"o\">==</span> <span class=\"s2\">&quot;cars&quot;</span><span class=\"p\">:</span>\n            kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;queryset&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> Car<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>owner<span class=\"o\">=</span>request<span class=\"o\">.</span>user<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>formfield_for_manytomany<span class=\"p\">(</span>db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.formfield_for_choice_field\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">formfield_for_choice_field</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">db_field</em>, <em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.formfield_for_choice_field\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>与 <code class=\"docutils literal notranslate\">formfield_for_foreignkey</code> 和 <code class=\"docutils literal notranslate\">formfield_for_manytomany</code> 方法一样，<code class=\"docutils literal notranslate\">formfield_for_choice_field</code> 方法可以被重写，以改变已声明选择的字段的默认字段。例如，如果超级用户的选择与普通员工的选择不同，你可以按以下步骤进行：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_choice_field</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">if</span> db_field<span class=\"o\">.</span>name <span class=\"o\">==</span> <span class=\"s2\">&quot;status&quot;</span><span class=\"p\">:</span>\n            kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;choices&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n                <span class=\"p\">(</span><span class=\"s2\">&quot;accepted&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Accepted&quot;</span><span class=\"p\">),</span>\n                <span class=\"p\">(</span><span class=\"s2\">&quot;denied&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Denied&quot;</span><span class=\"p\">),</span>\n            <span class=\"p\">]</span>\n            <span class=\"k\">if</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_superuser<span class=\"p\">:</span>\n                kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;choices&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span>append<span class=\"p\">((</span><span class=\"s2\">&quot;ready&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Ready for deployment&quot;</span><span class=\"p\">))</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>formfield_for_choice_field<span class=\"p\">(</span>db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition-choices-limitations admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">choices</code> 限制</p>\n<p>任何在表单字段上设置的 <code class=\"docutils literal notranslate\">choices</code> 属性将只限于表单字段。如果模型上对应的字段设置了选择，那么提供给表单的选择必须是这些选择的有效子集，否则在保存前对模型本身进行验证时，表单提交将以一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\">ValidationError</code></a> 失败。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_changelist\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_changelist</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_changelist\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回用于列表的 <code class=\"docutils literal notranslate\">Changelist</code> 类。默认情况下，使用的是 <code class=\"docutils literal notranslate\">django.contrib.admin.views.main.ChangeList</code>。通过继承这个类，你可以改变列表的行为。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_changelist_form\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_changelist_form</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_changelist_form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> 类，供变更列表页面中的 <code class=\"docutils literal notranslate\">Formset</code> 使用。要使用一个自定义表单，例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_changelist_form</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">return</span> MyForm\n</code></pre></div>\n<aside class=\"admonition-omit-the-meta-model-attribute admonition\" role=\"note\">\n<p class=\"admonition-title\">省略 <code class=\"docutils literal notranslate\">Meta.model</code> 属性</p>\n<p>如果你在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> 上定义了 <code class=\"docutils literal notranslate\">Meta.model</code> 属性，你也必须定义 <code class=\"docutils literal notranslate\">Meta.fields</code> 属性（或 <code class=\"docutils literal notranslate\">Meta.exclude</code> 属性）。然而，<code class=\"docutils literal notranslate\">ModelAdmin</code> 会忽略这个值，用 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_editable\" title=\"django.contrib.admin.ModelAdmin.list_editable\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.list_editable</code></a> 属性来覆盖它。最简单的解决办法是省略 <code class=\"docutils literal notranslate\">Meta.model</code> 属性，因为 <code class=\"docutils literal notranslate\">ModelAdmin</code> 将提供正确的模型使用。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_changelist_formset\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_changelist_formset</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_changelist_formset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果使用了 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_editable\" title=\"django.contrib.admin.ModelAdmin.list_editable\"><code class=\"xref py py-attr docutils literal notranslate\">list_editable</code></a>，则返回一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#model-formsets\"><span class=\"std std-ref\">ModelFormSet</span></a> 类，供变更列表页面使用。要使用自定义表单集，例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> BaseModelFormSet\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAdminFormSet</span><span class=\"p\">(</span>BaseModelFormSet<span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_changelist_formset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;formset&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> MyAdminFormSet\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_changelist_formset<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.lookup_allowed\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">lookup_allowed</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">lookup</em>, <em class=\"sig-param\">value</em>, <em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.lookup_allowed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>变更列表页面中的对象可以通过 URL 的查询字符串进行过滤。例如 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\">list_filter</code></a> 就是这样工作的。这些查询类似于 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.filter()</code></a> （例如 <code class=\"docutils literal notranslate\">user__email=user&#64;example.com</code>）。由于用户可以对查询字符串中的查找进行操作，因此必须对它们进行处理，以防止未经授权的数据暴露。</p>\n<p><code class=\"docutils literal notranslate\">lookup_allowed()</code> 方法接收来自查询字符串的查找路径（例如，<code class=\"docutils literal notranslate\">'user__email'</code>），相应的值（例如，<code class=\"docutils literal notranslate\">'user&#64;example.com'</code>）和请求，并返回一个布尔值，指示是否允许使用这些参数来过滤 changelist 的 <code class=\"docutils literal notranslate\">QuerySet</code>。如果 <code class=\"docutils literal notranslate\">lookup_allowed()</code> 返回 <code class=\"docutils literal notranslate\">False</code>，将引发 <code class=\"docutils literal notranslate\">DisallowedModelAdminLookup</code> （是 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\">SuspiciousOperation</code></a> 的子类）。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">lookup_allowed()</code> 允许访问模型的本地字段、在 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\">list_filter</code></a> 中使用的字段路径（但不包括 <code class=\"xref py py-meth docutils literal notranslate\"> get_list_filter()</code>）中使用的字段路径，以及 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to\" title=\"django.db.models.ForeignKey.limit_choices_to\"><code class=\"xref py py-attr docutils literal notranslate\">limit_choices_to</code></a> 在 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.raw_id_fields\" title=\"django.contrib.admin.ModelAdmin.raw_id_fields\"><code class=\"xref py py-attr docutils literal notranslate\">raw_id_fields</code></a> 中正确运行所需的查找。</p>\n<p>重写这个方法来定制你的 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> 子类允许的查找。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.has_view_permission\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">has_view_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.has_view_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Should return <code class=\"docutils literal notranslate\">True</code> if the user is permitted to access the change or\nhistory view for <code class=\"docutils literal notranslate\">obj</code>, and <code class=\"docutils literal notranslate\">False</code> otherwise. If obj is <code class=\"docutils literal notranslate\">None</code>,\nshould return <code class=\"docutils literal notranslate\">True</code> or <code class=\"docutils literal notranslate\">False</code> to indicate whether viewing of objects\nof this type is permitted in general (e.g., <code class=\"docutils literal notranslate\">False</code> will be interpreted\nas meaning that the current user is not permitted to view any object of\nthis type).</p>\n<p>如果用户有 “更改” 或 “查看” 权限，默认的实现将返回 <code class=\"docutils literal notranslate\">True</code>。</p>\n<aside class=\"admonition-object-level-view-permissions-aren-t-visibility-filters admonition\" role=\"note\">\n<p class=\"admonition-title\">Object-level view permissions aren't visibility filters</p>\n<p>Object-level view permissions don't prevent information about an object\nfrom appearing elsewhere in the admin, including in the admin\nchangelist, related field choices, autocomplete results, and recent\nactions. To restrict this information, customize the querysets used by\nthe relevant views and form fields.</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.has_add_permission\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">has_add_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.has_add_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果允许添加对象，应返回 <code class=\"docutils literal notranslate\">True</code>，否则返回 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.has_change_permission\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">has_change_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.has_change_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果允许编辑 <code class=\"docutils literal notranslate\">obj</code>，应返回 <code class=\"docutils literal notranslate\">True</code>，否则应返回 <code class=\"docutils literal notranslate\">False</code>。如果 <code class=\"docutils literal notranslate\">obj</code> 是 <code class=\"docutils literal notranslate\">None</code>，应返回 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code> 表示是否允许编辑该类型对象（例如，<code class=\"docutils literal notranslate\">False</code> 将被解释为当前用户不允许编辑该类型的任何对象）。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.has_delete_permission\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">has_delete_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.has_delete_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果允许删除 <code class=\"docutils literal notranslate\">obj</code>，应返回 <code class=\"docutils literal notranslate\">True</code>，否则返回 <code class=\"docutils literal notranslate\">False</code>。如果 <code class=\"docutils literal notranslate\">obj</code> 是 <code class=\"docutils literal notranslate\">None</code>，应返回 <code class=\"docutils literal notranslate\">True</code> 或 <code class=\"docutils literal notranslate\">False</code>，以表明是否允许删除该类型的对象（例如，<code class=\"docutils literal notranslate\">False</code> 将被解释为当前用户不允许删除该类型的任何对象）。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.has_module_permission\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">has_module_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.has_module_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果允许在管理员索引页上显示模块和访问模块的索引页，应该返回 <code class=\"docutils literal notranslate\">True</code>，否则返回 <code class=\"docutils literal notranslate\">False</code>。默认使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/auth/#django.contrib.auth.models.User.has_module_perms\" title=\"django.contrib.auth.models.User.has_module_perms\"><code class=\"xref py py-meth docutils literal notranslate\">User.has_module_perms()</code></a>。覆盖它并不限制对视图的访问，添加、更改或删除视图， <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.has_view_permission\" title=\"django.contrib.admin.ModelAdmin.has_view_permission\"><code class=\"xref py py-meth docutils literal notranslate\">has_view_permission()</code></a>、 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.has_add_permission\" title=\"django.contrib.admin.ModelAdmin.has_add_permission\"><code class=\"xref py py-meth docutils literal notranslate\">has_add_permission()</code></a>、 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.has_change_permission\" title=\"django.contrib.admin.ModelAdmin.has_change_permission\"><code class=\"xref py py-meth docutils literal notranslate\">has_change_permission()</code></a> 和 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.has_delete_permission\" title=\"django.contrib.admin.ModelAdmin.has_delete_permission\"><code class=\"xref py py-meth docutils literal notranslate\">has_delete_permission()</code></a> 应该用于此。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_queryset\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_queryset</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_queryset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">ModelAdmin</code> 上的 <code class=\"docutils literal notranslate\">get_queryset</code> 方法返回一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\">QuerySet</code></a> 的所有模型实例，这些实例可以被管理网站编辑。覆盖该方法的一个用例是显示登录用户拥有的对象：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        qs <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_queryset<span class=\"p\">(</span>request<span class=\"p\">)</span>\n        <span class=\"k\">if</span> request<span class=\"o\">.</span>user<span class=\"o\">.</span>is_superuser<span class=\"p\">:</span>\n            <span class=\"k\">return</span> qs\n        <span class=\"k\">return</span> qs<span class=\"o\">.</span>filter<span class=\"p\">(</span>author<span class=\"o\">=</span>request<span class=\"o\">.</span>user<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.message_user\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">message_user</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">message</em>, <em class=\"sig-param\">level<span class=\"o\">=</span><span class=\"default_value\">messages.INFO</span></em>, <em class=\"sig-param\">extra_tags<span class=\"o\">=</span><span class=\"default_value\">''</span></em>, <em class=\"sig-param\">fail_silently<span class=\"o\">=</span><span class=\"default_value\">False</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.message_user\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sends a message to the user using the <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/messages/#module-django.contrib.messages\" title=\"django.contrib.messages: Provides cookie- and session-based temporary message storage.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.messages</code></a>\nbackend. See the <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/actions/#custom-admin-action\"><span class=\"std std-ref\">custom ModelAdmin example</span></a>.</p>\n<p>关键字参数允许你改变消息的级别，添加额外的 CSS 标签，或者在没有安装 <code class=\"docutils literal notranslate\">contrib.messages</code> 框架的情况下无声地失败。这些关键字参数与 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/messages/#django.contrib.messages.add_message\" title=\"django.contrib.messages.add_message\"><code class=\"xref py py-func docutils literal notranslate\">django.contrib.messages.add_message()</code></a> 的参数一致，更多细节请参见该函数的文档。一个不同的地方是，除了整数／常量之外，级别还可以作为字符串标签传递。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_paginator\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_paginator</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">queryset</em>, <em class=\"sig-param\">per_page</em>, <em class=\"sig-param\">orphans<span class=\"o\">=</span><span class=\"default_value\">0</span></em>, <em class=\"sig-param\">allow_empty_first_page<span class=\"o\">=</span><span class=\"default_value\">True</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_paginator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回要用于该视图的分页器实例。默认情况下，实例化一个 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.paginator\" title=\"django.contrib.admin.ModelAdmin.paginator\"><code class=\"xref py py-attr docutils literal notranslate\">paginator</code></a> 的实例。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.response_add\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">response_add</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj</em>, <em class=\"sig-param\">post_url_continue<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.response_add\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>确定 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.add_view\" title=\"django.contrib.admin.ModelAdmin.add_view\"><code class=\"xref py py-meth docutils literal notranslate\">add_view()</code></a> 阶段的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a>。</p>\n<p><code class=\"docutils literal notranslate\">response_add</code> 在提交管理表单后，对象和所有相关实例被创建和保存后被调用。你可以覆盖它来改变对象创建后的默认行为。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.response_change\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">response_change</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.response_change\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>确定 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.change_view\" title=\"django.contrib.admin.ModelAdmin.change_view\"><code class=\"xref py py-meth docutils literal notranslate\">change_view()</code></a> 阶段的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a>。</p>\n<p><code class=\"docutils literal notranslate\">response_change</code> 在管理表单提交后，对象和所有相关实例被保存后被调用。你可以覆盖它来改变对象被改变后的默认行为。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.response_delete\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">response_delete</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj_display</em>, <em class=\"sig-param\">obj_id</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.response_delete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>为 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.delete_view\" title=\"django.contrib.admin.ModelAdmin.delete_view\"><code class=\"xref py py-meth docutils literal notranslate\">delete_view()</code></a> 阶段确定 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\">HttpResponse</code></a>。</p>\n<p><code class=\"docutils literal notranslate\">response_delete</code> 在对象被删除后被调用。你可以覆盖它来改变对象被删除后的默认行为。</p>\n<p><code class=\"docutils literal notranslate\">obj_display</code> 是删除对象名称的字符串。</p>\n<p><code class=\"docutils literal notranslate\">obj_id</code> 是用于检索要删除的对象的序列化标识符。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_formset_kwargs\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_formset_kwargs</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj</em>, <em class=\"sig-param\">inline</em>, <em class=\"sig-param\">prefix</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_formset_kwargs\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个用于自定义传递给表单集构造函数的关键字参数的钩子。例如，将 <code class=\"docutils literal notranslate\">request</code> 传递给表单集表单：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_formset_kwargs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"p\">,</span> inline<span class=\"p\">,</span> prefix<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"p\">{</span>\n            <span class=\"o\">**</span><span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_formset_kwargs<span class=\"p\">(</span>request<span class=\"p\">,</span> obj<span class=\"p\">,</span> inline<span class=\"p\">,</span> prefix<span class=\"p\">),</span>\n            <span class=\"s2\">&quot;form_kwargs&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;request&quot;</span><span class=\"p\">:</span> request<span class=\"p\">},</span>\n        <span class=\"p\">}</span>\n</code></pre></div>\n<p>你还可以使用它来为表单集表单设置 <code class=\"docutils literal notranslate\">initial</code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_changeform_initial_data\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_changeform_initial_data</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_changeform_initial_data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个钩子，用于管理更改表格的初始数据。默认情况下，字段的初始值来自 <code class=\"docutils literal notranslate\">GET</code> 参数。例如，<code class=\"docutils literal notranslate\">?name=initial_value</code> 将把 <code class=\"docutils literal notranslate\">name</code> 字段的初始值设置为 <code class=\"docutils literal notranslate\">initial_value</code>。</p>\n<p>这个方法应该返回一个形式为 <code class=\"docutils literal notranslate\">{'fieldname': 'fieldval'}</code> 的字典：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">get_changeform_initial_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"p\">{</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;custom_initial_value&quot;</span><span class=\"p\">}</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.get_deleted_objects\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">get_deleted_objects</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">objs</em>, <em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.get_deleted_objects\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A hook for customizing the deletion process of the <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.delete_view\" title=\"django.contrib.admin.ModelAdmin.delete_view\"><code class=\"xref py py-meth docutils literal notranslate\">delete_view()</code></a> and\nthe &quot;delete selected&quot; <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/admin/actions/\"><span class=\"doc\">action</span></a>.</p>\n<p><code class=\"docutils literal notranslate\">objs</code> 参数是要删除的对象（一个 <code class=\"docutils literal notranslate\">QuerySet</code> 或模型实例列表）的等价可迭代对象，<code class=\"docutils literal notranslate\">request</code> 是 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a>。</p>\n<p>这个方法必须返回一个四元元组 <code class=\"docutils literal notranslate\">(delete_objects, model_count, perms_needed, protected)</code>。</p>\n<p><code class=\"docutils literal notranslate\">deleted_objects</code> 是一个代表所有将被删除对象的字符串列表。如果有任何相关的对象要删除，则列表是嵌套的，包括这些相关对象。该列表在模板中使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/templates/builtins/#std-templatefilter-unordered_list\"><code class=\"xref std std-tfilter docutils literal notranslate\">unordered_list</code></a> 过滤器进行格式化。</p>\n<p><code class=\"docutils literal notranslate\">model_count</code> 是一个将每个模型的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name_plural</code></a> 映射到将被删除的对象数量的字典。</p>\n<p><code class=\"docutils literal notranslate\">perms_needed</code> 是一组 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</code></a> 的用户没有权限删除的模型。</p>\n<p><code class=\"docutils literal notranslate\">protected</code> 是一个字符串列表，代表所有不能删除的受保护相关对象。该列表显示在模板中。</p>\n</dd></dl>\n\n<section id=\"other-methods\">\n<h4>其他方法<a class=\"heading-anchor\" href=\"#other-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.add_view\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">add_view</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">form_url<span class=\"o\">=</span><span class=\"default_value\">''</span></em>, <em class=\"sig-param\">extra_context<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.add_view\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型实例添加页面的 Django 视图。见下面的说明。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.change_view\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">change_view</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">object_id</em>, <em class=\"sig-param\">form_url<span class=\"o\">=</span><span class=\"default_value\">''</span></em>, <em class=\"sig-param\">extra_context<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.change_view\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型实例编辑页面的 Django 视图。见下面的说明。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.changelist_view\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">changelist_view</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">extra_context<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.changelist_view\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型实例变更列表／动作页面的 Django 视图。见下面的说明。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.delete_view\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">delete_view</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">object_id</em>, <em class=\"sig-param\">extra_context<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.delete_view\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型实例删除确认页面的 Django 视图。参见下面的说明。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.ModelAdmin.history_view\">\n<span class=\"sig-prename descclassname\">ModelAdmin.</span><span class=\"sig-name descname\">history_view</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">object_id</em>, <em class=\"sig-param\">extra_context<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.ModelAdmin.history_view\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Django 视图用于显示给定模型实例的修改历史的页面。</p>\n</dd></dl>\n\n<p>与上一节中详细介绍的钩子类型的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 方法不同，这五个方法实际上是被设计成作为 Django 视图从管理应用的 URL 调度处理程序中调用，以渲染处理模型实例 CRUD 操作的页面。因此，完全覆盖这些方法将显著改变管理员应用程序的行为。</p>\n<p>覆盖这些方法的一个常见原因是为了增强提供给渲染视图的模板的上下文数据。在下面的例子中，更改视图被覆盖，以便为渲染模板提供一些额外的映射数据，否则这些数据将无法使用：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"c1\"># A template for a very customized change view:</span>\n    change_form_template <span class=\"o\">=</span> <span class=\"s2\">&quot;admin/myapp/extras/openstreetmap_change_form.html&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_osm_info</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">change_view</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> object_id<span class=\"p\">,</span> form_url<span class=\"o\">=</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> extra_context<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        extra_context <span class=\"o\">=</span> extra_context <span class=\"ow\">or</span> <span class=\"p\">{}</span>\n        extra_context<span class=\"p\">[</span><span class=\"s2\">&quot;osm_data&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_osm_info<span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>change_view<span class=\"p\">(</span>\n            request<span class=\"p\">,</span>\n            object_id<span class=\"p\">,</span>\n            form_url<span class=\"p\">,</span>\n            extra_context<span class=\"o\">=</span>extra_context<span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>这些视图返回 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\">TemplateResponse</code></a> 实例，允许你在渲染前轻松定制响应数据。更多细节，请看 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/template-response/\"><span class=\"doc\">TemplateResponse 文档</span></a>。</p>\n</section>\n</section>\n<section id=\"modeladmin-asset-definitions\">\n<span id=\"id1\"></span><h3><code class=\"docutils literal notranslate\">ModelAdmin</code> 静态资源定义<a class=\"heading-anchor\" href=\"#modeladmin-asset-definitions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>有时你会想在添加／更改视图时添加一点 CSS 和／或 JavaScript。这可以通过在你的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 上使用 <code class=\"docutils literal notranslate\">Media</code> 内类来实现：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Media</span><span class=\"p\">:</span>\n        css <span class=\"o\">=</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;all&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;my_styles.css&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">}</span>\n        js <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;my_code.js&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/staticfiles/\"><span class=\"doc\">staticfiles app</span></a> 将 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-STATIC_URL\"><code class=\"xref std std-setting docutils literal notranslate\">STATIC_URL</code></a> （如果 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-STATIC_URL\"><code class=\"xref std std-setting docutils literal notranslate\">STATIC_URL</code></a> 是 <code class=\"docutils literal notranslate\">None</code>，则 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\">MEDIA_URL</code></a>）预先加入任何资产路径。同样的规则适用于:ref:表单上定义的静态资源 &lt;form-asset-paths&gt;。</p>\n<section id=\"jquery\">\n<span id=\"contrib-admin-jquery\"></span><h4>jQuery<a class=\"heading-anchor\" href=\"#jquery\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django 管理 JavaScript 使用了 <a class=\"reference external\" href=\"https://jquery.com\">jQuery</a> 库。</p>\n<p>为了避免与用户提供的脚本或库冲突，Django 的 jQuery（版本3.7.1）被命名为 <code class=\"docutils literal notranslate\">django.jQuery</code>。如果你想在自己的管理 JavaScript 中使用 jQuery，而不需要包含第二个副本，你可以在 changelist 和 add/edit 视图上使用 <code class=\"docutils literal notranslate\">django.jQuery</code> 对象。此外，依赖于 <code class=\"docutils literal notranslate\">django.jQuery</code> 的自己的管理表单或小部件在 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/media/#assets-as-a-static-definition\"><span class=\"std std-ref\">声明表单媒体资产</span></a> 时必须指定 <code class=\"docutils literal notranslate\">js=['admin/js/jquery.init.js', …]</code>。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> 类默认需要 jQuery，所以除非你有特殊需要，否则不需要将 jQuery 添加到你的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 的媒体资源列表中。例如，如果你要求 jQuery 库在全局命名空间中（例如在使用第三方 jQuery 插件时），或者你需要一个较新版本的 jQuery，你将不得不包含自己的副本。</p>\n<p>Django 提供了 jQuery 的非压缩和 “最小化” 版本，分别为 <code class=\"docutils literal notranslate\">jquery.js</code> 和 <code class=\"docutils literal notranslate\">jquery.min.js</code>。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> 和 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a> 有一个 <code class=\"docutils literal notranslate\">media</code> 属性，它返回一个 <code class=\"docutils literal notranslate\">Media</code> 对象的列表，其中存储了表单和／或表单集的 JavaScript 文件的路径。如果 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</code></a> 是 <code class=\"docutils literal notranslate\">True</code>，它将返回各种 JavaScript 文件的未压缩版本，包括 <code class=\"docutils literal notranslate\">jquery.js</code>；如果不是，它将返回 “最小化” 版本。</p>\n</section>\n</section>\n</section>\n<section id=\"inlinemodeladmin-objects\">\n<span id=\"admin-inlines\"></span><h2><code class=\"docutils literal notranslate\">InlineModelAdmin</code> 对象<a class=\"heading-anchor\" href=\"#inlinemodeladmin-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">InlineModelAdmin</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.TabularInline\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TabularInline</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.TabularInline\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.StackedInline\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">StackedInline</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.StackedInline\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>管理界面可以在同一页面上与父模型编辑模型。这些被称为内联。假设你有这两个模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Author</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Book</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    author <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Author<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    title <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>你可以在作者页面上编辑作者撰写的书籍。你可以通过在 <code class=\"docutils literal notranslate\">ModelAdmin.inlines</code> 中指定内联来添加到模型中：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author<span class=\"p\">,</span> Book\n\n\n<span class=\"k\">class</span> <span class=\"nc\">BookInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Book\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>\n        BookInline<span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Author<span class=\"p\">,</span> AuthorAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>Django 提供了两个 <code class=\"docutils literal notranslate\">InlineModelAdmin</code> 的子类，它们是：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.TabularInline\" title=\"django.contrib.admin.TabularInline\"><code class=\"xref py py-class docutils literal notranslate\">TabularInline</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.StackedInline\" title=\"django.contrib.admin.StackedInline\"><code class=\"xref py py-class docutils literal notranslate\">StackedInline</code></a></p></li>\n</ul>\n<p>这两者之间的区别仅仅是用于呈现它们的模板。</p>\n</dd></dl>\n\n<section id=\"inlinemodeladmin-options\">\n<h3><code class=\"docutils literal notranslate\">InlineModelAdmin</code> 选项<a class=\"heading-anchor\" href=\"#inlinemodeladmin-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">InlineModelAdmin</code> 与 <code class=\"docutils literal notranslate\">ModelAdmin</code> 共享许多相同的功能，并增加了一些自己的功能（共享功能实际上是在 <code class=\"docutils literal notranslate\">BaseModelAdmin</code> 超级类中定义的）。共享的功能有：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.form\" title=\"django.contrib.admin.InlineModelAdmin.form\"><code class=\"xref py py-attr docutils literal notranslate\">form</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\">fieldsets</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fields\" title=\"django.contrib.admin.ModelAdmin.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.formfield_overrides\" title=\"django.contrib.admin.ModelAdmin.formfield_overrides\"><code class=\"xref py py-attr docutils literal notranslate\">formfield_overrides</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.delete_confirmation_max_display\" title=\"django.contrib.admin.ModelAdmin.delete_confirmation_max_display\"><code class=\"xref py py-attr docutils literal notranslate\">delete_confirmation_max_display</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.exclude\" title=\"django.contrib.admin.ModelAdmin.exclude\"><code class=\"xref py py-attr docutils literal notranslate\">exclude</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.filter_horizontal\" title=\"django.contrib.admin.ModelAdmin.filter_horizontal\"><code class=\"xref py py-attr docutils literal notranslate\">filter_horizontal</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.filter_vertical\" title=\"django.contrib.admin.ModelAdmin.filter_vertical\"><code class=\"xref py py-attr docutils literal notranslate\">filter_vertical</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.ordering\" title=\"django.contrib.admin.ModelAdmin.ordering\"><code class=\"xref py py-attr docutils literal notranslate\">ordering</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.prepopulated_fields\" title=\"django.contrib.admin.ModelAdmin.prepopulated_fields\"><code class=\"xref py py-attr docutils literal notranslate\">prepopulated_fields</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_exclude\" title=\"django.contrib.admin.ModelAdmin.get_exclude\"><code class=\"xref py py-meth docutils literal notranslate\">get_exclude()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_fieldsets\" title=\"django.contrib.admin.ModelAdmin.get_fieldsets\"><code class=\"xref py py-meth docutils literal notranslate\">get_fieldsets()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_queryset\" title=\"django.contrib.admin.ModelAdmin.get_queryset\"><code class=\"xref py py-meth docutils literal notranslate\">get_queryset()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.radio_fields\" title=\"django.contrib.admin.ModelAdmin.radio_fields\"><code class=\"xref py py-attr docutils literal notranslate\">radio_fields</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">readonly_fields</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.view_on_site\" title=\"django.contrib.admin.ModelAdmin.view_on_site\"><code class=\"xref py py-attr docutils literal notranslate\">view_on_site</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.empty_value_display\" title=\"django.contrib.admin.ModelAdmin.empty_value_display\"><code class=\"xref py py-attr docutils literal notranslate\">empty_value_display</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.autocomplete_fields\" title=\"django.contrib.admin.ModelAdmin.autocomplete_fields\"><code class=\"xref py py-attr docutils literal notranslate\">autocomplete_fields</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.raw_id_fields\" title=\"django.contrib.admin.InlineModelAdmin.raw_id_fields\"><code class=\"xref py py-attr docutils literal notranslate\">raw_id_fields</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.formfield_for_choice_field\" title=\"django.contrib.admin.ModelAdmin.formfield_for_choice_field\"><code class=\"xref py py-meth docutils literal notranslate\">formfield_for_choice_field()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.formfield_for_foreignkey\" title=\"django.contrib.admin.ModelAdmin.formfield_for_foreignkey\"><code class=\"xref py py-meth docutils literal notranslate\">formfield_for_foreignkey()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.formfield_for_manytomany\" title=\"django.contrib.admin.ModelAdmin.formfield_for_manytomany\"><code class=\"xref py py-meth docutils literal notranslate\">formfield_for_manytomany()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.has_module_permission\" title=\"django.contrib.admin.ModelAdmin.has_module_permission\"><code class=\"xref py py-meth docutils literal notranslate\">has_module_permission()</code></a></p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\">InlineModelAdmin</code> 类添加或自定义：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.model\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">model</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.model\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>内联使用的模型。这是必须的。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.fk_name\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">fk_name</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.fk_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>模型上外键的名称。在大多数情况下会自动处理，但如果同一父模型有多个外键，则必须明确指定 <code class=\"docutils literal notranslate\">fk_name</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.formset\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">formset</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.formset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认为 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.models.BaseInlineFormSet\" title=\"django.forms.models.BaseInlineFormSet\"><code class=\"xref py py-class docutils literal notranslate\">BaseInlineFormSet</code></a>。使用你自己的表单集可以给你提供很多定制的可能性。内联是围绕 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#model-formsets\"><span class=\"std std-ref\">模型表单集</span></a> 建立的。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.form\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">form</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">form</code> 的值默认为 <code class=\"docutils literal notranslate\">ModelForm</code>。当为这个内联创建表单集时，会通过 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/models/#django.forms.models.inlineformset_factory\" title=\"django.forms.models.inlineformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">inlineformset_factory()</code></a> 传递这个值。</p>\n<p>示例请参见 <a class=\"reference internal\" href=\"#admin-custom-validation\"><span class=\"std std-ref\">在管理中添加自定义验证</span></a> 一节。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>当为 <code class=\"docutils literal notranslate\">InlineModelAdmin</code> 表单编写自定义验证时，要谨慎编写依赖于父模型特征的验证。如果父模型未能验证，它可能会处于不一致的状态，如 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#validation-on-modelform\"><span class=\"std std-ref\">验证 ModelForm</span></a> 中的警告所述。</p>\n</aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.classes\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">classes</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.classes\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个包含额外 CSS 类的列表或元组，用于应用到为内联渲染的 fieldset。默认为 <code class=\"docutils literal notranslate\">None</code>。与在 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\">fieldsets</code></a> 中配置的 classes 一样，具有 <code class=\"docutils literal notranslate\">collapse</code> 类的内联将使用可展开的小部件初始折叠。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.extra\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">extra</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.extra\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>控制表单集在初始表格之外显示的额外表单数量，默认为 3 个。更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/formsets/\"><span class=\"doc\">表单集文档</span></a>。</p>\n<p>对于使用支持 JavaScript 的浏览器的用户，提供了一个 “添加另一个” 的链接，以便在 <code class=\"docutils literal notranslate\">extra</code> 参数提供的内联行之外，再添加任意数量的内联行。</p>\n<p>如果当前显示的表单数量超过 <code class=\"docutils literal notranslate\">max_num</code>，或者用户没有启用 JavaScript，动态链接将不会出现。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.get_extra\" title=\"django.contrib.admin.InlineModelAdmin.get_extra\"><code class=\"xref py py-meth docutils literal notranslate\">InlineModelAdmin.get_extra()</code></a> 还允许你自定义额外表格的数量。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.max_num\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">max_num</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.max_num\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这控制了内联中显示表单的最大数量。这并不直接与对象的数量相关，但如果该值足够小，则可以。更多信息请参见 <span class=\"xref std std-ref\">model-formets-max-num</span>。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.get_max_num\" title=\"django.contrib.admin.InlineModelAdmin.get_max_num\"><code class=\"xref py py-meth docutils literal notranslate\">InlineModelAdmin.get_max_num()</code></a> 还允许你自定义额外表单的最大数量。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.min_num\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">min_num</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.min_num\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这控制了内联中要显示的表单的最少数量。更多信息请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/models/#django.forms.models.modelformset_factory\" title=\"django.forms.models.modelformset_factory\"><code class=\"xref py py-func docutils literal notranslate\">modelformset_factory()</code></a>。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.get_min_num\" title=\"django.contrib.admin.InlineModelAdmin.get_min_num\"><code class=\"xref py py-meth docutils literal notranslate\">InlineModelAdmin.get_min_num()</code></a> 还允许你自定义显示的最小表单数量。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.raw_id_fields\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">raw_id_fields</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.raw_id_fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认情况下，Django 的管理员对 <code class=\"docutils literal notranslate\">ForeignKey</code> 的字段使用选择框接口（&lt;select&gt;）。有时候，你不想产生必须选择所有相关的实例来显示在下拉框中的开销。</p>\n<p><code class=\"docutils literal notranslate\">raw_id_fields</code> 是你想改变为 <code class=\"docutils literal notranslate\">ForeignKey</code> 或 <code class=\"docutils literal notranslate\">ManyToManyField</code> 的 <code class=\"docutils literal notranslate\">Input</code> 部件的字段列表：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">BookInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Book\n    raw_id_fields <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pages&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.template\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于在页面上呈现内联的模板。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.verbose_name\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">verbose_name</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.verbose_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对模型内部 <code class=\"docutils literal notranslate\">Meta</code> 类中的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</code></a> 的重写。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.verbose_name_plural\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">verbose_name_plural</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.verbose_name_plural\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name_plural</code></a> 的重写，来自模型内部的 <code class=\"docutils literal notranslate\">Meta</code> 类。如果这个没有给出，而 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.verbose_name\" title=\"django.contrib.admin.InlineModelAdmin.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">InlineModelAdmin.verbose_name</code></a> 被定义，Django 将使用 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.verbose_name\" title=\"django.contrib.admin.InlineModelAdmin.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">InlineModelAdmin.verbose_name</code></a> + <code class=\"docutils literal notranslate\">'s'</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.can_delete\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">can_delete</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.can_delete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指定是否可以在内联中删除内联对象。默认为 <code class=\"docutils literal notranslate\">True</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.show_change_link\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">show_change_link</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.show_change_link\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指定在管理中可以更改的内联对象是否有更改表单的链接。默认为 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.get_formset\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">get_formset</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.get_formset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.models.BaseInlineFormSet\" title=\"django.forms.models.BaseInlineFormSet\"><code class=\"xref py py-class docutils literal notranslate\">BaseInlineFormSet</code></a> 类，用于管理添加／更改视图。<code class=\"docutils literal notranslate\">obj</code> 是被编辑的父对象，或者当添加一个新的父对象时，返回 <code class=\"docutils literal notranslate\">None</code>。参见 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_formsets_with_inlines\" title=\"django.contrib.admin.ModelAdmin.get_formsets_with_inlines\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin.get_formsets_with_inlines</code></a> 的例子。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.get_extra\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">get_extra</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.get_extra\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回要使用的额外内联表单的数量。默认情况下，返回 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.extra\" title=\"django.contrib.admin.InlineModelAdmin.extra\"><code class=\"xref py py-attr docutils literal notranslate\">InlineModelAdmin.extra</code></a> 属性。</p>\n<p>重写此方法，以编程方式确定额外内联表格的数量。例如，可以根据模型实例（作为关键字参数 <code class=\"docutils literal notranslate\">obj</code> 传递）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">BinaryTreeAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> BinaryTree\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_extra</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        extra <span class=\"o\">=</span> <span class=\"mi\">2</span>\n        <span class=\"k\">if</span> obj<span class=\"p\">:</span>\n            <span class=\"k\">return</span> extra <span class=\"o\">-</span> obj<span class=\"o\">.</span>binarytree_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n        <span class=\"k\">return</span> extra\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.get_max_num\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">get_max_num</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.get_max_num\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回要使用的额外内联表单的最大数量。默认情况下，返回 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.max_num\" title=\"django.contrib.admin.InlineModelAdmin.max_num\"><code class=\"xref py py-attr docutils literal notranslate\">InlineModelAdmin.max_num</code></a> 属性。</p>\n<p>重写此方法，以编程方式确定内联表格的最大数量。例如，可以根据模型实例（作为关键字参数 <code class=\"docutils literal notranslate\">obj</code> 传递）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">BinaryTreeAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> BinaryTree\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_max_num</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        max_num <span class=\"o\">=</span> <span class=\"mi\">10</span>\n        <span class=\"k\">if</span> obj <span class=\"ow\">and</span> obj<span class=\"o\">.</span>parent<span class=\"p\">:</span>\n            <span class=\"k\">return</span> max_num <span class=\"o\">-</span> <span class=\"mi\">5</span>\n        <span class=\"k\">return</span> max_num\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.get_min_num\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">get_min_num</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.get_min_num\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回要使用的内联表单的最小数量。默认情况下，返回 <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin.min_num\" title=\"django.contrib.admin.InlineModelAdmin.min_num\"><code class=\"xref py py-attr docutils literal notranslate\">InlineModelAdmin.min_num</code></a> 属性。</p>\n<p>重写此方法，以编程方式确定内联表格的最少数量。例如，这可以基于模型实例（作为关键字参数 <code class=\"docutils literal notranslate\">obj</code> 传递）。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.has_add_permission\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">has_add_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.has_add_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果允许添加内联对象，应返回 <code class=\"docutils literal notranslate\">True</code>，否则返回 <code class=\"docutils literal notranslate\">False</code>。<code class=\"docutils literal notranslate\">obj</code> 是被编辑的父对象，或者当添加一个新的父对象时返回 <code class=\"docutils literal notranslate\">None</code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.has_change_permission\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">has_change_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.has_change_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果允许编辑内联对象，应返回 <code class=\"docutils literal notranslate\">True</code>，否则返回 <code class=\"docutils literal notranslate\">False</code>。<code class=\"docutils literal notranslate\">obj</code> 是被编辑的父对象。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.InlineModelAdmin.has_delete_permission\">\n<span class=\"sig-prename descclassname\">InlineModelAdmin.</span><span class=\"sig-name descname\">has_delete_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">obj<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.InlineModelAdmin.has_delete_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果允许删除内联对象，应返回 <code class=\"docutils literal notranslate\">True</code>，否则返回 <code class=\"docutils literal notranslate\">False</code>。<code class=\"docutils literal notranslate\">obj</code> 是被编辑的父对象。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>传递给 <code class=\"docutils literal notranslate\">InlineModelAdmin</code> 方法的 <code class=\"docutils literal notranslate\">obj</code> 参数是被编辑的父对象，或者在添加新父对象时是 <code class=\"docutils literal notranslate\">None</code>。</p>\n</aside>\n</section>\n<section id=\"working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model\">\n<h3>与有两个或更多外键到同一父模型的模型一起工作<a class=\"heading-anchor\" href=\"#working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>有时同一个模型可以有多个外键。以这个模型为例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Friendship</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    to_person <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Person<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span> related_name<span class=\"o\">=</span><span class=\"s2\">&quot;friends&quot;</span>\n    <span class=\"p\">)</span>\n    from_person <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        Person<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span> related_name<span class=\"o\">=</span><span class=\"s2\">&quot;from_friends&quot;</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你想在 <code class=\"docutils literal notranslate\">Person</code> 管理添加／更改页面上显示内联，你需要明确定义外键，因为它不能自动这样做：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Friendship<span class=\"p\">,</span> Person\n\n\n<span class=\"k\">class</span> <span class=\"nc\">FriendshipInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Friendship\n    fk_name <span class=\"o\">=</span> <span class=\"s2\">&quot;to_person&quot;</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>\n        FriendshipInline<span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Person<span class=\"p\">,</span> PersonAdmin<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"working-with-many-to-many-models\">\n<h3>与多对多模型一起工作<a class=\"heading-anchor\" href=\"#working-with-many-to-many-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>默认情况下，多对多关系的管理部件将显示在哪个模型上，包含对 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> 的实际引用。根据你的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 定义，你模型中的每个多对多字段将由一个标准的 HTML <code class=\"docutils literal notranslate\">&lt;select multiple&gt;</code>，一个水平或垂直过滤器，或一个 <code class=\"docutils literal notranslate\">raw_id_fields</code> 小部件来表示。然而，也可以用内联来代替这些部件。</p>\n<p>假设我们有以下模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Group</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">)</span>\n    members <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Person<span class=\"p\">,</span> related_name<span class=\"o\">=</span><span class=\"s2\">&quot;groups&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你想使用内联显示多对多关系，你可以通过为关系定义一个 <code class=\"docutils literal notranslate\">InlineModelAdmin</code> 对象来实现：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Group\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MembershipInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Group<span class=\"o\">.</span>members<span class=\"o\">.</span>through\n\n\n<span class=\"k\">class</span> <span class=\"nc\">GroupAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>\n        MembershipInline<span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n    exclude <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;members&quot;</span><span class=\"p\">]</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Group<span class=\"p\">,</span> GroupAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>在这个例子中，有两个特点值得注意。</p>\n<p>首先 <code class=\"docutils literal notranslate\">MembershipInline</code> 类引用 <code class=\"docutils literal notranslate\">Group.members.through</code>。<code class=\"docutils literal notranslate\">through</code> 属性是对管理多对多关系的模型的引用。当你定义一个多对多字段时，这个模型是由 Django 自动创建的。</p>\n<p>其次，<code class=\"docutils literal notranslate\">GroupAdmin</code> 必须手动排除 <code class=\"docutils literal notranslate\">members</code> 字段。Django 会在定义关系的模型上显示一个多对多字段的管理部件（在本例中是 <code class=\"docutils literal notranslate\">Group</code>）。如果你想使用一个内联模型来表示多对多关系，你必须告诉 Django 的管理 <em>不要</em> 显示这个部件，否则你将在你的管理页面上有两个部件来管理这个关系。</p>\n<p>请注意，当使用这种技术时， <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/signals/#django.db.models.signals.m2m_changed\" title=\"django.db.models.signals.m2m_changed\"><code class=\"xref py py-data docutils literal notranslate\">m2m_changed</code></a> 信号并没有被触发。这是因为对于管理来说，<code class=\"docutils literal notranslate\">through</code> 只是一个有两个外键字段的模型，而不是一个多对多的关系。</p>\n<p>在所有其他方面，<code class=\"docutils literal notranslate\">InlineModelAdmin</code> 和其他的完全一样。你可以使用任何正常的 <code class=\"docutils literal notranslate\">ModelAdmin</code> 属性自定义外观。</p>\n</section>\n<section id=\"working-with-many-to-many-intermediary-models\">\n<h3>与多对多中间模型一起工作<a class=\"heading-anchor\" href=\"#working-with-many-to-many-intermediary-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>当你使用 <code class=\"xref py py-class docutils literal notranslate\">ManyToManyField`的``through</code> 参数指定一个中介模型时，管理默认不会显示一个部件。这是因为该中介模型的每一个实例所需要的信息比单个部件所能显示的信息要多，而且多个部件所需要的布局会根据中介模型的不同而不同。</p>\n<p>然而，我们仍然希望能够在线编辑这些信息。幸运的是，我们可以通过内联管理模型来实现这一点。假设我们有以下模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Person</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Group</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">128</span><span class=\"p\">)</span>\n    members <span class=\"o\">=</span> models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>Person<span class=\"p\">,</span> through<span class=\"o\">=</span><span class=\"s2\">&quot;Membership&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Membership</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    person <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Person<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    group <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Group<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    date_joined <span class=\"o\">=</span> models<span class=\"o\">.</span>DateField<span class=\"p\">()</span>\n    invite_reason <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">64</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        constraints <span class=\"o\">=</span> <span class=\"p\">[</span>\n            models<span class=\"o\">.</span>UniqueConstraint<span class=\"p\">(</span>\n                fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;person&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;group&quot;</span><span class=\"p\">],</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_person_group&quot;</span>\n            <span class=\"p\">)</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n<p>在管理中显示这个中间模型的第一步是为 <code class=\"docutils literal notranslate\">Membership</code> 模型定义一个内联类：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MembershipInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Membership\n    extra <span class=\"o\">=</span> <span class=\"mi\">1</span>\n</code></pre></div>\n<p>这个例子对 <code class=\"docutils literal notranslate\">Membership</code> 模型使用默认的 <code class=\"docutils literal notranslate\">InlineModelAdmin</code> 值，并将额外的添加表单限制为一个。这可以使用 <code class=\"docutils literal notranslate\">InlineModelAdmin</code> 类的任何可用选项来定制。</p>\n<p>现在为 <code class=\"docutils literal notranslate\">Person</code> 和 <code class=\"docutils literal notranslate\">Group</code> 模型创建管理视图：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>MembershipInline<span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">GroupAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>MembershipInline<span class=\"p\">]</span>\n</code></pre></div>\n<p>最后，在管理网站上注册你的 <code class=\"docutils literal notranslate\">Person</code> 和 <code class=\"docutils literal notranslate\">Group</code> 模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>admin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Person<span class=\"p\">,</span> PersonAdmin<span class=\"p\">)</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Group<span class=\"p\">,</span> GroupAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>现在你的管理网站已经设置好了，可以在 <code class=\"docutils literal notranslate\">Person</code> 或 <code class=\"docutils literal notranslate\">Group</code> 的详情页中在线编辑  <code class=\"docutils literal notranslate\">Membership</code> 对象。</p>\n</section>\n<section id=\"using-generic-relations-as-an-inline\">\n<span id=\"id3\"></span><h3>使用通用关系作为内联<a class=\"heading-anchor\" href=\"#using-generic-relations-as-an-inline\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>可以用一个内联与通用相关的对象。假设你有以下模型：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.contenttypes.fields</span> <span class=\"kn\">import</span> GenericForeignKey\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.contenttypes.models</span> <span class=\"kn\">import</span> ContentType\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Image</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    image <span class=\"o\">=</span> models<span class=\"o\">.</span>ImageField<span class=\"p\">(</span>upload_to<span class=\"o\">=</span><span class=\"s2\">&quot;images&quot;</span><span class=\"p\">)</span>\n    content_type <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>ContentType<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    object_id <span class=\"o\">=</span> models<span class=\"o\">.</span>PositiveIntegerField<span class=\"p\">()</span>\n    content_object <span class=\"o\">=</span> GenericForeignKey<span class=\"p\">(</span><span class=\"s2\">&quot;content_type&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;object_id&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Product</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>如果你想允许在 <code class=\"docutils literal notranslate\">Product</code> 上编辑和创建一个 <code class=\"docutils literal notranslate\">Image</code> 实例，添加／更改视图，你可以使用由 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#module-django.contrib.contenttypes.admin\" title=\"django.contrib.contenttypes.admin\"><code class=\"xref py py-mod docutils literal notranslate\">admin</code></a> 提供的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.admin.GenericTabularInline\" title=\"django.contrib.contenttypes.admin.GenericTabularInline\"><code class=\"xref py py-class docutils literal notranslate\">GenericTabularInline</code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.admin.GenericStackedInline\" title=\"django.contrib.contenttypes.admin.GenericStackedInline\"><code class=\"xref py py-class docutils literal notranslate\">GenericStackedInline</code></a> （都是 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.admin.GenericInlineModelAdmin\" title=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">GenericInlineModelAdmin</code></a> 的子类）。它们分别为代表内联对象的表单实现了表格式和堆栈式的可视化布局，就像它们的非通用对应物一样。它们的行为就像其他内联一样。在你的 <code class=\"docutils literal notranslate\">admin.py</code> 中，对于这个示例应用程序：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.contenttypes.admin</span> <span class=\"kn\">import</span> GenericTabularInline\n\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Image<span class=\"p\">,</span> Product\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ImageInline</span><span class=\"p\">(</span>GenericTabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Image\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ProductAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>\n        ImageInline<span class=\"p\">,</span>\n    <span class=\"p\">]</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Product<span class=\"p\">,</span> ProductAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>更多具体信息请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/\"><span class=\"doc\">contenttypes 文档</span></a>。</p>\n</section>\n</section>\n<section id=\"adding-custom-validation-to-the-admin\">\n<span id=\"admin-custom-validation\"></span><h2>在管理中添加自定义验证<a class=\"heading-anchor\" href=\"#adding-custom-validation-to-the-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The admin uses <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a>. To add custom validation,\nprovide your own <code class=\"docutils literal notranslate\">ModelForm</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ModelForm<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">clean_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># do something that validates your data</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Then configure the <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> to use the form:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    form <span class=\"o\">=</span> ArticleForm\n</code></pre></div>\n<p>Or configure an <a class=\"reference internal\" href=\"#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a> to use the form:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">ArticleInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Article\n    form <span class=\"o\">=</span> ArticleForm\n</code></pre></div>\n<p>It is important that you use a <code class=\"docutils literal notranslate\">ModelForm</code>; otherwise things can break. See\nthe <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/\"><span class=\"doc\">forms</span></a> documentation on <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/forms/validation/\"><span class=\"doc\">custom validation</span></a> and, more specifically, the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/topics/forms/modelforms/#overriding-modelform-clean-method\"><span class=\"std std-ref\">model form validation notes</span></a> for more\ninformation.</p>\n</section>\n<section id=\"overriding-admin-templates\">\n<span id=\"admin-overriding-templates\"></span><h2>覆盖管理模板<a class=\"heading-anchor\" href=\"#overriding-admin-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>你可以覆盖许多模板，管理模块用于生成管理网站的各种页面。你甚至可以为特定的应用程序或特定的模型覆盖其中的一些模板。</p>\n<section id=\"set-up-your-project-s-admin-template-directories\">\n<h3>Set up your project's admin template directories<a class=\"heading-anchor\" href=\"#set-up-your-project-s-admin-template-directories\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>管理员模板文件位于 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/admin/templates/admin\">django/contrib/admin/templates/admin</a> 目录中。</p>\n<p>为了覆盖其中的一个或多个目录，首先在你的项目的 <code class=\"docutils literal notranslate\">templates</code> 目录下创建一个 <code class=\"docutils literal notranslate\">admin</code> 目录。这个目录可以是你在 <code class=\"docutils literal notranslate\">DjangoTemplates</code> 后台的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\">DIRS</code></a> 选项中指定的任何一个目录。如果你自定义了 <code class=\"docutils literal notranslate\">'loaders'</code> 选项，请确保 <code class=\"docutils literal notranslate\">'django.template.loaders.filesystem.Loader'</code> 出现在 <code class=\"docutils literal notranslate\">'django.template.loaders.app_directories.Loader'</code> 之前，这样你的自定义模板就会被模板加载系统发现，而不是 <a class=\"reference internal\" href=\"#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a> 所包含的模板。</p>\n<p>在这个 <code class=\"docutils literal notranslate\">admin</code> 目录中，创建以你的应用程序命名的子目录。在这些应用程序子目录中，创建以你的模型命名的子目录。注意，管理员应用程序在查找目录时，会将模型名称小写，所以如果你要在大小写敏感的文件系统上运行应用程序，请确保你将目录命名为所有小写。</p>\n<p>要为特定的应用程序覆盖管理员模板，请从 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/admin/templates/admin\">django/contrib/admin/templates/admin</a> 目录中复制并编辑模板，然后将其保存到刚刚创建的目录之一。</p>\n<p>例如，如果我们想在名为 <code class=\"docutils literal notranslate\">my_app</code> 的应用程序中的所有模型的变更列表视图中添加一个工具，我们会将 <code class=\"docutils literal notranslate\">contrib/admin/templates/admin/change_list.html</code> 复制到我们项目的 <code class=\"docutils literal notranslate\">templates/admin/my_app/</code> 目录下，并进行任何必要的更改。</p>\n<p>如果我们想只为名为 <code class=\"docutils literal notranslate\">Page</code> 的特定模型在变更列表视图中添加一个工具，我们会将同样的文件复制到项目的 <code class=\"docutils literal notranslate\">templates/admin/my_app/page</code> 目录下。</p>\n</section>\n<section id=\"overriding-vs-replacing-an-admin-template\">\n<h3>覆盖 vs. 替换管理模板<a class=\"heading-anchor\" href=\"#overriding-vs-replacing-an-admin-template\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>由于管理模板的模块化设计，通常没有必要也不建议更换整个模板。最好是只覆盖你需要更改的模板部分。</p>\n<p>继续上面的例子，我们想在 <code class=\"docutils literal notranslate\">History</code> 工具旁边为 <code class=\"docutils literal notranslate\">Page</code> 模型添加一个新的链接。在看了 <code class=\"docutils literal notranslate\">change_form.html</code> 后，我们确定我们只需要覆盖 <code class=\"docutils literal notranslate\">object-tools-items</code> 块。因此这里是我们新的 <code class=\"docutils literal notranslate\">change_form.html</code>。</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;admin/change_form.html&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"nv\">admin_urls</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">object-tools-items</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"nv\">opts</span><span class=\"o\">|</span><span class=\"nf\">admin_urlname</span><span class=\"s1\">:&#39;history&#39;</span> <span class=\"nv\">original.pk</span><span class=\"o\">|</span><span class=\"nf\">admin_urlquote</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;historylink&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;History&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;mylink/&quot;</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;historylink&quot;</span><span class=\"p\">&gt;</span>My Link<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">has_absolute_url</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;admin:view_on_site&#39;</span> <span class=\"nv\">content_type_id</span> <span class=\"nv\">original.pk</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;viewsitelink&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;View on site&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>这就是了！如果我们把这个文件放在 <code class=\"docutils literal notranslate\">templates/admin/my_app</code> 目录下，我们的链接就会出现在 my_app 内所有模型的更改表单中。</p>\n</section>\n<section id=\"templates-which-may-be-overridden-per-app-or-model\">\n<span id=\"admin-templates-overridden-per-app-or-model\"></span><h3>每个应用或模型可覆盖的模板<a class=\"heading-anchor\" href=\"#templates-which-may-be-overridden-per-app-or-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">contrib/admin/templates/admin</code> 中的模板并非每个应用程序或每个模型都可以被覆盖。以下情况可以：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">actions.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">app_index.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">change_form.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">change_form_actions.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">change_form_object_tools.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">change_list.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">change_list_object_tools.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">change_list_results.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">date_hierarchy.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">delete_confirmation.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">object_history.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">pagination.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">popup_response.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">prepopulated_fields_js.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">search_form.html</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">submit_line.html</code></p></li>\n</ul>\n<p>对于那些不能以这种方式覆盖的模板，你仍然可以通过将新版本放在你的 <code class=\"docutils literal notranslate\">templates/admin</code> 目录下，为整个项目覆盖它们。这对于创建自定义 404 和 500 页面特别有用。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>一些管理模板，如 <code class=\"docutils literal notranslate\">change_list_results.html</code> 是用来呈现自定义包含标签的。这些可以被覆盖，但在这种情况下，你可能最好创建你自己版本的标签，并给它一个不同的名字。这样你就可以有选择地使用它。</p>\n</aside>\n</section>\n<section id=\"root-and-login-templates\">\n<h3>根和登录模板<a class=\"heading-anchor\" href=\"#root-and-login-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你想更改索引、登录或注销模板，你最好创建自己的 <code class=\"docutils literal notranslate\">AdminSite</code> 实例（见下文），并更改 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.index_template\" title=\"django.contrib.admin.AdminSite.index_template\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.index_template</code></a> 、<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.login_template\" title=\"django.contrib.admin.AdminSite.login_template\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.login_template</code></a> 或 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.logout_template\" title=\"django.contrib.admin.AdminSite.logout_template\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.logout_template</code></a> 属性。</p>\n</section>\n</section>\n<section id=\"theming-support\">\n<span id=\"admin-theming\"></span><h2>主题化支持<a class=\"heading-anchor\" href=\"#theming-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>管理员使用 CSS 变量来定义颜色和字体。这允许在不必覆盖许多单独的 CSS 规则的情况下更改主题。例如，如果你喜欢紫色而不是蓝色，你可以在你的项目中添加一个 <code class=\"docutils literal notranslate\">admin/base.html</code> 模板覆盖：</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s1\">&#39;admin/base.html&#39;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">extrastyle</span> <span class=\"cp\">%}{{</span> <span class=\"nb\">block</span><span class=\"nv\">.super</span> <span class=\"cp\">}}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">style</span><span class=\"p\">&gt;</span>\n<span class=\"nt\">html</span><span class=\"o\">[</span><span class=\"nt\">data-theme</span><span class=\"o\">=</span><span class=\"s2\">&quot;light&quot;</span><span class=\"o\">],</span> <span class=\"p\">:</span><span class=\"nd\">root</span> <span class=\"p\">{</span>\n  <span class=\"nv\">--primary</span><span class=\"p\">:</span> <span class=\"mh\">#9774d5</span><span class=\"p\">;</span>\n  <span class=\"nv\">--secondary</span><span class=\"p\">:</span> <span class=\"mh\">#785cab</span><span class=\"p\">;</span>\n  <span class=\"nv\">--link-fg</span><span class=\"p\">:</span> <span class=\"mh\">#7c449b</span><span class=\"p\">;</span>\n  <span class=\"nv\">--link-selected-fg</span><span class=\"p\">:</span> <span class=\"mh\">#8f5bb2</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">style</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>CSS 变量的列表在 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/admin/static/admin/css/base.css\">django/contrib/admin/static/admin/css/base.css</a> 中定义。</p>\n<p>深色模式的变量，遵循 <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/&#64;media/prefers-color-scheme\">prefers-color-scheme</a> 媒体查询，定义在 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/admin/static/admin/css/dark_mode.css\">django/contrib/admin/static/admin/css/dark_mode.css</a> 中。这与模板中的 <code class=\"docutils literal notranslate\">{% block dark-mode-vars %}</code> 相关联。</p>\n</section>\n<section id=\"extrabody-block\">\n<span id=\"extrabody\"></span><h2><code class=\"docutils literal notranslate\">extrabody</code> block<a class=\"heading-anchor\" href=\"#extrabody-block\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>你可以通过扩展 <code class=\"docutils literal notranslate\">extrabody</code> 块，在继承 <code class=\"docutils literal notranslate\">admin/base.html</code> 的模板的 <code class=\"docutils literal notranslate\">&lt;/body&gt;</code> 标签结束前添加自定义 HTML、JavaScript 或其他内容。例如，若希望页面加载时显示警告框，可在项目中添加如下 <code class=\"docutils literal notranslate\">admin/base.html</code> 模板覆写：</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s1\">&#39;admin/base.html&#39;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">extrabody</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{{</span> <span class=\"nb\">block</span><span class=\"nv\">.super</span> <span class=\"cp\">}}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n        <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">addEventListener</span><span class=\"p\">(</span><span class=\"s1\">&#39;DOMContentLoaded&#39;</span><span class=\"p\">,</span> <span class=\"kd\">function</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n            <span class=\"nb\">window</span><span class=\"p\">.</span><span class=\"nx\">alert</span><span class=\"p\">(</span><span class=\"s1\">&#39;Welcome!&#39;</span><span class=\"p\">);</span>\n        <span class=\"p\">});</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">extrabody</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"adminsite-objects\">\n<h2><code class=\"docutils literal notranslate\">AdminSite</code> 对象<a class=\"heading-anchor\" href=\"#adminsite-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">AdminSite</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">name<span class=\"o\">=</span><span class=\"default_value\">'admin'</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个 Django 管理站点由 <code class=\"docutils literal notranslate\">django.contrib.admin.sites.AdminSite</code> 的实例来表示；默认情况下，这个类的实例被创建为 <code class=\"docutils literal notranslate\">django.contrib.admin.site</code>，你可以用它来注册你的模型和 <code class=\"docutils literal notranslate\">ModelAdmin</code> 实例。</p>\n<p>如果你想自定义默认的管理站点，你可以 <a class=\"reference internal\" href=\"#overriding-default-admin-site\"><span class=\"std std-ref\">覆盖它</span></a>。</p>\n<p>当构造一个 <code class=\"docutils literal notranslate\">AdminSite</code> 的实例时，你可以使用构造函数的 <code class=\"docutils literal notranslate\">name</code> 参数提供一个唯一的实例名称。这个实例名是用来标识实例的，特别是在 <a class=\"reference internal\" href=\"#admin-reverse-urls\"><span class=\"std std-ref\">反查管理 URL</span></a> 时。如果没有提供实例名，将使用默认的实例名 <code class=\"docutils literal notranslate\">admin</code>。参见 <a class=\"reference internal\" href=\"#customizing-adminsite\"><span class=\"std std-ref\">自定义 AdminSite 类</span></a>，了解定制 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite\" title=\"django.contrib.admin.AdminSite\"><code class=\"xref py py-class docutils literal notranslate\">AdminSite</code></a> 类的例子。</p>\n</dd></dl>\n\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.django.contrib.admin.sites.all_sites\">\n<span class=\"sig-prename descclassname\">django.contrib.admin.sites.</span><span class=\"sig-name descname\">all_sites</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.django.contrib.admin.sites.all_sites\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个 <a class=\"reference external\" href=\"https://docs.python.org/3/library/weakref.html#weakref.WeakSet\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">WeakSet</code></a> 包含所有的管理员站点实例。</p>\n</dd></dl>\n\n<section id=\"adminsite-attributes\">\n<h3><code class=\"docutils literal notranslate\">AdminSite</code> 属性<a class=\"heading-anchor\" href=\"#adminsite-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>模板可以覆盖或扩展基本的管理模板，如 <a class=\"reference internal\" href=\"#admin-overriding-templates\"><span class=\"std std-ref\">覆盖管理模板</span></a> 中所述。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.site_header\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">site_header</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.site_header\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>每个管理页面顶部的文本，作为一个 <code class=\"docutils literal notranslate\">&lt;div&gt;</code> （一个字符串）。默认情况下，这是 &quot;Django administration&quot;。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.site_title\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">site_title</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.site_title\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>在每个管理页面的 <code class=\"docutils literal notranslate\">&lt;title&gt;</code> （字符串）末尾放置的文字。默认情况下，是 “Django 站点管理”。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.site_url\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">site_url</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.site_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>每个管理页面顶部的 “查看网站” 链接的 URL。默认情况下，<code class=\"docutils literal notranslate\">site_url</code> 是 <code class=\"docutils literal notranslate\">/</code>。将其设置为 <code class=\"docutils literal notranslate\">None</code> 以删除该链接。</p>\n<p>对于运行在子路径上的站点， <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.each_context\" title=\"django.contrib.admin.AdminSite.each_context\"><code class=\"xref py py-meth docutils literal notranslate\">each_context()</code></a> 方法会检查当前请求是否设置了 <code class=\"docutils literal notranslate\">request.META['SCRIPT_NAME']</code>，如果 <code class=\"docutils literal notranslate\">site_url</code> 没有设置为 <code class=\"docutils literal notranslate\">/</code> 以外的内容，则使用该值。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.index_title\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">index_title</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.index_title\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>放在管理索引页顶部的文字（一个字符串）。默认情况下，是 “网站管理”。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.index_template\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">index_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.index_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>管理网站主索引视图将使用的自定义模板的路径。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.app_index_template\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">app_index_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.app_index_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>管理网站应用索引视图将使用的自定义模板的路径。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.empty_value_display\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">empty_value_display</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.empty_value_display\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于在管理站点的更改列表中显示空值的字符串。默认值为破折号。该值也可以在每个 <code class=\"docutils literal notranslate\">ModelAdmin</code> 的基础上被覆盖，也可以在 <code class=\"docutils literal notranslate\">ModelAdmin</code> 内的自定义字段上设置 <code class=\"docutils literal notranslate\">empty_value_display</code> 属性。参见 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.empty_value_display\" title=\"django.contrib.admin.ModelAdmin.empty_value_display\"><code class=\"xref py py-attr docutils literal notranslate\">ModelAdmin.empty_value_display</code></a> 的例子。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.enable_nav_sidebar\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">enable_nav_sidebar</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.enable_nav_sidebar\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个布尔值，决定是否在大屏幕上显示导航侧栏。默认情况下，它被设置为 <code class=\"docutils literal notranslate\">True</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.final_catch_all_view\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">final_catch_all_view</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.final_catch_all_view\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个布尔值，用于决定是否在管理员中添加一个最终的总括视图，将未认证的用户重定向到登录页面。默认情况下，它被设置为 <code class=\"docutils literal notranslate\">True</code>。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>不建议将此设置为 <code class=\"docutils literal notranslate\">False</code>，因为该视图可以保护潜在的模型枚举隐私问题。</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.login_template\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">login_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.login_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>管理网站登录视图将使用的自定义模板的路径。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.login_form\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">login_form</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.login_form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/zh-hans/6.1/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm\" title=\"django.contrib.auth.forms.AuthenticationForm\"><code class=\"xref py py-class docutils literal notranslate\">AuthenticationForm</code></a> 的子类，将被管理网站登录视图使用。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.logout_template\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">logout_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.logout_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>管理网站注销视图将使用的自定义模板的路径。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.password_change_form\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">password_change_form</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.password_change_form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<p>Subclass of <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/auth/default/#django.contrib.auth.forms.PasswordChangeForm\" title=\"django.contrib.auth.forms.PasswordChangeForm\"><code class=\"xref py py-class docutils literal notranslate\">PasswordChangeForm</code></a> that\nwill be used by the admin site password change view.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.password_change_template\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">password_change_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.password_change_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>管理网站密码修改视图将使用的自定义模板的路径。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.password_change_done_template\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">password_change_done_template</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.password_change_done_template\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>自定义模板的路径，该模板将被管理员网站密码修改完成后的视图使用。</p>\n</dd></dl>\n\n</section>\n<section id=\"adminsite-methods\">\n<h3><code class=\"docutils literal notranslate\">AdminSite</code> 方法<a class=\"heading-anchor\" href=\"#adminsite-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.each_context\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">each_context</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.each_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回一个变量字典，将其放入管理站点中每个页面的模板上下文中。</p>\n<p>默认情况下包括以下变量和值：</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\">site_header</code> ： <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.site_header\" title=\"django.contrib.admin.AdminSite.site_header\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.site_header</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">site_title</code> ：<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.site_title\" title=\"django.contrib.admin.AdminSite.site_title\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.site_title</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">site_url</code> ：<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.site_url\" title=\"django.contrib.admin.AdminSite.site_url\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.site_url</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">has_permission</code> ：<a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.has_permission\" title=\"django.contrib.admin.AdminSite.has_permission\"><code class=\"xref py py-meth docutils literal notranslate\">AdminSite.has_permission()</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">available_apps</code> ：当前用户可用的 <span class=\"xref std std-doc\">application registry</span> 中的应用程序列表。列表中的每个条目都是一个代表应用程序的字典，其键如下：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">app_label</code> ：应用程序标签</p></li>\n<li><p><code class=\"docutils literal notranslate\">app_url</code> ：管理中应用程序索引的 URL</p></li>\n<li><p><code class=\"docutils literal notranslate\">has_module_perms</code> ：一个布尔值，表示是否允许当前用户显示和访问模块的索引页</p></li>\n<li><p><code class=\"docutils literal notranslate\">models</code> ：应用程序中可用模型的清单</p></li>\n</ul>\n<p>每个模型都是一个带有以下键的字典</p>\n<ul class=\"simple\">\n<li><p>model` ：模型类</p></li>\n<li><p><code class=\"docutils literal notranslate\">object_name</code> ：模型类名</p></li>\n<li><p><code class=\"docutils literal notranslate\">name</code> ：模型的复数名</p></li>\n<li><p><code class=\"docutils literal notranslate\">perms</code> ：<code class=\"docutils literal notranslate\">dict</code> 跟踪 <code class=\"docutils literal notranslate\">add</code>、<code class=\"docutils literal notranslate\">change</code>、<code class=\"docutils literal notranslate\">delete</code> 和 <code class=\"docutils literal notranslate\">view</code> 权限</p></li>\n<li><p><code class=\"docutils literal notranslate\">admin_url</code> ：模型的管理变更表 URL</p></li>\n<li><p><code class=\"docutils literal notranslate\">add_url</code> ：添加新模型实例的管理网址</p></li>\n</ul>\n</li>\n<li><p><code class=\"docutils literal notranslate\">is_popup</code>：当前页面是否在弹出窗口中显示。</p></li>\n<li><p><code class=\"docutils literal notranslate\">is_nav_sidebar_enabled</code>: <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.enable_nav_sidebar\" title=\"django.contrib.admin.AdminSite.enable_nav_sidebar\"><code class=\"xref py py-attr docutils literal notranslate\">AdminSite.enable_nav_sidebar</code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\">log_entries</code>: <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite.get_log_entries\" title=\"django.contrib.admin.AdminSite.get_log_entries\"><code class=\"xref py py-meth docutils literal notranslate\">AdminSite.get_log_entries()</code></a></p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.get_app_list\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">get_app_list</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\">app_label<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.get_app_list\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回当前用户可用的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/applications/\"><span class=\"doc\">应用程序注册表</span></a> 中的应用程序列表。你可以选择性地传递一个 <code class=\"docutils literal notranslate\">app_label</code> 参数来获取单个应用程序的详细信息。列表中的每个条目都是一个字典，表示一个应用程序，具有以下键：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">app_label</code> ：应用程序标签</p></li>\n<li><p><code class=\"docutils literal notranslate\">app_url</code> ：管理中应用程序索引的 URL</p></li>\n<li><p><code class=\"docutils literal notranslate\">has_module_perms</code> ：一个布尔值，表示是否允许当前用户显示和访问模块的索引页</p></li>\n<li><p><code class=\"docutils literal notranslate\">models</code> ：应用程序中可用模型的清单</p></li>\n<li><p><code class=\"docutils literal notranslate\">name</code>：应用程序的名称</p></li>\n</ul>\n<p>每个模型都是一个带有以下键的字典：</p>\n<ul class=\"simple\">\n<li><p>model` ：模型类</p></li>\n<li><p><code class=\"docutils literal notranslate\">object_name</code> ：模型类名</p></li>\n<li><p><code class=\"docutils literal notranslate\">name</code> ：模型的复数名</p></li>\n<li><p><code class=\"docutils literal notranslate\">perms</code> ：<code class=\"docutils literal notranslate\">dict</code> 跟踪 <code class=\"docutils literal notranslate\">add</code>、<code class=\"docutils literal notranslate\">change</code>、<code class=\"docutils literal notranslate\">delete</code> 和 <code class=\"docutils literal notranslate\">view</code> 权限</p></li>\n<li><p><code class=\"docutils literal notranslate\">admin_url</code> ：模型的管理变更表 URL</p></li>\n<li><p><code class=\"docutils literal notranslate\">add_url</code> ：添加新模型实例的管理网址</p></li>\n</ul>\n<p>应用程序和模型的列表按它们的名称按字母顺序排序。你可以覆盖这个方法来改变管理员首页的默认顺序。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.has_permission\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">has_permission</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.has_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果给定的 <code class=\"docutils literal notranslate\">HttpRequest</code> 的用户有权限在管理站点中查看至少一个页面，则返回 <code class=\"docutils literal notranslate\">True</code>。默认要求 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\">User.is_active</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/auth/#django.contrib.auth.models.User.is_staff\" title=\"django.contrib.auth.models.User.is_staff\"><code class=\"xref py py-attr docutils literal notranslate\">User.is_staff</code></a> 都是 <code class=\"docutils literal notranslate\">True</code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.register\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">register</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model_or_iterable</em>, <em class=\"sig-param\">admin_class<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>options</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.register\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用给定的 <code class=\"docutils literal notranslate\">admin_class</code> 注册给定的模型类（或类的迭代）。<code class=\"docutils literal notranslate\">admin_class</code> 默认为 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> （默认的管理选项）。如果给定了关键字参数 —— 例如 <code class=\"docutils literal notranslate\">list_display</code> —— 它们将作为选项应用到管理类中。</p>\n<p>Raises <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-class docutils literal notranslate\">ImproperlyConfigured</code></a> if a model is\nabstract, and <code class=\"docutils literal notranslate\">django.contrib.admin.exceptions.AlreadyRegistered</code> if a\nmodel is already registered.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.unregister\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">unregister</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model_or_iterable</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.unregister\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>取消注册给定的模型类（或类的可迭代对象）</p>\n<p>如果模型尚未注册，将引发 <code class=\"docutils literal notranslate\">django.contrib.admin.exceptions.NotRegistered</code> 异常。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.get_model_admin\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">get_model_admin</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.get_model_admin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回给定模型类的管理类。如果模型未注册，将引发 <code class=\"docutils literal notranslate\">django.contrib.admin.exceptions.NotRegistered</code> 异常。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.AdminSite.get_log_entries\">\n<span class=\"sig-prename descclassname\">AdminSite.</span><span class=\"sig-name descname\">get_log_entries</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.AdminSite.get_log_entries\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回相关的 <a class=\"reference internal\" href=\"#django.contrib.admin.models.LogEntry\" title=\"django.contrib.admin.models.LogEntry\"><code class=\"xref py py-class docutils literal notranslate\">LogEntry</code></a> 实例的查询集，显示在站点索引页面上。可以覆盖此方法以根据其他条件过滤日志条目。</p>\n</dd></dl>\n\n</section>\n<section id=\"hooking-adminsite-instances-into-your-urlconf\">\n<span id=\"hooking-adminsite-to-urlconf\"></span><h3>将 <code class=\"docutils literal notranslate\">AdminSite</code> 实例挂到你的 URLconf 中<a class=\"heading-anchor\" href=\"#hooking-adminsite-instances-into-your-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The last step in setting up the Django admin is to hook your <code class=\"docutils literal notranslate\">AdminSite</code>\ninstance into your URLconf. Do this by pointing a given URL at the\n<code class=\"docutils literal notranslate\">AdminSite.urls</code> method. It is not necessary to use\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\">include()</code></a>.</p>\n<p>在这个例子中，我们将默认的 <code class=\"docutils literal notranslate\">AdminSite</code> 实例 <code class=\"docutils literal notranslate\">django.contrib.admin.site</code> 注册到 URL <code class=\"docutils literal notranslate\">/admin/</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># urls.py</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;admin/&quot;</span><span class=\"p\">,</span> admin<span class=\"o\">.</span>site<span class=\"o\">.</span>urls<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</section>\n<section id=\"customizing-the-adminsite-class\">\n<span id=\"customizing-adminsite\"></span><h3>自定义 <code class=\"xref py py-class docutils literal notranslate\">AdminSite</code> 类<a class=\"heading-anchor\" href=\"#customizing-the-adminsite-class\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你想用自定义行为设置你自己的管理站点，你可以自由地将 <code class=\"docutils literal notranslate\">AdminSite</code> 子类化，并覆盖或添加任何你喜欢的内容。然后，创建一个你的 <code class=\"docutils literal notranslate\">AdminSite</code> 子类的实例（与你实例化任何其他 Python 类的方式相同），并用它注册你的模型和 <code class=\"docutils literal notranslate\">ModelAdmin</code> 子类，而不是用默认站点。最后，更新 <code class=\"file docutils literal notranslate\">myproject/urls.py</code> 来引用你的 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite\" title=\"django.contrib.admin.AdminSite\"><code class=\"xref py py-class docutils literal notranslate\">AdminSite</code></a> 子类。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">myapp/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> MyModel\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAdminSite</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>AdminSite<span class=\"p\">):</span>\n    site_header <span class=\"o\">=</span> <span class=\"s2\">&quot;Monty Python administration&quot;</span>\n\n\nadmin_site <span class=\"o\">=</span> MyAdminSite<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;myadmin&quot;</span><span class=\"p\">)</span>\nadmin_site<span class=\"o\">.</span>register<span class=\"p\">(</span>MyModel<span class=\"p\">)</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">myproject/urls.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.admin</span> <span class=\"kn\">import</span> admin_site\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;myadmin/&quot;</span><span class=\"p\">,</span> admin_site<span class=\"o\">.</span>urls<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>请注意，当你使用自己的 <code class=\"docutils literal notranslate\">AdminSite</code> 实例时，你可能不希望自动发现 <code class=\"docutils literal notranslate\">admin</code> 模块，因为你可能会在你的 <code class=\"docutils literal notranslate\">myproject.admin</code> 模块中导入所有应用的 <code class=\"docutils literal notranslate\">admin</code> 模块。这意味着你需要在你的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 配置中加入 <code class=\"docutils literal notranslate\">'django.contrib.admin.apps.SimpleAdminConfig'</code> 而不是 <code class=\"docutils literal notranslate\">'django.contrib.admin'</code>。</p>\n</section>\n<section id=\"overriding-the-default-admin-site\">\n<span id=\"overriding-default-admin-site\"></span><h3>覆盖默认的管理站点<a class=\"heading-anchor\" href=\"#overriding-the-default-admin-site\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>你可以通过设置自定义 <code class=\"docutils literal notranslate\">AppConfig</code> 的 <code class=\"xref py py-attr docutils literal notranslate\">default_site`</code> 属性来覆盖默认的 <code class=\"docutils literal notranslate\">django.contrib.admin.site</code>，将其设置为一个 <code class=\"docutils literal notranslate\">AdminSite</code> 子类或一个返回站点实例的可调用的点分隔导入路径。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">myproject/admin.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAdminSite</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>AdminSite<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">myproject/apps.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.admin.apps</span> <span class=\"kn\">import</span> AdminConfig\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAdminConfig</span><span class=\"p\">(</span>AdminConfig<span class=\"p\">):</span>\n    default_site <span class=\"o\">=</span> <span class=\"s2\">&quot;myproject.admin.MyAdminSite&quot;</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">myproject/settings.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code>INSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;myproject.apps.MyAdminConfig&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># replaces &#39;django.contrib.admin&#39;</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n</section>\n<section id=\"multiple-admin-sites-in-the-same-urlconf\">\n<span id=\"multiple-admin-sites\"></span><h3>同一个 URLconf 中的多个管理站点<a class=\"heading-anchor\" href=\"#multiple-admin-sites-in-the-same-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>你可以在同一个 Django 驱动的网站上创建多个管理站点的实例。创建多个 <code class=\"docutils literal notranslate\">AdminSite</code> 的实例，并将每个实例放置在不同的 URL 中。</p>\n<p>在这个例子中，URL <code class=\"docutils literal notranslate\">/basic-admin/</code> 和 <code class=\"docutils literal notranslate\">/advanced-admin/</code> 分别使用 <code class=\"docutils literal notranslate\">AdminSite</code> 实例 <code class=\"docutils literal notranslate\">myproject.admin.basic_site</code> 和 <code class=\"docutils literal notranslate\">myproject.admin.advanced_site</code> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># urls.py</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">myproject.admin</span> <span class=\"kn\">import</span> advanced_site<span class=\"p\">,</span> basic_site\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;basic-admin/&quot;</span><span class=\"p\">,</span> basic_site<span class=\"o\">.</span>urls<span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;advanced-admin/&quot;</span><span class=\"p\">,</span> advanced_site<span class=\"o\">.</span>urls<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">AdminSite</code> 实例的构造函数只有一个参数，即名称，可以是任何你喜欢的名称。这个参数成为 URL 名称的前缀，以便 <a class=\"reference internal\" href=\"#admin-reverse-urls\"><span class=\"std std-ref\">反查它们</span></a>。只有当你使用一个以上的 <code class=\"docutils literal notranslate\">AdminSite</code> 时才需要这样做。</p>\n</section>\n<section id=\"adding-views-to-admin-sites\">\n<h3>在管理站点上添加视图<a class=\"heading-anchor\" href=\"#adding-views-to-admin-sites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Just like <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a>, <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite\" title=\"django.contrib.admin.AdminSite\"><code class=\"xref py py-class docutils literal notranslate\">AdminSite</code></a> provides a\n<a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_urls\" title=\"django.contrib.admin.ModelAdmin.get_urls\"><code class=\"xref py py-meth docutils literal notranslate\">get_urls()</code></a> method\nthat can be overridden to define additional views for the site. To add\na new view to your admin site, extend the base\n<a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.get_urls\" title=\"django.contrib.admin.ModelAdmin.get_urls\"><code class=\"xref py py-meth docutils literal notranslate\">get_urls()</code></a> method to include\na pattern for your new view.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>任何使用管理模板或扩展基本管理模板的视图，都应该在渲染模板之前设置 <code class=\"docutils literal notranslate\">request.current_app</code>。如果你的视图是在 <code class=\"docutils literal notranslate\">AdminSite</code> 上，它应该设置为 <code class=\"docutils literal notranslate\">self.name</code>；如果你的视图是在 <code class=\"docutils literal notranslate\">ModelAdmin</code> 上，它应该设置为 <code class=\"docutils literal notranslate\">self.admin_site.name</code>。</p>\n</aside>\n</section>\n<section id=\"adding-a-password-reset-feature\">\n<span id=\"auth-password-reset\"></span><h3>增加密码重置功能<a class=\"heading-anchor\" href=\"#adding-a-password-reset-feature\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>你可以在你的 URLconf 中添加几行字，就可以给管理网站添加密码重置功能。具体来说，添加以下四种模式：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> auth_views\n\npath<span class=\"p\">(</span>\n    <span class=\"s2\">&quot;admin/password_reset/&quot;</span><span class=\"p\">,</span>\n    auth_views<span class=\"o\">.</span>PasswordResetView<span class=\"o\">.</span>as_view<span class=\"p\">(</span>\n        extra_context<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;site_header&quot;</span><span class=\"p\">:</span> admin<span class=\"o\">.</span>site<span class=\"o\">.</span>site_header<span class=\"p\">}</span>\n    <span class=\"p\">),</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;admin_password_reset&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">),</span>\npath<span class=\"p\">(</span>\n    <span class=\"s2\">&quot;admin/password_reset/done/&quot;</span><span class=\"p\">,</span>\n    auth_views<span class=\"o\">.</span>PasswordResetDoneView<span class=\"o\">.</span>as_view<span class=\"p\">(</span>\n        extra_context<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;site_header&quot;</span><span class=\"p\">:</span> admin<span class=\"o\">.</span>site<span class=\"o\">.</span>site_header<span class=\"p\">}</span>\n    <span class=\"p\">),</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;password_reset_done&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">),</span>\npath<span class=\"p\">(</span>\n    <span class=\"s2\">&quot;reset/&lt;uidb64&gt;/&lt;token&gt;/&quot;</span><span class=\"p\">,</span>\n    auth_views<span class=\"o\">.</span>PasswordResetConfirmView<span class=\"o\">.</span>as_view<span class=\"p\">(</span>\n        extra_context<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;site_header&quot;</span><span class=\"p\">:</span> admin<span class=\"o\">.</span>site<span class=\"o\">.</span>site_header<span class=\"p\">}</span>\n    <span class=\"p\">),</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;password_reset_confirm&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">),</span>\npath<span class=\"p\">(</span>\n    <span class=\"s2\">&quot;reset/done/&quot;</span><span class=\"p\">,</span>\n    auth_views<span class=\"o\">.</span>PasswordResetCompleteView<span class=\"o\">.</span>as_view<span class=\"p\">(</span>\n        extra_context<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;site_header&quot;</span><span class=\"p\">:</span> admin<span class=\"o\">.</span>site<span class=\"o\">.</span>site_header<span class=\"p\">}</span>\n    <span class=\"p\">),</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;password_reset_complete&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">),</span>\n</code></pre></div>\n<p>（这假定你已经在 <code class=\"docutils literal notranslate\">admin/</code> 添加了管理员，并且要求你把以 <code class=\"docutils literal notranslate\">^admin/</code> 为开头的 URL 放在包含管理程序本身的行之前）。</p>\n<p><code class=\"docutils literal notranslate\">admin_password_reset</code> 命名的 URL 的存在，会使默认的管理登录页面的密码框下出现 “忘记密码了？” 的链接。</p>\n</section>\n</section>\n<section id=\"logentry-objects\">\n<h2><code class=\"docutils literal notranslate\">LogEntry</code> 对象<a class=\"heading-anchor\" href=\"#logentry-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">models.</span><span class=\"sig-name descname\">LogEntry</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">LogEntry</code> 类可以跟踪通过管理界面完成的对象的添加、更改和删除。</p>\n</dd></dl>\n\n<section id=\"logentry-attributes\">\n<h3><code class=\"docutils literal notranslate\">LogEntry</code> 属性<a class=\"heading-anchor\" href=\"#logentry-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.action_time\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">action_time</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.action_time\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>动作的日期和时间。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.user\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">user</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.user\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>执行操作的用户（一个 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> 实例）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.content_type\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">content_type</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.content_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>修改对象的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/contenttypes/#django.contrib.contenttypes.models.ContentType\" title=\"django.contrib.contenttypes.models.ContentType\"><code class=\"xref py py-class docutils literal notranslate\">ContentType</code></a> 。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.object_id\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">object_id</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.object_id\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>修改对象主键的文字表示。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.object_repr\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">object_repr</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.object_repr\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>修改后的对象 <code class=\"docutils literal notranslate\">repr()</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.action_flag\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">action_flag</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.action_flag\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>记录的动作类型： <code class=\"docutils literal notranslate\">ADDITION</code>、<code class=\"docutils literal notranslate\">CHANGE</code>、<code class=\"docutils literal notranslate\">DELETION</code>。</p>\n<p>例如，要获取所有通过管理完成的添加列表：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.admin.models</span> <span class=\"kn\">import</span> ADDITION<span class=\"p\">,</span> LogEntry\n\nLogEntry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>action_flag<span class=\"o\">=</span>ADDITION<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.change_message\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">change_message</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.change_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对修改的详细描述。例如，在编辑的情况下，消息中包含了被编辑的字段列表。Django 管理网站将这些内容格式化为 JSON 结构，这样 <a class=\"reference internal\" href=\"#django.contrib.admin.models.LogEntry.get_change_message\" title=\"django.contrib.admin.models.LogEntry.get_change_message\"><code class=\"xref py py-meth docutils literal notranslate\">get_change_message()</code></a> 就可以重新组成一个用当前用户语言翻译的消息。不过自定义代码可能会将其设置为纯字符串。建议你使用 <a class=\"reference internal\" href=\"#django.contrib.admin.models.LogEntry.get_change_message\" title=\"django.contrib.admin.models.LogEntry.get_change_message\"><code class=\"xref py py-meth docutils literal notranslate\">get_change_message()</code></a> 方法来检索这个值，而不是直接访问它。</p>\n</dd></dl>\n\n</section>\n<section id=\"logentry-methods\">\n<h3><code class=\"docutils literal notranslate\">LogEntry</code> 方法<a class=\"heading-anchor\" href=\"#logentry-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.get_edited_object\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">get_edited_object</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.get_edited_object\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回被引用对象的快捷方式。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.models.LogEntry.get_change_message\">\n<span class=\"sig-prename descclassname\">LogEntry.</span><span class=\"sig-name descname\">get_change_message</span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.models.LogEntry.get_change_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>将 <a class=\"reference internal\" href=\"#django.contrib.admin.models.LogEntry.change_message\" title=\"django.contrib.admin.models.LogEntry.change_message\"><code class=\"xref py py-attr docutils literal notranslate\">change_message</code></a> 格式化并翻译成当前用户语言。在 Django 1.10 之前创建的消息将始终以其登录时的语言显示。</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"reversing-admin-urls\">\n<span id=\"admin-reverse-urls\"></span><h2>反查管理 URL<a class=\"heading-anchor\" href=\"#reversing-admin-urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>当部署了一个 <a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite\" title=\"django.contrib.admin.AdminSite\"><code class=\"xref py py-class docutils literal notranslate\">AdminSite</code></a> 时，可以使用 Django 的 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/http/urls/#naming-url-patterns\"><span class=\"std std-ref\">URL 反查系统</span></a> 访问该网站提供的视图。</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.admin.AdminSite\" title=\"django.contrib.admin.AdminSite\"><code class=\"xref py py-class docutils literal notranslate\">AdminSite</code></a> 提供了以下命名的 URL 模式。</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>页面</p></th>\n<th class=\"head\"><p>URL 名称</p></th>\n<th class=\"head\"><p>参数</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p>索引</p></td>\n<td><p><code class=\"docutils literal notranslate\">index</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>登录</p></td>\n<td><p><code class=\"docutils literal notranslate\">login</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>登出</p></td>\n<td><p><code class=\"docutils literal notranslate\">logout</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>密码更改</p></td>\n<td><p><code class=\"docutils literal notranslate\">password_change</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>密码更改完成</p></td>\n<td><p><code class=\"docutils literal notranslate\">password_change_done</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>i18n JavaScript</p></td>\n<td><p><code class=\"docutils literal notranslate\">jsi18n</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>应用索引页面</p></td>\n<td><p><code class=\"docutils literal notranslate\">app_list</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">app_label</code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>重定向到对象的页面</p></td>\n<td><p><code class=\"docutils literal notranslate\">view_on_site</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">content_type_id</code>, <code class=\"docutils literal notranslate\">object_id</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>每个 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> 实例都提供一组额外的命名 URL：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>页面</p></th>\n<th class=\"head\"><p>URL 名称</p></th>\n<th class=\"head\"><p>参数</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p>变更列表</p></td>\n<td><p><code class=\"docutils literal notranslate\">{{ app_label }}_{{ model_name }}_changelist</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-odd\"><td><p>增加</p></td>\n<td><p><code class=\"docutils literal notranslate\">{{ app_label }}_{{ model_name }}_add</code></p></td>\n<td></td>\n</tr>\n<tr class=\"row-even\"><td><p>历史</p></td>\n<td><p><code class=\"docutils literal notranslate\">{{ app_label }}_{{ model_name }}_history</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">object_id</code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p>删除</p></td>\n<td><p><code class=\"docutils literal notranslate\">{{ app_label }}_{{ model_name }}_delete</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">object_id</code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p>修改</p></td>\n<td><p><code class=\"docutils literal notranslate\">{{ app_label }}_{{ model_name }}_change</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">object_id</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p><code class=\"docutils literal notranslate\">UserAdmin</code> 提供一个命名的 URL：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>页面</p></th>\n<th class=\"head\"><p>URL 名称</p></th>\n<th class=\"head\"><p>参数</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p>密码更改</p></td>\n<td><p><code class=\"docutils literal notranslate\">auth_user_password_change</code></p></td>\n<td><p><code class=\"docutils literal notranslate\">user_id</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>这些命名的 URL 在应用程序命名空间 <code class=\"docutils literal notranslate\">admin</code> 和与 Site 实例名称相对应的实例命名空间中注册。</p>\n<p>所以，如果你想要在默认管理员中获取对特定 <code class=\"docutils literal notranslate\">Choice</code> 对象（来自 polls 应用程序）的更改视图的引用，你可以调用：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"gp\">&gt;&gt;&gt; </span>c <span class=\"o\">=</span> Choice<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>change_url <span class=\"o\">=</span> reverse<span class=\"p\">(</span><span class=\"s2\">&quot;admin:polls_choice_change&quot;</span><span class=\"p\">,</span> args<span class=\"o\">=</span><span class=\"p\">(</span>c<span class=\"o\">.</span>id<span class=\"p\">,))</span>\n</code></pre></div>\n<p>这将找到管理应用程序的第一个注册实例（无论实例名称如何），并解析到该实例中改变 <code class=\"docutils literal notranslate\">poll.Choice</code> 实例的视图。</p>\n<p>如果你想要在特定的管理员实例中查找一个 URL，请在反向调用中提供该实例的名称作为 <code class=\"docutils literal notranslate\">current_app</code> 提示。例如，如果你特别想要来自名为 <code class=\"docutils literal notranslate\">custom</code> 的管理员实例的管理员视图，你需要调用：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>change_url <span class=\"o\">=</span> reverse<span class=\"p\">(</span><span class=\"s2\">&quot;admin:polls_choice_change&quot;</span><span class=\"p\">,</span> args<span class=\"o\">=</span><span class=\"p\">(</span>c<span class=\"o\">.</span>id<span class=\"p\">,),</span> current_app<span class=\"o\">=</span><span class=\"s2\">&quot;custom&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>更多细节，请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/http/urls/#topics-http-reversing-url-namespaces\"><span class=\"std std-ref\">反查命名空间的 URL</span></a> 的文档。</p>\n<p>为了让模板中的管理网址更容易反查，Django 提供了一个 <code class=\"docutils literal notranslate\">admin_urlname</code> 过滤器，它的参数是一个动作：</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">admin_urls</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"nv\">opts</span><span class=\"o\">|</span><span class=\"nf\">admin_urlname</span><span class=\"s1\">:&#39;add&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Add user<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"nv\">opts</span><span class=\"o\">|</span><span class=\"nf\">admin_urlname</span><span class=\"s1\">:&#39;delete&#39;</span> <span class=\"nv\">user.pk</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Delete this user<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>上面例子中的操作与上面描述的 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> 实例的 URL 名称的最后一部分相匹配。<code class=\"docutils literal notranslate\">opts</code> 变量可以是任何具有 <code class=\"docutils literal notranslate\">app_label</code> 和 <code class=\"docutils literal notranslate\">model_name</code> 属性的对象，通常由当前模型的管理视图提供。</p>\n</section>\n<section id=\"the-display-decorator\">\n<h2><code class=\"docutils literal notranslate\">display</code> 装饰器<a class=\"heading-anchor\" href=\"#the-display-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.display\">\n<span class=\"sig-name descname\">display</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">boolean<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">ordering<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">description<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">empty_value<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.display\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个装饰器可以用来设置自定义显示函数的特定属性，可以用 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\">list_display</code></a> 或 <a class=\"reference internal\" href=\"#django.contrib.admin.ModelAdmin.readonly_fields\" title=\"django.contrib.admin.ModelAdmin.readonly_fields\"><code class=\"xref py py-attr docutils literal notranslate\">readonly_fields</code></a> ：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>\n    boolean<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    ordering<span class=\"o\">=</span><span class=\"s2\">&quot;-publish_date&quot;</span><span class=\"p\">,</span>\n    description<span class=\"o\">=</span><span class=\"s2\">&quot;Is Published?&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">is_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n    <span class=\"k\">return</span> obj<span class=\"o\">.</span>publish_date <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>这就相当于直接在函数上设置一些属性（用原来的、较长的名字）：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">is_published</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n    <span class=\"k\">return</span> obj<span class=\"o\">.</span>publish_date <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span>\n\n\nis_published<span class=\"o\">.</span>boolean <span class=\"o\">=</span> <span class=\"kc\">True</span>\nis_published<span class=\"o\">.</span>admin_order_field <span class=\"o\">=</span> <span class=\"s2\">&quot;-publish_date&quot;</span>\nis_published<span class=\"o\">.</span>short_description <span class=\"o\">=</span> <span class=\"s2\">&quot;Is Published?&quot;</span>\n</code></pre></div>\n<p>还请注意，<code class=\"docutils literal notranslate\">empty_value</code> 装饰符参数映射到直接分配给函数的 <code class=\"docutils literal notranslate\">empty_value_display</code> 属性。它不能与 <code class=\"docutils literal notranslate\">boolean</code> 一起使用 —— 它们是相互排斥的。</p>\n<p>使用这个装饰器并不是制作一个显示函数的必经之路，但在你的源码中使用它而不使用参数作为标记来识别函数的目的是很有用的：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@admin</span><span class=\"o\">.</span>display\n<span class=\"k\">def</span> <span class=\"nf\">published_year</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj<span class=\"p\">):</span>\n    <span class=\"k\">return</span> obj<span class=\"o\">.</span>publish_date<span class=\"o\">.</span>year\n</code></pre></div>\n<p>在这种情况下，它将不会给函数添加任何属性。</p>\n</dd></dl>\n\n</section>\n<section id=\"the-staff-member-required-decorator\">\n<h2><code class=\"docutils literal notranslate\">staff_member_required</code> 装饰器<a class=\"heading-anchor\" href=\"#the-staff-member-required-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.admin.views.decorators.staff_member_required\">\n<span class=\"sig-name descname\">staff_member_required</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">redirect_field_name<span class=\"o\">=</span><span class=\"default_value\">'next'</span></em>, <em class=\"sig-param\">login_url<span class=\"o\">=</span><span class=\"default_value\">'admin:login'</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.admin.views.decorators.staff_member_required\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这个装饰器被用于需要授权的管理视图。用这个函数装饰的视图将有以下行为：</p>\n<ul class=\"simple\">\n<li><p>如果用户已登录，是工作人员（<code class=\"docutils literal notranslate\">User.is_staff=True</code>），并且是活动的（<code class=\"docutils literal notranslate\">User.is_active=True</code>），则正常执行视图。</p></li>\n<li><p>否则，请求将被重定向到由 <code class=\"docutils literal notranslate\">login_url</code> 参数指定的 URL，并在由 <code class=\"docutils literal notranslate\">redirect_field_name</code> 指定的查询字符串变量中包含最初请求的路径。例如： <code class=\"docutils literal notranslate\">/admin/login/?next=/admin/polls/question/3/</code>。</p></li>\n</ul>\n<p>用法示例：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.admin.views.decorators</span> <span class=\"kn\">import</span> staff_member_required\n\n\n<span class=\"nd\">@staff_member_required</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n</section>","rootId":"module-django.contrib.admin","toc":[{"title":"概况","anchor":"overview","children":[{"title":"其他主题","anchor":"other-topics","children":[]}]},{"title":"ModelAdmin 对象","anchor":"modeladmin-objects","children":[{"title":"register 装饰器","anchor":"the-register-decorator","children":[]},{"title":"发现管理文件","anchor":"discovery-of-admin-files","children":[]},{"title":"ModelAdmin 选项","anchor":"modeladmin-options","children":[{"title":"自定义模板选项","anchor":"custom-template-options","children":[]}]},{"title":"ModelAdmin 方法","anchor":"modeladmin-methods","children":[{"title":"其他方法","anchor":"other-methods","children":[]}]},{"title":"ModelAdmin 静态资源定义","anchor":"modeladmin-asset-definitions","children":[{"title":"jQuery","anchor":"jquery","children":[]}]}]},{"title":"InlineModelAdmin 对象","anchor":"inlinemodeladmin-objects","children":[{"title":"InlineModelAdmin 选项","anchor":"inlinemodeladmin-options","children":[]},{"title":"与有两个或更多外键到同一父模型的模型一起工作","anchor":"working-with-a-model-with-two-or-more-foreign-keys-to-the-same-parent-model","children":[]},{"title":"与多对多模型一起工作","anchor":"working-with-many-to-many-models","children":[]},{"title":"与多对多中间模型一起工作","anchor":"working-with-many-to-many-intermediary-models","children":[]},{"title":"使用通用关系作为内联","anchor":"using-generic-relations-as-an-inline","children":[]}]},{"title":"在管理中添加自定义验证","anchor":"adding-custom-validation-to-the-admin","children":[]},{"title":"覆盖管理模板","anchor":"overriding-admin-templates","children":[{"title":"Set up your project's admin template directories","anchor":"set-up-your-project-s-admin-template-directories","children":[]},{"title":"覆盖 vs. 替换管理模板","anchor":"overriding-vs-replacing-an-admin-template","children":[]},{"title":"每个应用或模型可覆盖的模板","anchor":"templates-which-may-be-overridden-per-app-or-model","children":[]},{"title":"根和登录模板","anchor":"root-and-login-templates","children":[]}]},{"title":"主题化支持","anchor":"theming-support","children":[]},{"title":"extrabody block","anchor":"extrabody-block","children":[]},{"title":"AdminSite 对象","anchor":"adminsite-objects","children":[{"title":"AdminSite 属性","anchor":"adminsite-attributes","children":[]},{"title":"AdminSite 方法","anchor":"adminsite-methods","children":[]},{"title":"将 AdminSite 实例挂到你的 URLconf 中","anchor":"hooking-adminsite-instances-into-your-urlconf","children":[]},{"title":"自定义 AdminSite 类","anchor":"customizing-the-adminsite-class","children":[]},{"title":"覆盖默认的管理站点","anchor":"overriding-the-default-admin-site","children":[]},{"title":"同一个 URLconf 中的多个管理站点","anchor":"multiple-admin-sites-in-the-same-urlconf","children":[]},{"title":"在管理站点上添加视图","anchor":"adding-views-to-admin-sites","children":[]},{"title":"增加密码重置功能","anchor":"adding-a-password-reset-feature","children":[]}]},{"title":"LogEntry 对象","anchor":"logentry-objects","children":[{"title":"LogEntry 属性","anchor":"logentry-attributes","children":[]},{"title":"LogEntry 方法","anchor":"logentry-methods","children":[]}]},{"title":"反查管理 URL","anchor":"reversing-admin-urls","children":[]},{"title":"display 装饰器","anchor":"the-display-decorator","children":[]},{"title":"staff_member_required 装饰器","anchor":"the-staff-member-required-decorator","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/6.1/ref/contrib/"}],"prev":{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/6.1/ref/contrib/"},"next":{"docname":"ref/contrib/admin/actions","title":"管理动作","url":"/zh-hans/6.1/ref/contrib/admin/actions/"},"formats":{"html":"/zh-hans/6.1/ref/contrib/admin/","markdown":"/zh-hans/6.1/ref/contrib/admin.md","json":"/zh-hans/6.1/ref/contrib/admin.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/contrib/admin/index.txt","official":"https://docs.djangoproject.com/zh-hans/6.1/ref/contrib/admin/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}