{"title":"编写文档","version":"3.2","locale":"zh-hans","docname":"internals/contributing/writing-documentation","url":"/zh-hans/3.2/internals/contributing/writing-documentation/","canonical":"https://djangodocs.dev/zh-hans/3.2/internals/contributing/writing-documentation/","summary":"我们极其重视文档的一致性和可读性。毕竟，Django 是在需要快速发布新闻的环境下开发的！所以，我们像对待我们的代码一样对待我们的文档：我们期望尽可能频繁地更新它。","html":"<h1>编写文档<a class=\"heading-anchor\" href=\"#writing-documentation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>我们极其重视文档的一致性和可读性。毕竟，Django 是在需要快速发布新闻的环境下开发的！所以，我们像对待我们的代码一样对待我们的文档：我们期望尽可能频繁地更新它。</p>\n<p>一般来说，文档会在以下两种情况时更新：</p>\n<ul class=\"simple\">\n<li><p>一般改进：通过更清晰的书写和更多示例，更正、修复文档错误，更好的解释功能。</p></li>\n<li><p>新特性：自上一个版本发布后，添加到框架中的功能文档。</p></li>\n</ul>\n<p>本节介绍文档作者如何以最有用和最不容易出错的方式修改文档。</p>\n<section id=\"getting-the-raw-documentation\">\n<h2>获得原始文档<a class=\"heading-anchor\" href=\"#getting-the-raw-documentation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django 文档可在 <a class=\"reference external\" href=\"https://docs.djangoproject.com/\">https://docs.djangoproject.com/</a> 以网页的形式阅读，但我们以一种更灵活的方式编辑它——一系列的文本文件。这些文件位于  Django 的每个发布分支的顶级目录 <code class=\"docutils literal notranslate\">docs/</code> 下。</p>\n<p>如果你想开始为我们的文档做贡献，请从源代码库中获取 Django 的开发版本（见 <a class=\"reference internal\" href=\"/zh-hans/3.2/topics/install/#installing-development-version\"><span class=\"std std-ref\">安装开发版本</span></a>）。开发版有最新、最棒的文档，就像它有最新、最棒的代码一样。在提交者的决定下，我们也会将文档的修正和改进向后移植到最后的发行分支。这是因为让最后一个发行的文档是最新的和正确的是非常有利的（见 <a class=\"reference internal\" href=\"/zh-hans/3.2/intro/whatsnext/#differences-between-doc-versions\"><span class=\"std std-ref\">版本之间的差异</span></a>）。</p>\n</section>\n<section id=\"getting-started-with-sphinx\">\n<h2>开始使用 Sphinx<a class=\"heading-anchor\" href=\"#getting-started-with-sphinx\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django  的文档使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/\">Sphinx</a> 文档系统——基于 <a class=\"reference external\" href=\"https://docutils.sourceforge.io/\">docutils</a>。基本思想是将轻量格式话的纯文本转化为 HTML，PDF 或其它任意输出格式。</p>\n<p>要在本地构建文档，请安装 Sphinx：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python -m pip install Sphinx\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install Sphinx\n</code></pre></div></div></div>\n<p>然后从 <code class=\"docutils literal notranslate\">docs</code> 目录下，编译 HTML：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>make html\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> make.bat html\n</code></pre></div></div></div>\n<p>编写文档前，你需要阅读 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html#rst-index\" title=\"(in Sphinx v9.1.1)\"><span class=\"xref std std-ref\">reStructuredText 指引</span></a>。</p>\n<p>Your locally-built documentation will be themed differently than the\ndocumentation at <a class=\"reference external\" href=\"https://docs.djangoproject.com/\">docs.djangoproject.com</a>.\nThis is OK! If your changes look good on your local machine, they'll look good\non the website.</p>\n</section>\n<section id=\"how-the-documentation-is-organized\">\n<h2>文档是如何组成<a class=\"heading-anchor\" href=\"#how-the-documentation-is-organized\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>文档被分为以下几个类别：</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/3.2/intro/\"><span class=\"doc\">教程</span></a> 通过几步手把手的教学帮助读者创建一个小玩意。</p>\n<p>教程的目的是帮助读者尽可能早地实现一些有用的东西，以便给他们带来信心。</p>\n<p>解释我们要解决的问题的性质，这样读者就能理解我们要实现的目标。不要觉得你需要从解释事情的运作开始 —— 重要的是读者做什么，而不是你解释什么。参考你所做的事情并在事后进行解释可能会有帮助。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/3.2/topics/\"><span class=\"doc\">主题指引</span></a> 旨在在一个较高的层次介绍一个原则或主题。</p>\n<p>链接至参考资料而不要重复它。使用示例时，不要不情愿解释对您而言非常基本的事物——它对别人而言可能需要解释。</p>\n<p>提供背景信息有助于新人将主题和他们已知的东西联系起来。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/3.2/ref/\"><span class=\"doc\">参考指南</span></a> 包含 API 的技术参考。它们描述了 Django 的内部机制的运作，并指导其使用。</p>\n<p>让参考资料紧紧围绕着主题。假设读者已经理解了所涉及的基本概念，但需要知道或被提醒 Django 是如何做到的。</p>\n<p>参考指南并不是进行一般性解释的地方。如果你发现自己在解释基本概念，你可能想把这些材料移到主题指南中。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/3.2/howto/\"><span class=\"doc\">操作指南</span></a> 是带领读者完成关键科目步骤的方法。</p>\n<p>在指南中最重要的是用户想要实现什么。一个指南应该始终以结果为导向，而不是专注于 Django 如何实现所讨论的内部细节。</p>\n<p>这些指南比教程更高级，并假定有一些关于 Django 如何工作的知识。假设读者已经学习了教程，并且毫不犹豫地让读者回到相应的教程，而不是重复同样的材料。</p>\n</li>\n</ul>\n</section>\n<section id=\"writing-style\">\n<h2>书写格式<a class=\"heading-anchor\" href=\"#writing-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>当使用代词指代一个假设的人时，如 “a user with a session cookie”，应使用性别中性的代词（they/their/them）。而不是：</p>\n<ul class=\"simple\">\n<li><p>he 或 she……使用 they。</p></li>\n<li><p>him 或 her... 使用 them。</p></li>\n<li><p>his 或 her……使用 their。</p></li>\n<li><p>his 或 hers... 使用 theirs。</p></li>\n<li><p>himself 或 herself... 使用 themselves。</p></li>\n</ul>\n<p>尽量避免使用将任务或操作的难度降到最低的词语，如 “easily”、“simply”、“just”、“merely”、“straightforward” 等等。人们的经验可能与你的期望不符，当他们发现某个步骤并不像暗示的那样 “straightforward” 或 “simple” 时，可能会感到沮丧。</p>\n</section>\n<section id=\"commonly-used-terms\">\n<h2>常用术语<a class=\"heading-anchor\" href=\"#commonly-used-terms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>以下是整个文档中常用术语的一些格式指南：</p>\n<ul class=\"simple\">\n<li><p><strong>Django</strong> -- 当提及该框架时，大写 Django。它仅在 Python 代码中和 djangoproject.com 徽标中使用小写字母。</p></li>\n<li><p><strong>email</strong> -- 无连字符。</p></li>\n<li><p><strong>MySQL</strong>, <strong>PostgreSQL</strong>, <strong>SQLite</strong></p></li>\n<li><p><strong>SQL</strong> -- 当提及 SQL 时，预期的发音应该是 “Ess Queue Ell” 而不是 “sequel”。因此，在诸如 “Returns an SQL expression” 之类的短语中，“SQL” 前应该使用 “an” 而不是 “a”。</p></li>\n<li><p><strong>Python</strong> -- 当提及该语言时大写。</p></li>\n<li><p><strong>realize</strong>, <strong>customize</strong>, <strong>initialize</strong>, etc. -- 使用美式的 “ize” 后缀，而不是 “ise”。</p></li>\n<li><p><strong>subclass</strong> -- 它是一个没有连字符的单个单词，既作为动词（“子类模型”）又作为名词（“创建子类”）。</p></li>\n<li><p><strong>Web</strong>, <strong>World Wide Web</strong>, <strong>the Web</strong> -- 指万维网时注意 Web 总是大写。</p></li>\n<li><p><strong>website</strong> -- 用一个单词表示，不大写。</p></li>\n</ul>\n</section>\n<section id=\"django-specific-terminology\">\n<h2>Django 专用术语<a class=\"heading-anchor\" href=\"#django-specific-terminology\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p><strong>model</strong> -- 它不是大写的。</p></li>\n<li><p><strong>template</strong> -- 它不是大写的。</p></li>\n<li><p><strong>URLconf</strong> -- 使用了三个大写字母，在 “conf” 之前没有空格。</p></li>\n<li><p><strong>view</strong> -- 它不是大写的。</p></li>\n</ul>\n</section>\n<section id=\"guidelines-for-restructuredtext-files\">\n<h2>reStructuredText 文件语法指南<a class=\"heading-anchor\" href=\"#guidelines-for-restructuredtext-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>这些准则规定了我们的 reST（reStructuredText）文档格式：</p>\n<ul>\n<li><p>在部分标题中，仅将首字母和专有名词大写。</p></li>\n<li><p>将文档以 80 个字符宽换行，除非一个代码例子被分割成两行时可读性明显降低，或者有其他好的理由。</p></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>Add ``django.contrib.auth`` to your ``INSTALLED_APPS``...\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>Add :mod:`django.contrib.auth` to your :setting:`INSTALLED_APPS`...\n</code></pre></div>\n<p>这是因为 Sphinx 将为后者生成适当的链接，这对读者有很大帮助。</p>\n<p>你可以在目标前加一个 <code class=\"docutils literal notranslate\">~</code> （那是一个波浪号）来获得该路径的 “最后一点”。所以 <code class=\"docutils literal notranslate\">:mod:`~django.contrib.auth</code> 将显示一个标题为 “auth” 的链接。</p>\n</li>\n<li><p>使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html#module-sphinx.ext.intersphinx\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref py py-mod docutils literal notranslate\">intersphinx</code></a> 来引用 Python 和 Sphinx 的文档。</p></li>\n<li><p>在文字块中加入 <code class=\"docutils literal notranslate\">.. code-block:: &lt;lang&gt;</code>，使其得到高亮。更倾向于使用 <code class=\"docutils literal notranslate\">::</code> （两个冒号）来自动突出显示。这样做的好处是，如果代码中包含一些无效的语法，它就不会被高亮显示。例如，添加 <code class=\"docutils literal notranslate\">.. code-block:: python</code>，就可以在无效的语法中强制高亮显示。</p></li>\n<li><p>为了提高可读性，使用 <code class=\"docutils literal notranslate\">.. admonition:: Descriptive title</code> 而不是 <code class=\"docutils literal notranslate\">.. note::</code>。尽量少使用这些方框。</p></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=\"o\">===</span>\nOne\n<span class=\"o\">===</span>\n\nTwo\n<span class=\"o\">===</span>\n\nThree\n<span class=\"o\">-----</span>\n\nFour\n<span class=\"o\">~~~~</span>\n\nFive\n<span class=\"o\">^^^^</span>\n</code></pre></div>\n</li>\n<li><p>使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-rfc\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref rst rst-role docutils literal notranslate\">:rfc:</code></a> 来引用 RFC，如果可能，尽量链接到相关章节。例如，使用 <code class=\"docutils literal notranslate\">:rfc:`2324#section-2.3.2`</code> 或 <code class=\"docutils literal notranslate\">:rfc:`Custom link text &lt;2324#section-2.3.2&gt;`</code>。</p></li>\n<li><p>使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-pep\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref rst rst-role docutils literal notranslate\">:pep:</code></a> 来引用 Python 增强建议（PEP），如果可能的话，尽量链接到相关章节。例如，使用 <code class=\"docutils literal notranslate\">:pep:`20#easter-egg`</code> 或 <code class=\"docutils literal notranslate\">:pep:`Easter Egg &lt;20#easter-egg&gt;`</code>。</p></li>\n<li><p>使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-mimetype\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref rst rst-role docutils literal notranslate\">:mimetype:</code></a> 来指代一个 MIME 类型，除非在代码示例中引用了这个值。</p></li>\n<li><p>使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/referencing.html#role-envvar\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref rst rst-role docutils literal notranslate\">:envvar:</code></a> 来指代一个环境变量。你可能还需要使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/domains/standard.html#directive-envvar\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref rst rst-dir docutils literal notranslate\">...envvar::</code></a> 来定义一个对该环境变量的文档的引用。</p></li>\n</ul>\n</section>\n<section id=\"django-specific-markup\">\n<h2>Django 特有的标记<a class=\"heading-anchor\" href=\"#django-specific-markup\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>除了 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html#rst-index\" title=\"(in Sphinx v9.1.1)\"><span class=\"xref std std-ref\">Sphinx 的内置标记</span></a>，Django 的文档定义了一些额外的描述单元：</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=\"o\">..</span> setting<span class=\"p\">::</span> INSTALLED_APPS\n</code></pre></div>\n<p>为了连接配置，请使用配置 <code class=\"docutils literal notranslate\">:setting:`INSTALLED_APPS`</code>。</p>\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=\"o\">..</span> templatetag<span class=\"p\">::</span> regroup\n</code></pre></div>\n<p>为了链接，请使用 <code class=\"docutils literal notranslate\">:ttag:`regroup`</code>。</p>\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=\"o\">..</span> templatefilter<span class=\"p\">::</span> linebreaksbr\n</code></pre></div>\n<p>为了链接，请使用 <code class=\"docutils literal notranslate\">:tfilter:`linebreaksbr`</code> 。</p>\n</li>\n<li><p>字段查询（例如 <code class=\"docutils literal notranslate\">Foo.objects.filter(bar__exact=whatever)</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=\"o\">..</span> fieldlookup<span class=\"p\">::</span> exact\n</code></pre></div>\n<p>为了链接，请使用 <code class=\"docutils literal notranslate\">:lookup:`exact`</code>。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">django-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=\"o\">..</span> django<span class=\"o\">-</span>admin<span class=\"p\">::</span> migrate\n</code></pre></div>\n<p>为了链接，请使用 <code class=\"docutils literal notranslate\">:djadmin:`migrate`</code>。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\">django-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=\"o\">..</span> django<span class=\"o\">-</span>admin<span class=\"o\">-</span>option<span class=\"p\">::</span> <span class=\"o\">--</span>traceback\n</code></pre></div>\n<p>为了链接，请使用 <code class=\"docutils literal notranslate\">:option:`command_name --trackback</code> （或者省略 <code class=\"docutils literal notranslate\">command_name</code>，用于所有命令共享的选项，如 <code class=\"docutils literal notranslate\">--verbosity</code>）。</p>\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>:ticket:`12345`\n</code></pre></div>\n</li>\n</ul>\n<p>Django 的文档使用一个自定义的 <code class=\"docutils literal notranslate\">console</code> 指令，用于记录涉及 <code class=\"docutils literal notranslate\">django-admin</code>、<code class=\"docutils literal notranslate\">manage.py</code>、<code class=\"docutils literal notranslate\">python</code> 等的命令行实例。在 HTML 文档中，它渲染了一个双选项卡 UI，其中一个选项卡显示 Unix 风格的命令提示符，第二个选项卡显示 Windows 提示符。</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>use this command:\n\n.. code-block:: console\n\n    $ python manage.py shell\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>use this command:\n\n.. console::\n\n    $ python manage.py shell\n</code></pre></div>\n<p>请注意两件事：</p>\n<ul class=\"simple\">\n<li><p>你通常会替换出现的 <code class=\"docutils literal notranslate\">.. code-block:: console</code> 指令。</p></li>\n<li><p>你不需要改变代码例子的实际内容。你仍然假设 Unix-y 环境来编写它（即一个 <code class=\"docutils literal notranslate\">'$'</code> 提示符号，<code class=\"docutils literal notranslate\">'/'</code> 作为文件系统路径组件分隔符等等）。</p></li>\n</ul>\n<p>上面的例子将呈现一个有两个选项卡的代码示例块。第一个将显示：</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py shell\n</code></pre></div>\n<p>与 <code class=\"docutils literal notranslate\">.. code-block:: console</code> 所呈现的内容相比没有变化）。</p>\n<p>第二个将显示：</p>\n<div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows code\"><code><span class=\"gp\">...\\&gt;</span> py manage.py shell\n</code></pre></div>\n</section>\n<section id=\"documenting-new-features\">\n<span id=\"id3\"></span><h2>记录新功能<a class=\"heading-anchor\" href=\"#documenting-new-features\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>我们对新功能的政策是：</p>\n<blockquote>\n<div><p>所有关于新功能的文档都应该以明确指定该功能只在 Django 开发版本中可用的方式来编写。假设文档读者使用的是最新版本，而不是开发版本。</p>\n</div></blockquote>\n<p>我们首选的标记新特性的方法是在特性的文档前加上。&quot;<code class=\"docutils literal notranslate\">.. versionadded:: X.Y</code>&quot;，后面是一个强制性的空行和一个可选的描述（缩进）。</p>\n<p>常规改进或应强调的其他 API 更改应使用 &quot;<code class=\"docutils literal notranslate\">.. versionchanged:: X.Y</code>&quot; 指令（与上述 <code class=\"docutils literal notranslate\">versionadded</code> 相同。</p>\n<p>这些 <code class=\"docutils literal notranslate\">versionadded</code> 和 <code class=\"docutils literal notranslate\">versionchanged</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>.. class:: Author(first_name, last_name, middle_name=None)\n\n    A person who writes books.\n\n    ``first_name`` is ...\n\n    ...\n\n    ``middle_name`` is ...\n\n    .. versionchanged:: A.B\n\n        The ``middle_name`` argument was added.\n</code></pre></div>\n<p>把修改后的注解说明放在一个章节的底部，而不是顶部。</p>\n<p>另外，避免在 <code class=\"docutils literal notranslate\">versionadded</code> 或 <code class=\"docutils literal notranslate\">versionchanged</code> 块之外提及 Django 的特定版本。即使在代码块中，这样做也是多余的，因为这些注解分别呈现为 &quot;New in Django A.B:&quot; 和 &quot;Changed in Django A.B&quot;。</p>\n<p>如果增加了一个函数、属性等，使用 <code class=\"docutils literal notranslate\">versionadded</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=\"o\">..</span> attribute<span class=\"p\">::</span> Author<span class=\"o\">.</span>middle_name\n\n    <span class=\"o\">..</span> versionadded<span class=\"p\">::</span> A<span class=\"o\">.</span>B\n\n    An author<span class=\"s1\">&#39;s middle name.</span>\n</code></pre></div>\n<p>我们可以删除 <code class=\"docutils literal notranslate\">.. versionadded:: A.B</code> 注解，而不需要在时间上做任何缩进的改变。</p>\n</section>\n<section id=\"minimizing-images\">\n<h2>最小化图像<a class=\"heading-anchor\" href=\"#minimizing-images\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>尽可能地优化图像压缩。对于 PNG 文件，使用 OptiPNG 和 AdvanceCOMP 的 <code class=\"docutils literal notranslate\">advpng</code>：</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span><span class=\"nb\">cd</span> docs\n<span class=\"gp\">$ </span>optipng -o7 -zm1-9 -i0 -strip all <span class=\"sb\">`</span>find . -type f -not -path <span class=\"s2\">&quot;./_build/*&quot;</span> -name <span class=\"s2\">&quot;*.png&quot;</span><span class=\"sb\">`</span>\n<span class=\"gp\">$ </span>advpng -z4 <span class=\"sb\">`</span>find . -type f -not -path <span class=\"s2\">&quot;./_build/*&quot;</span> -name <span class=\"s2\">&quot;*.png&quot;</span><span class=\"sb\">`</span>\n</code></pre></div>\n<p>This is based on OptiPNG version 0.7.5. Older versions may complain about the\n<code class=\"docutils literal notranslate\">-strip all</code> option being lossy.</p>\n</section>\n<section id=\"an-example\">\n<h2>一个例子<a class=\"heading-anchor\" href=\"#an-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>有关如何将它们组合在一起的快速示例，请考虑以下假设示例：</p>\n<ul>\n<li><p>首先， <code class=\"docutils literal notranslate\">ref/settings.txt</code> 配置文件可能具有如下总体布局：</p>\n<div class=\"code-block\" data-language=\"rst\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">========</span>\n<span class=\"gh\">Settings</span>\n<span class=\"gh\">========</span>\n\n<span class=\"c\">...</span>\n\n<span class=\"p\">..</span> <span class=\"nt\">_available-settings:</span>\n\n<span class=\"gh\">Available settings</span>\n<span class=\"gh\">==================</span>\n\n<span class=\"c\">...</span>\n\n<span class=\"p\">..</span> <span class=\"nt\">_deprecated-settings:</span>\n\n<span class=\"gh\">Deprecated settings</span>\n<span class=\"gh\">===================</span>\n\n<span class=\"c\">...</span>\n</code></pre></div>\n</li>\n<li><p>接下来， <code class=\"docutils literal notranslate\">topics/settings.txt</code> 配置文档可能包含以下内容：</p>\n<div class=\"code-block\" data-language=\"rst\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code>You can access a :ref:`listing of all available settings\n<span class=\"nt\">&lt;available-settings&gt;</span>`. For a list of deprecated settings see\n<span class=\"na\">:ref:</span><span class=\"nv\">`deprecated-settings`</span>.\n\nYou can find both in the :doc:`settings reference document\n<span class=\"nt\">&lt;/ref/settings&gt;</span>`.\n</code></pre></div>\n<p>当我们想链接到另一个文档时，我们使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/referencing.html#role-doc\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref rst rst-role docutils literal notranslate\">doc</code></a> 交叉引用元素；当我们想链接到文档中的任意的位置时，请使用 <a class=\"reference external\" href=\"https://www.sphinx-doc.org/en/master/usage/referencing.html#role-ref\" title=\"(in Sphinx v9.1.1)\"><code class=\"xref rst rst-role docutils literal notranslate\">ref</code></a> 元素。</p>\n</li>\n<li><p>接下来，请注意配置的注解方式：</p>\n<div class=\"code-block\" data-language=\"rst\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"p\">..</span> <span class=\"ow\">setting</span><span class=\"p\">::</span> ADMINS\n\n<span class=\"gh\">ADMINS</span>\n<span class=\"gh\">======</span>\n\nDefault: <span class=\"s\">``[]``</span> (Empty list)\n\nA list of all the people who get code error notifications. When\n<span class=\"s\">``DEBUG=False``</span> and a view raises an exception, Django will email these people\nwith the full exception information. Each member of the list should be a tuple\nof (Full name, email address). Example<span class=\"se\">::</span>\n\n<span class=\"s\">    [(&#39;John&#39;, &#39;john@example.com&#39;), (&#39;Mary&#39;, &#39;mary@example.com&#39;)]</span>\n\nNote that Django will email <span class=\"ge\">*all*</span> of these people whenever an error happens.\nSee <span class=\"na\">:doc:</span><span class=\"nv\">`/howto/error-reporting`</span> for more information.\n</code></pre></div>\n<p>这标志着下面的标题是配置 <code class=\"docutils literal notranslate\">ADMINS</code> 的 “标准” 目标。这意味着当我谈到 <code class=\"docutils literal notranslate\">ADMINS</code> 时，我可以用 <code class=\"docutils literal notranslate\">:setting:`ADMINS`</code> 来引用它。</p>\n</li>\n</ul>\n<p>基本上，这就是所有东西融合在一起的方式。</p>\n</section>\n<section id=\"spelling-check\">\n<span id=\"documentation-spelling-check\"></span><h2>拼写检查<a class=\"heading-anchor\" href=\"#spelling-check\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>在你提交你的文档之前，运行拼写检查器是个好主意。你需要先安装 <a class=\"reference external\" href=\"https://pypi.org/project/sphinxcontrib-spelling/\">sphinxcontrib-spelling</a> 。然后从 <code class=\"docutils literal notranslate\">docs</code> 目录下，运行 <code class=\"docutils literal notranslate\">make spelling</code>。错误的词（如果有的话）以及它们出现的文件和行号将被保存到 <code class=\"docutils literal notranslate\">_build/spelling/output.txt</code>。</p>\n<p>如果你遇到假阳性的情况（错误输出实际上是正确的），请采取以下措施之一：</p>\n<ul class=\"simple\">\n<li><p>用重音（`）包围内联代码或品牌／技术名称。</p></li>\n<li><p>查找拼写检查程序发现的同义词。</p></li>\n<li><p>如果，只是如果，你确定你的单词拼写是正确的——将其加入 <code class=\"docutils literal notranslate\">docs/spelling_wordlist</code> （请保持这个列表以字母顺序排列）。</p></li>\n</ul>\n</section>\n<section id=\"translating-documentation\">\n<h2>翻译文档<a class=\"heading-anchor\" href=\"#translating-documentation\"><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/3.2/internals/contributing/localizing/#translating-documentation\"><span class=\"std std-ref\">本地化 Django 文档</span></a>，如果你想帮助我们将文档翻译成其它语言。</p>\n</section>\n<section id=\"django-admin-man-page\">\n<span id=\"django-admin-manpage\"></span><h2><code class=\"docutils literal notranslate\">django-admin</code> 手册页面<a class=\"heading-anchor\" href=\"#django-admin-man-page\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sphinx 可以为 <a class=\"reference internal\" href=\"/zh-hans/3.2/ref/django-admin/\"><span class=\"doc\">django-admin</span></a> 命令生成一个手册页。这是在 <code class=\"docutils literal notranslate\">docs/conf.py</code> 中配置的。与其他文档输出不同，这个手册页应该包含在 Django 仓库和版本中，作为 <code class=\"docutils literal notranslate\">docs/man/django-admin.1</code>。在更新文档时不需要更新这个文件，因为它作为发行过程的一部分被更新一次。</p>\n<p>要生成更新版本的手册，请在 <code class=\"docutils literal notranslate\">docs</code> 目录下运行 <code class=\"docutils literal notranslate\">make man</code>。新的手册页将写在 <code class=\"docutils literal notranslate\">docs/_build/man/django-admin.1</code>。</p>\n</section>","rootId":"writing-documentation","toc":[{"title":"获得原始文档","anchor":"getting-the-raw-documentation","children":[]},{"title":"开始使用 Sphinx","anchor":"getting-started-with-sphinx","children":[]},{"title":"文档是如何组成","anchor":"how-the-documentation-is-organized","children":[]},{"title":"书写格式","anchor":"writing-style","children":[]},{"title":"常用术语","anchor":"commonly-used-terms","children":[]},{"title":"Django 专用术语","anchor":"django-specific-terminology","children":[]},{"title":"reStructuredText 文件语法指南","anchor":"guidelines-for-restructuredtext-files","children":[]},{"title":"Django 特有的标记","anchor":"django-specific-markup","children":[]},{"title":"记录新功能","anchor":"documenting-new-features","children":[]},{"title":"最小化图像","anchor":"minimizing-images","children":[]},{"title":"一个例子","anchor":"an-example","children":[]},{"title":"拼写检查","anchor":"spelling-check","children":[]},{"title":"翻译文档","anchor":"translating-documentation","children":[]},{"title":"django-admin 手册页面","anchor":"django-admin-man-page","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Django internals","url":"/zh-hans/3.2/internals/"},{"docname":"internals/contributing/index","title":"为 Django 做贡献","url":"/zh-hans/3.2/internals/contributing/"}],"prev":{"docname":"internals/contributing/writing-code/javascript","title":"JavaScript","url":"/zh-hans/3.2/internals/contributing/writing-code/javascript/"},"next":{"docname":"internals/contributing/localizing","title":"使 Django 本地化","url":"/zh-hans/3.2/internals/contributing/localizing/"},"formats":{"html":"/zh-hans/3.2/internals/contributing/writing-documentation/","markdown":"/zh-hans/3.2/internals/contributing/writing-documentation.md","json":"/zh-hans/3.2/internals/contributing/writing-documentation.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/internals/contributing/writing-documentation.txt","official":"https://docs.djangoproject.com/zh-hans/3.2/internals/contributing/writing-documentation/","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","it","pt-br","ko","es","el","pl"]}