123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649 |
- =====================
- Writing documentation
- =====================
- We place high importance on the consistency and readability of documentation.
- After all, Django was created in a journalism environment! So we treat our
- documentation like we treat our code: we aim to improve it as often as
- possible.
- Documentation changes generally come in two forms:
- * General improvements: typo corrections, error fixes and better
- explanations through clearer writing and more examples.
- * New features: documentation of features that have been added to the
- framework since the last release.
- This section explains how writers can craft their documentation changes
- in the most useful and least error-prone ways.
- The Django documentation process
- ================================
- Though Django's documentation is intended to be read as HTML at
- https://docs.djangoproject.com/, we edit it as a collection of plain text files
- written in the reStructuredText markup language for maximum flexibility.
- We work from the development version of the repository because it has the
- latest-and-greatest documentation, just as it has the latest-and-greatest code.
- We also backport documentation fixes and improvements, at the discretion of the
- merger, to the last release branch. This is because it's advantageous to
- have the docs for the last release be up-to-date and correct (see
- :ref:`differences-between-doc-versions`).
- Django's documentation uses the Sphinx__ documentation system, which in turn
- is based on docutils__. The basic idea is that lightly-formatted plain-text
- documentation is transformed into HTML, PDF, and any other output format.
- __ https://www.sphinx-doc.org/
- __ https://docutils.sourceforge.io/
- Sphinx includes a ``sphinx-build`` command for turning reStructuredText into
- other formats, e.g., HTML and PDF. This command is configurable, but the Django
- documentation includes a ``Makefile`` that provides a shorter ``make html``
- command.
- How the documentation is organized
- ==================================
- The documentation is organized into several categories:
- * :doc:`Tutorials </intro/index>` take the reader by the hand through a series
- of steps to create something.
- The important thing in a tutorial is to help the reader achieve something
- useful, preferably as early as possible, in order to give them confidence.
- Explain the nature of the problem we're solving, so that the reader
- understands what we're trying to achieve. Don't feel that you need to begin
- with explanations of how things work - what matters is what the reader does,
- not what you explain. It can be helpful to refer back to what you've done and
- explain afterward.
- * :doc:`Topic guides </topics/index>` aim to explain a concept or subject at a
- fairly high level.
- Link to reference material rather than repeat it. Use examples and don't be
- reluctant to explain things that seem very basic to you - it might be the
- explanation someone else needs.
- Providing background context helps a newcomer connect the topic to things
- that they already know.
- * :doc:`Reference guides </ref/index>` contain technical references for APIs.
- They describe the functioning of Django's internal machinery and instruct in
- its use.
- Keep reference material tightly focused on the subject. Assume that the
- reader already understands the basic concepts involved but needs to know or
- be reminded of how Django does it.
- Reference guides aren't the place for general explanation. If you find
- yourself explaining basic concepts, you may want to move that material to a
- topic guide.
- * :doc:`How-to guides </howto/index>` are recipes that take the reader through
- steps in key subjects.
- What matters most in a how-to guide is what a user wants to achieve.
- A how-to should always be result-oriented rather than focused on internal
- details of how Django implements whatever is being discussed.
- These guides are more advanced than tutorials and assume some knowledge about
- how Django works. Assume that the reader has followed the tutorials and don't
- hesitate to refer the reader back to the appropriate tutorial rather than
- repeat the same material.
- How to start contributing documentation
- =======================================
- Clone the Django repository to your local machine
- -------------------------------------------------
- If you'd like to start contributing to our docs, get the development version of
- Django from the source code repository (see
- :ref:`installing-development-version`):
- .. console::
- $ git clone https://github.com/django/django.git
- If you're planning to submit these changes, you might find it useful to make a
- fork of the Django repository and clone this fork instead.
- Set up a virtual environment and install dependencies
- -----------------------------------------------------
- Create and activate a virtual environment, then install the dependencies:
- .. code-block:: shell
- $ python -m venv .venv
- $ source .venv/bin/activate
- $ python -m pip install -r docs/requirements.txt
- Build the documentation locally
- -------------------------------
- We can build HTML output from the ``docs`` directory:
- .. console::
- $ cd docs
- $ make html
- Your locally-built documentation will be accessible at
- ``_build/html/index.html`` and it can be viewed in any web browser, though it
- will be themed differently than the documentation at
- `docs.djangoproject.com <https://docs.djangoproject.com/>`_. This is OK! If
- your changes look good on your local machine, they'll look good on the website.
- Making edits to the documentation
- ---------------------------------
- The source files are ``.txt`` files located in the ``docs/`` directory.
- These files are written in the reStructuredText markup language. To learn the
- markup, see the :ref:`reStructuredText reference <sphinx:rst-index>`.
- To edit this page, for example, we would edit the file
- :source:`docs/internals/contributing/writing-documentation.txt` and rebuild the
- HTML with ``make html``.
- .. _documentation-spelling-check:
- Spelling check
- --------------
- Before you commit your docs, it's a good idea to run the spelling checker.
- You'll need to install :pypi:`sphinxcontrib-spelling` first. Then from the
- ``docs`` directory, run:
- .. console::
- $ make spelling
- Wrong words (if any) along with the file and line number where they occur will
- be saved to ``_build/spelling/output.txt``.
- If you encounter false-positives (error output that actually is correct), do
- one of the following:
- * Surround inline code or brand/technology names with double grave accents
- (``).
- * Find synonyms that the spell checker recognizes.
- * If, and only if, you are sure the word you are using is correct - add it
- to ``docs/spelling_wordlist`` (please keep the list in alphabetical order).
- .. _documentation-link-check:
- Link check
- ----------
- Links in documentation can become broken or changed such that they are no
- longer the canonical link. Sphinx provides a builder that can check whether the
- links in the documentation are working. From the ``docs`` directory, run:
- .. console::
- $ make linkcheck
- Output is printed to the terminal, but can also be found in
- ``_build/linkcheck/output.txt`` and ``_build/linkcheck/output.json``.
- .. warning::
- The execution of the command requires an internet connection and takes
- several minutes to complete, because the command tests all the links
- that are found in the documentation.
- Entries that have a status of "working" are fine, those that are "unchecked" or
- "ignored" have been skipped because they either cannot be checked or have
- matched ignore rules in the configuration.
- Entries that have a status of "broken" need to be fixed. Those that have a
- status of "redirected" may need to be updated to point to the canonical
- location, e.g. the scheme has changed ``http://`` → ``https://``. In certain
- cases, we do not want to update a "redirected" link, e.g. a rewrite to always
- point to the latest or stable version of the documentation, e.g. ``/en/stable/`` →
- ``/en/3.2/``.
- Writing style
- =============
- When using pronouns in reference to a hypothetical person, such as "a user with
- a session cookie", gender-neutral pronouns (they/their/them) should be used.
- Instead of:
- * he or she... use they.
- * him or her... use them.
- * his or her... use their.
- * his or hers... use theirs.
- * himself or herself... use themselves.
- Try to avoid using words that minimize the difficulty involved in a task or
- operation, such as "easily", "simply", "just", "merely", "straightforward", and
- so on. People's experience may not match your expectations, and they may become
- frustrated when they do not find a step as "straightforward" or "simple" as it
- is implied to be.
- Commonly used terms
- ===================
- Here are some style guidelines on commonly used terms throughout the
- documentation:
- * **Django** -- when referring to the framework, capitalize Django. It is
- lowercase only in Python code and in the djangoproject.com logo.
- * **email** -- no hyphen.
- * **HTTP** -- the expected pronunciation is "Aitch Tee Tee Pee" and therefore
- should be preceded by "an" and not "a".
- * **MySQL**, **PostgreSQL**, **SQLite**
- * **SQL** -- when referring to SQL, the expected pronunciation should be
- "Ess Queue Ell" and not "sequel". Thus in a phrase like "Returns an
- SQL expression", "SQL" should be preceded by "an" and not "a".
- * **Python** -- when referring to the language, capitalize Python.
- * **realize**, **customize**, **initialize**, etc. -- use the American
- "ize" suffix, not "ise."
- * **subclass** -- it's a single word without a hyphen, both as a verb
- ("subclass that model") and as a noun ("create a subclass").
- * **the web**, **web framework** -- it's not capitalized.
- * **website** -- use one word, without capitalization.
- Django-specific terminology
- ===========================
- * **model** -- it's not capitalized.
- * **template** -- it's not capitalized.
- * **URLconf** -- use three capitalized letters, with no space before
- "conf."
- * **view** -- it's not capitalized.
- Guidelines for reStructuredText files
- =====================================
- These guidelines regulate the format of our reST (reStructuredText)
- documentation:
- * In section titles, capitalize only initial words and proper nouns.
- * Wrap the documentation at 80 characters wide, unless a code example
- is significantly less readable when split over two lines, or for another
- good reason.
- * The main thing to keep in mind as you write and edit docs is that the
- more semantic markup you can add the better. So:
- .. code-block:: rst
- Add ``django.contrib.auth`` to your ``INSTALLED_APPS``...
- Isn't nearly as helpful as:
- .. code-block:: rst
- Add :mod:`django.contrib.auth` to your :setting:`INSTALLED_APPS`...
- This is because Sphinx will generate proper links for the latter, which
- greatly helps readers.
- You can prefix the target with a ``~`` (that's a tilde) to get only the
- "last bit" of that path. So ``:mod:`~django.contrib.auth``` will
- display a link with the title "auth".
- * All Python code blocks should be formatted using the :pypi:`blacken-docs`
- auto-formatter. This will be run by :ref:`pre-commit
- <coding-style-pre-commit>` if that is configured.
- * Use :mod:`~sphinx.ext.intersphinx` to reference Python's and Sphinx'
- documentation.
- * Add ``.. code-block:: <lang>`` to literal blocks so that they get
- highlighted. Prefer relying on automatic highlighting using ``::``
- (two colons). This has the benefit that if the code contains some invalid
- syntax, it won't be highlighted. Adding ``.. code-block:: python``, for
- example, will force highlighting despite invalid syntax.
- * To improve readability, use ``.. admonition:: Descriptive title`` rather than
- ``.. note::``. Use these boxes sparingly.
- * Use these heading styles:
- .. code-block:: rst
- ===
- One
- ===
- Two
- ===
- Three
- -----
- Four
- ~~~~
- Five
- ^^^^
- * Use :rst:role:`:rfc:<rfc>` to reference a Request for Comments (RFC) and
- try to link to the relevant section if possible. For example, use
- ``:rfc:`2324#section-2.3.2``` or
- ``:rfc:`Custom link text <2324#section-2.3.2>```.
- * Use :rst:role:`:pep:<pep>` to reference a Python Enhancement Proposal (PEP)
- and try to link to the relevant section if possible. For example, use
- ``:pep:`20#easter-egg``` or ``:pep:`Easter Egg <20#easter-egg>```.
- * Use :rst:role:`:mimetype:<mimetype>` to refer to a MIME Type unless the value
- is quoted for a code example.
- * Use :rst:role:`:envvar:<envvar>` to refer to an environment variable. You may
- also need to define a reference to the documentation for that environment
- variable using :rst:dir:`.. envvar:: <envvar>`.
- * Use :rst:role:`:cve:<cve>` to reference a Common Vulnerabilities and
- Exposures (CVE) identifier. For example, use ``:cve:`2019-14232```.
- Django-specific markup
- ======================
- Besides :ref:`Sphinx's built-in markup <sphinx:rst-index>`, Django's docs
- define some extra description units:
- * Settings:
- .. code-block:: rst
- .. setting:: INSTALLED_APPS
- To link to a setting, use ``:setting:`INSTALLED_APPS```.
- * Template tags:
- .. code-block:: rst
- .. templatetag:: regroup
- To link, use ``:ttag:`regroup```.
- * Template filters:
- .. code-block:: rst
- .. templatefilter:: linebreaksbr
- To link, use ``:tfilter:`linebreaksbr```.
- * Field lookups (i.e. ``Foo.objects.filter(bar__exact=whatever)``):
- .. code-block:: rst
- .. fieldlookup:: exact
- To link, use ``:lookup:`exact```.
- * ``django-admin`` commands:
- .. code-block:: rst
- .. django-admin:: migrate
- To link, use ``:djadmin:`migrate```.
- * ``django-admin`` command-line options:
- .. code-block:: rst
- .. django-admin-option:: --traceback
- To link, use ``:option:`command_name --traceback``` (or omit ``command_name``
- for the options shared by all commands like ``--verbosity``).
- * Links to Trac tickets (typically reserved for patch release notes):
- .. code-block:: rst
- :ticket:`12345`
- Django's documentation uses a custom ``console`` directive for documenting
- command-line examples involving ``django-admin``, ``manage.py``, ``python``,
- etc.). In the HTML documentation, it renders a two-tab UI, with one tab showing
- a Unix-style command prompt and a second tab showing a Windows prompt.
- For example, you can replace this fragment:
- .. code-block:: rst
- use this command:
- .. code-block:: console
- $ python manage.py shell
- with this one:
- .. code-block:: rst
- use this command:
- .. console::
- $ python manage.py shell
- Notice two things:
- * You usually will replace occurrences of the ``.. code-block:: console``
- directive.
- * You don't need to change the actual content of the code example. You still
- write it assuming a Unix-y environment (i.e. a ``'$'`` prompt symbol,
- ``'/'`` as filesystem path components separator, etc.)
- The example above will render a code example block with two tabs. The first
- one will show:
- .. code-block:: console
- $ python manage.py shell
- (No changes from what ``.. code-block:: console`` would have rendered).
- The second one will show:
- .. code-block:: doscon
- ...\> py manage.py shell
- .. _documenting-new-features:
- Documenting new features
- ========================
- Our policy for new features is:
- All documentation of new features should be written in a way that
- clearly designates the features that are only available in the Django
- development version. Assume documentation readers are using the latest
- release, not the development version.
- Our preferred way for marking new features is by prefacing the features'
- documentation with: "``.. versionadded:: X.Y``", followed by a mandatory
- blank line and an optional description (indented).
- General improvements or other changes to the APIs that should be emphasized
- should use the "``.. versionchanged:: X.Y``" directive (with the same format
- as the ``versionadded`` mentioned above.
- These ``versionadded`` and ``versionchanged`` blocks should be "self-contained."
- In other words, since we only keep these annotations around for two releases,
- it's nice to be able to remove the annotation and its contents without having
- to reflow, reindent, or edit the surrounding text. For example, instead of
- putting the entire description of a new or changed feature in a block, do
- something like this:
- .. code-block:: rst
- .. class:: Author(first_name, last_name, middle_name=None)
- A person who writes books.
- ``first_name`` is ...
- ...
- ``middle_name`` is ...
- .. versionchanged:: A.B
- The ``middle_name`` argument was added.
- Put the changed annotation notes at the bottom of a section, not the top.
- Also, avoid referring to a specific version of Django outside a
- ``versionadded`` or ``versionchanged`` block. Even inside a block, it's often
- redundant to do so as these annotations render as "New in Django A.B:" and
- "Changed in Django A.B", respectively.
- If a function, attribute, etc. is added, it's also okay to use a
- ``versionadded`` annotation like this:
- .. code-block:: rst
- .. attribute:: Author.middle_name
- .. versionadded:: A.B
- An author's middle name.
- We can remove the ``.. versionadded:: A.B`` annotation without any indentation
- changes when the time comes.
- Minimizing images
- =================
- Optimize image compression where possible. For PNG files, use OptiPNG and
- AdvanceCOMP's ``advpng``:
- .. console::
- $ cd docs
- $ optipng -o7 -zm1-9 -i0 -strip all `find . -type f -not -path "./_build/*" -name "*.png"`
- $ advpng -z4 `find . -type f -not -path "./_build/*" -name "*.png"`
- This is based on OptiPNG version 0.7.5. Older versions may complain about the
- ``-strip all`` option being lossy.
- An example
- ==========
- For a quick example of how it all fits together, consider this hypothetical
- example:
- * First, the ``ref/settings.txt`` document could have an overall layout
- like this:
- .. code-block:: rst
- ========
- Settings
- ========
- ...
- .. _available-settings:
- Available settings
- ==================
- ...
- .. _deprecated-settings:
- Deprecated settings
- ===================
- ...
- * Next, the ``topics/settings.txt`` document could contain something like
- this:
- .. code-block:: rst
- You can access a :ref:`listing of all available settings
- <available-settings>`. For a list of deprecated settings see
- :ref:`deprecated-settings`.
- You can find both in the :doc:`settings reference document
- </ref/settings>`.
- We use the Sphinx :rst:role:`doc` cross-reference element when we want to
- link to another document as a whole and the :rst:role:`ref` element when
- we want to link to an arbitrary location in a document.
- * Next, notice how the settings are annotated:
- .. code-block:: rst
- .. setting:: ADMINS
- ADMINS
- ======
- Default: ``[]`` (Empty list)
- A list of all the people who get code error notifications. When
- ``DEBUG=False`` and a view raises an exception, Django will email these people
- with the full exception information. Each member of the list should be a tuple
- of (Full name, email address). Example::
- [("John", "john@example.com"), ("Mary", "mary@example.com")]
- Note that Django will email *all* of these people whenever an error happens.
- See :doc:`/howto/error-reporting` for more information.
- This marks up the following header as the "canonical" target for the
- setting ``ADMINS``. This means any time I talk about ``ADMINS``,
- I can reference it using ``:setting:`ADMINS```.
- That's basically how everything fits together.
- Translating documentation
- =========================
- See :ref:`Localizing the Django documentation <translating-documentation>` if
- you'd like to help translate the documentation into another language.
- .. _django-admin-manpage:
- ``django-admin`` man page
- =========================
- Sphinx can generate a manual page for the
- :doc:`django-admin </ref/django-admin>` command. This is configured in
- ``docs/conf.py``. Unlike other documentation output, this man page should be
- included in the Django repository and the releases as
- ``docs/man/django-admin.1``. There isn't a need to update this file when
- updating the documentation, as it's updated once as part of the release process.
- To generate an updated version of the man page, in the ``docs`` directory, run:
- .. console::
- $ make man
- The new man page will be written in ``docs/_build/man/django-admin.1``.
|