{"title":"复写模板","version":"2.2","locale":"zh-hans","docname":"howto/overriding-templates","url":"/zh-hans/2.2/howto/overriding-templates/","canonical":"https://djangodocs.dev/zh-hans/2.2/howto/overriding-templates/","summary":"在项目中，你可以想要在另一个 Django 应用中重写模板，不论它是第三方应用或 contrib 应用，例如 django.contrib.admin 。你可以将重写的模板置于工程的模板目录或应用的模板目录。 若应用和工程的模板模板都包含被重写的模板，默认的 Django…","html":"<h1>复写模板<a class=\"heading-anchor\" href=\"#overriding-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>在项目中，你可以想要在另一个 Django 应用中重写模板，不论它是第三方应用或 contrib 应用，例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code>。你可以将重写的模板置于工程的模板目录或应用的模板目录。</p>\n<p>若应用和工程的模板模板都包含被重写的模板，默认的 Django 模板加载器会先尝试加载工程目录下的模板。换句话说，先查找 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a>，其次 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a>。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>阅读 <span class=\"xref std std-ref\">重写内置视图模板</span> 若你正在找相关资料。</p>\n</aside>\n<section id=\"overriding-from-the-project-s-templates-directory\">\n<h2>重写来自工程目录的模板<a class=\"heading-anchor\" href=\"#overriding-from-the-project-s-templates-directory\"><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\">blog</span></code> 的模板，该应用提供了 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog/post.html</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog/list.html</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\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n\n<span class=\"n\">BASE_DIR</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">dirname</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">dirname</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">abspath</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">)))</span>\n\n<span class=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;blog&#39;</span><span class=\"p\">,</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n\n<span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.template.backends.django.DjangoTemplates&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;DIRS&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">BASE_DIR</span><span class=\"p\">,</span> <span class=\"s1\">&#39;templates&#39;</span><span class=\"p\">)],</span>\n        <span class=\"s1\">&#39;APP_DIRS&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"o\">...</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>若用模板工程模板创建工程，则 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">BASE_DIR</span></code> 早已存在。需要修改的配置是 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a>。</p>\n<p>这些配置假定在工程根目录下有个 <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> 目录。要重写 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code> 应用的模板，在 <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> 目录中创建一个文件夹，然后将以下模板文件添加至该目录：</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</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=\"None code\"><code>templates/\n    blog/\n        list.html\n        post.html\n</code></pre></div>\n<p>模板加载器会先查找 <code class=\"docutils literal notranslate\"><span class=\"pre\">DIRS</span></code> 目录下的模板。当 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog</span></code> 应用中的视图要求 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog/post.html</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog/list.html</span></code> 模板，加载器会返回你刚创建的文件。</p>\n</section>\n<section id=\"overriding-from-an-app-s-template-directory\">\n<h2>重写来自应用模板目录的模板<a class=\"heading-anchor\" href=\"#overriding-from-an-app-s-template-directory\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<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=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"o\">...</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;APP_DIRS&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"o\">...</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>若你想重写名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog/list.html</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">blog/post.html</span></code> 的模板，并将它们置于名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp</span></code> 的应用中，那么目录结构应该看起来像这样：</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</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=\"None code\"><code>myapp/\n    templates/\n        blog/\n            list.html\n            post.html\n</code></pre></div>\n<p>当 <a class=\"reference internal\" href=\"/zh-hans/2.2/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> 置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，模板加载器会深入应用的模板目录查找模板。</p>\n</section>","rootId":"overriding-templates","toc":[{"title":"重写来自工程目录的模板","anchor":"overriding-from-the-project-s-templates-directory","children":[]},{"title":"重写来自应用模板目录的模板","anchor":"overriding-from-an-app-s-template-directory","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"操作指南","url":"/zh-hans/2.2/howto/"}],"prev":{"docname":"howto/outputting-pdf","title":"利用 Django 输出 PDF","url":"/zh-hans/2.2/howto/outputting-pdf/"},"next":{"docname":"howto/static-files/index","title":"管理静态文件（比如图片、JavaScript、CSS）","url":"/zh-hans/2.2/howto/static-files/"},"formats":{"html":"/zh-hans/2.2/howto/overriding-templates/","markdown":"/zh-hans/2.2/howto/overriding-templates.md","json":"/zh-hans/2.2/howto/overriding-templates.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/howto/overriding-templates.txt","official":"https://docs.djangoproject.com/zh-hans/2.2/howto/overriding-templates/","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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}