{"title":"Coding style","version":"1.11","locale":"en","docname":"internals/contributing/writing-code/coding-style","url":"/en/1.11/internals/contributing/writing-code/coding-style/","canonical":"https://djangodocs.dev/en/1.11/internals/contributing/writing-code/coding-style/","summary":"Please follow these coding standards when writing code for inclusion in Django. Python style Link to this heading # Please conform to the indentation style dictated…","html":"<h1>Coding style<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>Please follow these coding standards when writing code for inclusion in Django.</p>\n<section id=\"python-style\">\n<span id=\"coding-style-python\"></span><h2>Python style<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=\"http://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>Unless otherwise specified, follow <span class=\"target\" id=\"index-0\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0008/\"><strong>PEP 8</strong></a>.</p>\n<p>Use <a class=\"reference external\" href=\"https://pypi.python.org/pypi/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>Use four spaces for indentation.</p></li>\n<li><p>Use four space hanging indentation rather than vertical alignment:</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 multine 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>Instead of:</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 multine error message &#39;</span>\n                     <span class=\"s1\">&#39;shortened for clarity.&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This makes better use of space and avoids having to realign strings if the\nlength of the first line changes.</p>\n</li>\n<li><p>Use single quotes for strings, or a double quote if the 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 “we” in comments, e.g. “Loop over” rather than “We loop over”.</p></li>\n<li><p>Use underscores, not camelCase, for variable, function and method names\n(i.e. <code class=\"docutils literal notranslate\"><span class=\"pre\">poll.get_unique_voters()</span></code>, not <code class=\"docutils literal notranslate\"><span class=\"pre\">poll.getUniqueVoters()</span></code>).</p></li>\n<li><p>Use <code class=\"docutils literal notranslate\"><span class=\"pre\">InitialCaps</span></code> for class names (or for factory functions that\nreturn classes).</p></li>\n<li><p>In docstrings, follow the style of existing docstrings and <span class=\"target\" id=\"index-4\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0257/\"><strong>PEP 257</strong></a>.</p></li>\n<li><p>In tests, use <a class=\"reference internal\" href=\"/en/1.11/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> instead\nof <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> so you can check the exception\nmessage. 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> only if you need\nregular expression matching.</p></li>\n<li><p>In test docstrings, state the expected behavior that each test demonstrates.\nDon’t include preambles such as “Tests that” or “Ensures that”.</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>Imports<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>Use <a class=\"reference external\" href=\"https://github.com/timothycrosley/isort#readme\">isort</a> to automate\nimport sorting using the guidelines below.</p>\n<p>Quick start:</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>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<p>This runs <code class=\"docutils literal notranslate\"><span class=\"pre\">isort</span></code> recursively from your current directory, modifying any\nfiles that don’t conform to the guidelines. If you need to have imports out\nof order (to avoid a circular import, for example) use a comment 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=\"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>Put imports in these groups: future, standard library, third-party libraries,\nother Django components, local Django component, try/excepts. Sort lines in\neach group alphabetically by the full module name. Place all <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">module</span></code>\nstatements before <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">module</span> <span class=\"pre\">import</span> <span class=\"pre\">objects</span></code> in each section. Use absolute\nimports for other Django components and relative imports for local components.</p></li>\n<li><p>On each line, alphabetize the items with the upper case items grouped before\nthe lower case items.</p></li>\n<li><p>Break long lines using parentheses and indent continuation lines by 4 spaces.\nInclude a trailing comma after the last import and put the closing\nparenthesis on its own line.</p>\n<p>Use a single blank line between the last import and any module level code,\nand use two blank lines above the first function or class.</p>\n<p>For example (comments are for explanatory purposes only):</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django/contrib/admin/example.py</code></figcaption><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=\"django/contrib/admin/example.py\"><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><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></figure>\n</li>\n<li><p>Use convenience imports whenever available. For example, do 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=\"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>instead of:</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>Template style<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>Do this:</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>Don’t do this:</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>View style<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>In Django views, the first parameter in a view function should be called\n<code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>.</p>\n<p>Do 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\">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>Don’t do 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\">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>Model style<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>Field names should be all lowercase, using underscores instead of\ncamelCase.</p>\n<p>Do 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\">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>Don’t do 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\">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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Meta</span></code> should appear <em>after</em> the fields are defined, with\na single blank line separating the fields and the class definition.</p>\n<p>Do 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\">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>Don’t do 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\">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>Don’t do this, either:</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>If you define a <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__</span></code> method (previously <code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__</span></code> before Python 3\nwas supported), decorate the model class with\n<a class=\"reference internal\" href=\"/en/1.11/ref/utils/#django.utils.encoding.python_2_unicode_compatible\" title=\"django.utils.encoding.python_2_unicode_compatible\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">python_2_unicode_compatible()</span></code></a>.</p></li>\n<li><p>The order of model inner classes and standard methods should be as\nfollows (noting that these are not all required):</p>\n<ul class=\"simple\">\n<li><p>All database fields</p></li>\n<li><p>Custom manager attributes</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>Any custom methods</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\na tuple of tuples, with an all-uppercase name as a class attribute on the\nmodel. Example:</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>Miscellaneous<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=\"/en/1.11/topics/i18n/\"><span class=\"doc\">i18n\ndocumentation</span></a> for details.</p></li>\n<li><p>Remove <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span></code> statements that are no longer used when you change code.\n<a class=\"reference external\" href=\"https://pypi.python.org/pypi/flake8\">flake8</a> will identify these imports for you. If an unused import needs to\nremain for backwards-compatibility, mark the end of with <code class=\"docutils literal notranslate\"><span class=\"pre\">#</span> <span class=\"pre\">NOQA</span></code> to\nsilence the flake8 warning.</p></li>\n<li><p>Systematically remove all trailing whitespaces from your code as those\nadd unnecessary bytes, add visual clutter to the patches and can also\noccasionally cause unnecessary merge conflicts. Some IDE’s can be\nconfigured to automatically remove them and most VCS tools can be set to\nhighlight them in diff outputs.</p></li>\n<li><p>Please don’t put your name in the code you contribute. Our policy is to\nkeep contributors’ names in the <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHORS</span></code> file distributed with Django\n– not scattered throughout the codebase itself. Feel free to include a\nchange to the <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHORS</span></code> file in your patch if you make more than a\nsingle trivial change.</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=\"/en/1.11/internals/contributing/writing-code/javascript/\"><span class=\"doc\">JavaScript</span></a>.</p>\n</section>","rootId":"coding-style","toc":[{"title":"Python style","anchor":"python-style","children":[]},{"title":"Imports","anchor":"imports","children":[]},{"title":"Template style","anchor":"template-style","children":[]},{"title":"View style","anchor":"view-style","children":[]},{"title":"Model style","anchor":"model-style","children":[]},{"title":"Use of django.conf.settings","anchor":"use-of-django-conf-settings","children":[]},{"title":"Miscellaneous","anchor":"miscellaneous","children":[]},{"title":"JavaScript style","anchor":"javascript-style","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Django internals","url":"/en/1.11/internals/"},{"docname":"internals/contributing/index","title":"Contributing to Django","url":"/en/1.11/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"Writing code","url":"/en/1.11/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/index","title":"Writing code","url":"/en/1.11/internals/contributing/writing-code/"},"next":{"docname":"internals/contributing/writing-code/unit-tests","title":"Unit tests","url":"/en/1.11/internals/contributing/writing-code/unit-tests/"},"formats":{"html":"/en/1.11/internals/contributing/writing-code/coding-style/","markdown":"/en/1.11/internals/contributing/writing-code/coding-style.md","json":"/en/1.11/internals/contributing/writing-code/coding-style.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/internals/contributing/writing-code/coding-style.txt","official":"https://docs.djangoproject.com/en/1.11/internals/contributing/writing-code/coding-style/","inVersions":["dev","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","1.11","1.10","1.9","1.8"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}