{"title":"ModelAdmin 列表过滤器","version":"5.1","locale":"zh-hans","docname":"ref/contrib/admin/filters","url":"/zh-hans/5.1/ref/contrib/admin/filters/","canonical":"https://djangodocs.dev/zh-hans/5.1/ref/contrib/admin/filters/","summary":"ModelAdmin 类可以定义出现在管理员的更改列表页面右侧边栏上的列表过滤器，如下面的截图所示： 要启用按字段过滤，将 ModelAdmin.list_filter 设置为一个元素列表或元组，其中每个元素都是以下类型之一： 一个字段名称。 django.contrib.admin.SimpleListFilter 的子类。…","html":"<span id=\"id1\"></span><h1><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> 列表过滤器<a class=\"heading-anchor\" href=\"#modeladmin-list-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> 类可以定义出现在管理员的更改列表页面右侧边栏上的列表过滤器，如下面的截图所示：</p>\n<img alt=\"/zh-hans/5.1/_images/list_filter.png\" src=\"/zh-hans/5.1/_images/list_filter.png\" />\n<p>要启用按字段过滤，将 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ModelAdmin.list_filter</span></code></a> 设置为一个元素列表或元组，其中每个元素都是以下类型之一：</p>\n<ul class=\"simple\">\n<li><p>一个字段名称。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.SimpleListFilter</span></code> 的子类。</p></li>\n<li><p>一个包含字段名称和 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.FieldListFilter</span></code> 子类的 2 元组。</p></li>\n</ul>\n<p>请查看以下示例，讨论了定义 <code class=\"docutils literal notranslate\"><span class=\"pre\">list_filter</span></code> 的每个选项。</p>\n<section id=\"using-a-field-name\">\n<h2>使用字段名称<a class=\"heading-anchor\" href=\"#using-a-field-name\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>最简单的选项是指定你的模型中需要的字段名称。</p>\n<p>每个指定的字段应该是 <code class=\"docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">IntegerField</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></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=\"w\"> </span><span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;is_staff&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;company&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">list_filter</span></code> 中的字段名也可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">__</span></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=\"w\"> </span><span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">UserAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;company__name&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</section>\n<section id=\"using-a-simplelistfilter\">\n<h2>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">SimpleListFilter</span></code><a class=\"heading-anchor\" href=\"#using-a-simplelistfilter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>对于自定义过滤，你可以通过子类化 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.SimpleListFilter</span></code> 来定义自己的列表过滤器。你需要提供 <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">parameter_name</span></code> 属性，并重写 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookups</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></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=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DecadeBornListFilter</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">SimpleListFilter</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Human-readable title which will be displayed in the</span>\n    <span class=\"c1\"># right admin sidebar just above the filter options.</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;decade born&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Parameter for the filter that will be used in the URL query.</span>\n    <span class=\"n\">parameter_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;decade&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">lookups</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">model_admin</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns a list of tuples. The first element in each</span>\n<span class=\"sd\">        tuple is the coded value for the option that will</span>\n<span class=\"sd\">        appear in the URL query. The second element is the</span>\n<span class=\"sd\">        human-readable name for the option that will appear</span>\n<span class=\"sd\">        in the right sidebar.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> <span class=\"p\">[</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;80s&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;in the eighties&quot;</span><span class=\"p\">)),</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;90s&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;in the nineties&quot;</span><span class=\"p\">)),</span>\n        <span class=\"p\">]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the filtered queryset based on the value</span>\n<span class=\"sd\">        provided in the query string and retrievable via</span>\n<span class=\"sd\">        `self.value()`.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"c1\"># Compare the requested value (either &#39;80s&#39; or &#39;90s&#39;)</span>\n        <span class=\"c1\"># to decide how to filter the queryset.</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">()</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;80s&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n                <span class=\"n\">birthday__gte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1980</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n                <span class=\"n\">birthday__lte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1989</span><span class=\"p\">,</span> <span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"mi\">31</span><span class=\"p\">),</span>\n            <span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">()</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;90s&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">queryset</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n                <span class=\"n\">birthday__gte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1990</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n                <span class=\"n\">birthday__lte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1999</span><span class=\"p\">,</span> <span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"mi\">31</span><span class=\"p\">),</span>\n            <span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">DecadeBornListFilter</span><span class=\"p\">]</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\"><span class=\"pre\">HttpRequest</span></code> 对象被传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookups</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">queryset</span></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=\"w\"> </span><span class=\"nc\">AuthDecadeBornListFilter</span><span class=\"p\">(</span><span class=\"n\">DecadeBornListFilter</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">lookups</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">model_admin</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_superuser</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">lookups</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">model_admin</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_superuser</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">queryset</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">queryset</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>另外，为了方便起见，<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> 对象被传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookups</span></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=\"w\"> </span><span class=\"nc\">AdvancedDecadeBornListFilter</span><span class=\"p\">(</span><span class=\"n\">DecadeBornListFilter</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">lookups</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">model_admin</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Only show the lookups if there actually is</span>\n<span class=\"sd\">        anyone born in the corresponding decades.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">model_admin</span><span class=\"o\">.</span><span class=\"n\">get_queryset</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n            <span class=\"n\">birthday__gte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1980</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n            <span class=\"n\">birthday__lte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1989</span><span class=\"p\">,</span> <span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"mi\">31</span><span class=\"p\">),</span>\n        <span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">():</span>\n            <span class=\"k\">yield</span> <span class=\"p\">(</span><span class=\"s2\">&quot;80s&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;in the eighties&quot;</span><span class=\"p\">))</span>\n        <span class=\"k\">if</span> <span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span>\n            <span class=\"n\">birthday__gte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1990</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">),</span>\n            <span class=\"n\">birthday__lte</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"p\">(</span><span class=\"mi\">1999</span><span class=\"p\">,</span> <span class=\"mi\">12</span><span class=\"p\">,</span> <span class=\"mi\">31</span><span class=\"p\">),</span>\n        <span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">():</span>\n            <span class=\"k\">yield</span> <span class=\"p\">(</span><span class=\"s2\">&quot;90s&quot;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;in the nineties&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"using-a-field-name-and-an-explicit-fieldlistfilter\">\n<h2>使用字段名称和显式的 <code class=\"docutils literal notranslate\"><span class=\"pre\">FieldListFilter</span></code><a class=\"heading-anchor\" href=\"#using-a-field-name-and-an-explicit-fieldlistfilter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>最后，如果你希望为一个字段指定明确的过滤器类型，你可以提供一个包含 2 个元素的 <code class=\"docutils literal notranslate\"><span class=\"pre\">list_filter</span></code> 项，其中第一个元素是字段名称，第二个元素是继承自 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.FieldListFilter</span></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=\"w\"> </span><span class=\"nc\">PersonAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;is_staff&quot;</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">BooleanFieldListFilter</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>这里&quot;is_staff&quot;字段将使用&quot;BooleanFieldListFilter&quot;。在大多数情况下，只指定字段名的字段会自动使用适当的过滤器，但这种格式允许您控制所使用的过滤器。</p>\n<p>下面的示例显示了您需要选择使用的可用过滤器类别。</p>\n<p>你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">RelatedOnlyFieldListFilter</span></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=\"w\"> </span><span class=\"nc\">BookAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">RelatedOnlyFieldListFilter</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>假设 <code class=\"docutils literal notranslate\"><span class=\"pre\">author</span></code> 是一个指向 <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> 模型的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code>，这将限制 <code class=\"docutils literal notranslate\"><span class=\"pre\">list_filter</span></code> 的选择只列出写过书的用户，而不是列出所有用户。</p>\n<p>你可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">EmptyFieldListFilter</span></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=\"w\"> </span><span class=\"nc\">BookAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">EmptyFieldListFilter</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>通过使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">__in</span></code> 查询，可以过滤一组值中的任何一个。你需要重写 <code class=\"docutils literal notranslate\"><span class=\"pre\">expected_parameters</span></code> 方法，并指定具有适当字段名称的 <code class=\"docutils literal notranslate\"><span class=\"pre\">lookup_kwargs</span></code> 属性。默认情况下，查询字符串中的多个值将用逗号分隔，但可以通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">list_separator</span></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=\"w\"> </span><span class=\"nc\">FilterWithCustomSeparator</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">FieldListFilter</span><span class=\"p\">):</span>\n    <span class=\"c1\"># custom list separator that should be used to separate values.</span>\n    <span class=\"n\">list_separator</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;|&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">field</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">model_admin</span><span class=\"p\">,</span> <span class=\"n\">field_path</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">lookup_kwarg</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">__in&quot;</span> <span class=\"o\">%</span> <span class=\"n\">field_path</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=\"n\">field</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"n\">model_admin</span><span class=\"p\">,</span> <span class=\"n\">field_path</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">expected_parameters</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">lookup_kwarg</span><span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>不支持 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> 字段。</p>\n</aside>\n<p>列表过滤器通常只在过滤器具有多个选择时才会出现。过滤器的 <code class=\"docutils literal notranslate\"><span class=\"pre\">has_output()</span></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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FilterWithCustomTemplate</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">SimpleListFilter</span><span class=\"p\">):</span>\n    <span class=\"n\">template</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;custom_template.html&quot;</span>\n</code></pre></div>\n<p>具体的例子请看 Django 提供的默认模板（<code class=\"docutils literal notranslate\"><span class=\"pre\">admin/filter.html</span></code>）。</p>\n</section>\n<section id=\"facets\">\n<span id=\"facet-filters\"></span><h2>Facets<a class=\"heading-anchor\" href=\"#facets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"5.0\">\n<p class=\"version-note-title\">New in Django 5.0</p></aside>\n<p>默认情况下，可以通过在管理界面上切换打开来显示每个筛选器的计数，称为 facets。这些计数将根据当前应用的筛选器而更新。有关更多详细信息，请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.show_facets\" title=\"django.contrib.admin.ModelAdmin.show_facets\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">ModelAdmin.show_facets</span></code></a>。</p>\n</section>","rootId":"modeladmin-list-filters","toc":[{"title":"使用字段名称","anchor":"using-a-field-name","children":[]},{"title":"使用 SimpleListFilter","anchor":"using-a-simplelistfilter","children":[]},{"title":"使用字段名称和显式的 FieldListFilter","anchor":"using-a-field-name-and-an-explicit-fieldlistfilter","children":[]},{"title":"Facets","anchor":"facets","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/5.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/5.1/ref/contrib/"},{"docname":"ref/contrib/admin/index","title":"Django 管理站点","url":"/zh-hans/5.1/ref/contrib/admin/"}],"prev":{"docname":"ref/contrib/admin/actions","title":"管理动作","url":"/zh-hans/5.1/ref/contrib/admin/actions/"},"next":{"docname":"ref/contrib/admin/admindocs","title":"Django 管理文档生成器","url":"/zh-hans/5.1/ref/contrib/admin/admindocs/"},"formats":{"html":"/zh-hans/5.1/ref/contrib/admin/filters/","markdown":"/zh-hans/5.1/ref/contrib/admin/filters.md","json":"/zh-hans/5.1/ref/contrib/admin/filters.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/ref/contrib/admin/filters.txt","official":"https://docs.djangoproject.com/zh-hans/5.1/ref/contrib/admin/filters/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}