{"title":"编码风格","version":"2.2","locale":"zh-hans","docname":"internals/contributing/writing-code/coding-style","url":"/zh-hans/2.2/internals/contributing/writing-code/coding-style/","canonical":"https://djangodocs.dev/zh-hans/2.2/internals/contributing/writing-code/coding-style/","summary":"当编写Django代码时，请遵从这些编码标准。 Python 编码风格 Link to this heading # Please conform to the indentation style dictated in the .editorconfig file. We recommend using a text…","html":"<h1>编码风格<a class=\"heading-anchor\" href=\"#coding-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>当编写Django代码时，请遵从这些编码标准。</p>\n<section id=\"python-style\">\n<span id=\"coding-style-python\"></span><h2>Python 编码风格<a class=\"heading-anchor\" href=\"#python-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>Please conform to the indentation style dictated in the <code class=\"docutils literal notranslate\"><span class=\"pre\">.editorconfig</span></code>\nfile. We recommend using a text editor with <a class=\"reference external\" href=\"https://editorconfig.org/\">EditorConfig</a> support to avoid\nindentation and whitespace issues. The Python files use 4 spaces for\nindentation and the HTML files use 2 spaces.</p></li>\n<li><p>除非另有约定的情况下，否则遵从 PEP8 编码规范。</p>\n<p>Use <a class=\"reference external\" href=\"https://pypi.org/project/flake8/\">flake8</a> to check for problems in this area. Note that our <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.cfg</span></code>\nfile contains some excluded files (deprecated modules we don't care about\ncleaning up and some third-party code that Django vendors) as well as some\nexcluded errors that we don't consider as gross violations. Remember that\n<span class=\"target\" id=\"index-1\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a> is only a guide, so respect the style of the surrounding code as a\nprimary goal.</p>\n<p>An exception to <span class=\"target\" id=\"index-2\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a> is our rules on line lengths. Don't limit lines of\ncode to 79 characters if it means the code looks significantly uglier or is\nharder to read. We allow up to 119 characters as this is the width of GitHub\ncode review; anything longer requires horizontal scrolling which makes review\nmore difficult. This check is included when you run <code class=\"docutils literal notranslate\"><span class=\"pre\">flake8</span></code>. Documentation,\ncomments, and docstrings should be wrapped at 79 characters, even though\n<span class=\"target\" id=\"index-3\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a> suggests 72.</p>\n</li>\n<li><p>使用四个空格作为缩进。</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=\"k\">raise</span> <span class=\"ne\">AttributeError</span><span class=\"p\">(</span>\n    <span class=\"s1\">&#39;Here is a multiline error message &#39;</span>\n    <span class=\"s1\">&#39;shortened for clarity.&#39;</span>\n<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\">raise</span> <span class=\"ne\">AttributeError</span><span class=\"p\">(</span><span class=\"s1\">&#39;Here is a multiline error message &#39;</span>\n                     <span class=\"s1\">&#39;shortened for clarity.&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>这样能更好的利用空间，而且可以避免当第一行长度变化时需要重新对齐。</p>\n</li>\n<li><p>Use single quotes for strings, or a double quote if the string contains a\nsingle quote. Don't waste time doing unrelated refactoring of existing code\nto conform to this style.</p></li>\n<li><p>Avoid use of &quot;we&quot; in comments, e.g. &quot;Loop over&quot; rather than &quot;We loop over&quot;.</p></li>\n<li><p>在给变量，函数和方法命名时候使用下划线而不是小驼峰 (例如：  poll.get_unique_voters(), not poll.getUniqueVoters() )。</p></li>\n<li><p>类名使用“大驼峰命名法”（或者是用在能返回类的工厂函数上面）。</p></li>\n<li><p>对于文档字符串，遵从现有文档字符串风格和 PEP257 规范。</p></li>\n<li><p>In tests, use\n<a class=\"reference internal\" href=\"/zh-hans/2.2/topics/testing/tools/#django.test.SimpleTestCase.assertRaisesMessage\" title=\"django.test.SimpleTestCase.assertRaisesMessage\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertRaisesMessage()</span></code></a> and\n<a class=\"reference internal\" href=\"/zh-hans/2.2/topics/testing/tools/#django.test.SimpleTestCase.assertWarnsMessage\" title=\"django.test.SimpleTestCase.assertWarnsMessage\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertWarnsMessage()</span></code></a>\ninstead of <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertRaises()</span></code></a> and\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertWarns\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertWarns()</span></code></a> so you can check the\nexception or warning message. Use <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaisesRegex\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertRaisesRegex()</span></code></a>\nand <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertWarnsRegex\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">assertWarnsRegex()</span></code></a> only if you need regular\nexpression matching.</p></li>\n<li><p>In test docstrings, state the expected behavior that each test demonstrates.\nDon't include preambles such as &quot;Tests that&quot; or &quot;Ensures that&quot;.</p>\n<p>Reserve ticket references for obscure issues where the ticket has additional\ndetails that can't be easily described in docstrings or comments. Include the\nticket number at the end of a sentence like this:</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=\"w\"> </span><span class=\"nf\">test_foo</span><span class=\"p\">():</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A test docstring looks like this (#123456).</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"imports\">\n<span id=\"coding-style-imports\"></span><h2>导入<a class=\"heading-anchor\" href=\"#imports\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>通过下面的指引使用 <a class=\"reference external\" href=\"https://github.com/timothycrosley/isort#readme\">isort</a> 自动给导入语句排序。</p>\n<p>Quick start:</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>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>isort\n<span class=\"gp\">$ </span>isort<span class=\"w\"> </span>-rc<span class=\"w\"> </span>.\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> pip install isort\n<span class=\"gp\">...\\&gt;</span> isort -rc .\n</code></pre></div></div></div>\n<p>这将从你的当前目录递归运行 <code class=\"docutils literal notranslate\"><span class=\"pre\">isort</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\">module</span>  <span class=\"c1\"># isort:skip</span>\n</code></pre></div>\n</li>\n<li><p>把导入这样进行分组：future库，python标准库，第三方库， 其他的Django组件，本地Django组件，try/excepts块。按照字母顺序对每个分组进行排序，按照完整的模块名称。在每个分组里面把import module句子放在 from module importobjects句子前面。对于其他Django组件使用绝对导入，对本地Django组件使用相对导入。</p></li>\n<li><p>On each line, alphabetize the items with the upper case items grouped before\nthe lowercase items.</p></li>\n<li><p>使用括号和4个连续空格构成的缩进去打破长行，在最后一个导入之后写一个逗号，把右括号放在单独一行。</p>\n<p>在最后一个导入和任何代码块之间留出一个空行，在第一个函数或类前面留出两个空行。</p>\n<p>例如（注释仅作为解释用途）：</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">django/contrib/admin/example.py</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=\"c1\"># future</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">__future__</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">unicode_literals</span>\n\n<span class=\"c1\"># standard library</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">json</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">itertools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">chain</span>\n\n<span class=\"c1\"># third-party</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">bcrypt</span>\n\n<span class=\"c1\"># Django</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Http404</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http.response</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"p\">(</span>\n    <span class=\"n\">Http404</span><span class=\"p\">,</span> <span class=\"n\">HttpResponse</span><span class=\"p\">,</span> <span class=\"n\">HttpResponseNotAllowed</span><span class=\"p\">,</span> <span class=\"n\">StreamingHttpResponse</span><span class=\"p\">,</span>\n    <span class=\"n\">cookie</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># local Django</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LogEntry</span>\n\n<span class=\"c1\"># try/except</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">yaml</span>\n<span class=\"k\">except</span> <span class=\"ne\">ImportError</span><span class=\"p\">:</span>\n    <span class=\"n\">yaml</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n<span class=\"n\">CONSTANT</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;foo&#39;</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Example</span><span class=\"p\">:</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></figure>\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=\"w\"> </span><span class=\"nn\">django.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</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=\"w\"> </span><span class=\"nn\">django.views.generic.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"template-style\">\n<h2>模版风格<a class=\"heading-anchor\" href=\"#template-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>In Django template code, put one (and only one) space between the curly\nbrackets and the tag contents.</p>\n<p>这样做：</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=\"nv\">foo</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>不要这样做：</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=\"nv\">foo</span><span class=\"cp\">}}</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"view-style\">\n<h2>视图风格<a class=\"heading-anchor\" href=\"#view-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><p>在Django的视图中，第一个参数应该总是 <code class=\"docutils literal notranslate\"><span class=\"pre\">request</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\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">foo</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</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=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">req</span><span class=\"p\">,</span> <span class=\"n\">foo</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"model-style\">\n<h2>模型风格<a class=\"heading-anchor\" href=\"#model-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul>\n<li><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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</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=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">FirstName</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">Last_Name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p> <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Meta</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\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;people&#39;</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=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;people&#39;</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=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;people&#39;</span>\n\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">20</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">40</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>模型内的类核方法的定义应该遵循以下顺序（不是所有项都是必须的）：</p>\n<ul class=\"simple\">\n<li><p>所有数据库字段</p></li>\n<li><p>自定义管理器属性</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Meta</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">__str__()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">save()</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">get_absolute_url()</span></code></p></li>\n<li><p>其他自定义方法</p></li>\n</ul>\n</li>\n<li><p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">choices</span></code> is defined for a given model field, define each choice as a\nlist of tuples, with an all-uppercase name as a class attribute on the model.\nExample:</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\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">DIRECTION_UP</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;U&#39;</span>\n    <span class=\"n\">DIRECTION_DOWN</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;D&#39;</span>\n    <span class=\"n\">DIRECTION_CHOICES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"n\">DIRECTION_UP</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Up&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"n\">DIRECTION_DOWN</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Down&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"use-of-django-conf-settings\">\n<h2>Use of <code class=\"docutils literal notranslate\"><span class=\"pre\">django.conf.settings</span></code><a class=\"heading-anchor\" href=\"#use-of-django-conf-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Modules should not in general use settings stored in <code class=\"docutils literal notranslate\"><span class=\"pre\">django.conf.settings</span></code>\nat the top level (i.e. evaluated when the module is imported). The explanation\nfor this is as follows:</p>\n<p>Manual configuration of settings (i.e. not relying on the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code> environment variable) is allowed and possible as\nfollows:</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\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n\n<span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">configure</span><span class=\"p\">({},</span> <span class=\"n\">SOME_SETTING</span><span class=\"o\">=</span><span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>However, if any setting is accessed before the <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.configure</span></code> line,\nthis will not work. (Internally, <code class=\"docutils literal notranslate\"><span class=\"pre\">settings</span></code> is a <code class=\"docutils literal notranslate\"><span class=\"pre\">LazyObject</span></code> which\nconfigures itself automatically when the settings are accessed if it has not\nalready been configured).</p>\n<p>So, if there is a module containing some code as follows:</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\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_callable</span>\n\n<span class=\"n\">default_foo_view</span> <span class=\"o\">=</span> <span class=\"n\">get_callable</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">FOO_VIEW</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...then importing this module will cause the settings object to be configured.\nThat means that the ability for third parties to import the module at the top\nlevel is incompatible with the ability to configure the settings object\nmanually, or makes it very difficult in some circumstances.</p>\n<p>Instead of the above code, a level of laziness or indirection must be used,\nsuch as <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.functional.LazyObject</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.functional.lazy()</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">lambda</span></code>.</p>\n</section>\n<section id=\"miscellaneous\">\n<h2>杂项<a class=\"heading-anchor\" href=\"#miscellaneous\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p>Mark all strings for internationalization; see the <a class=\"reference internal\" href=\"/zh-hans/2.2/topics/i18n/\"><span class=\"doc\">i18n\ndocumentation</span></a> for details.</p></li>\n<li><p>flake8将为你识别删除更改代码时不再使用的import语句，如果因为向后兼容的原因需要保留导入，则可以在导入语句后面加上# NOQA消除flake8的警告。</p></li>\n<li><p>按部就班的删除代码结尾那些增加不必要字节的空格，增加了显示混乱还可能导致偶尔的合并冲突。一些IDE可以通过配置自动删除它们，大多数版本控制工具可以在差异比较时高亮显示它们。</p></li>\n<li><p>请不要在你贡献的代码里面放入你的名字，我们的政策是把贡献者名字保存到随Django分发的AUTHORS文件里--—而不是分散在代码库里。如果你进行的不只是一次简单修改，请随意更改在你补丁中的AUTHORS文件。</p></li>\n</ul>\n</section>\n<section id=\"javascript-style\">\n<h2>JavaScript style<a class=\"heading-anchor\" href=\"#javascript-style\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>For details about the JavaScript code style used by Django, see\n<a class=\"reference internal\" href=\"/zh-hans/2.2/internals/contributing/writing-code/javascript/\"><span class=\"doc\">JavaScript</span></a>.</p>\n</section>","rootId":"coding-style","toc":[{"title":"Python 编码风格","anchor":"python-style","children":[]},{"title":"导入","anchor":"imports","children":[]},{"title":"模版风格","anchor":"template-style","children":[]},{"title":"视图风格","anchor":"view-style","children":[]},{"title":"模型风格","anchor":"model-style","children":[]},{"title":"Use of django.conf.settings","anchor":"use-of-django-conf-settings","children":[]},{"title":"杂项","anchor":"miscellaneous","children":[]},{"title":"JavaScript style","anchor":"javascript-style","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Django internals","url":"/zh-hans/2.2/internals/"},{"docname":"internals/contributing/index","title":"为 Django 做贡献","url":"/zh-hans/2.2/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"Writing code","url":"/zh-hans/2.2/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/index","title":"Writing code","url":"/zh-hans/2.2/internals/contributing/writing-code/"},"next":{"docname":"internals/contributing/writing-code/unit-tests","title":"Unit tests","url":"/zh-hans/2.2/internals/contributing/writing-code/unit-tests/"},"formats":{"html":"/zh-hans/2.2/internals/contributing/writing-code/coding-style/","markdown":"/zh-hans/2.2/internals/contributing/writing-code/coding-style.md","json":"/zh-hans/2.2/internals/contributing/writing-code/coding-style.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/internals/contributing/writing-code/coding-style.txt","official":"https://docs.djangoproject.com/zh-hans/2.2/internals/contributing/writing-code/coding-style/","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"]}