mirror of
https://github.com/django/django.git
synced 2024-11-25 07:59:34 +01:00
650 lines
20 KiB
Plaintext
650 lines
20 KiB
Plaintext
=====================
|
|
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``.
|