123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- =====================
- Writing documentation
- =====================
- We place a high importance on 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.
- Getting the raw documentation
- -----------------------------
- Though Django's documentation is intended to be read as HTML at
- https://docs.djangoproject.com/, we edit it as a collection of text files for
- maximum flexibility. These files live in the top-level ``docs/`` directory of a
- Django release.
- 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`). The development version has the
- latest-and-greatest documentation, just as it has latest-and-greatest code.
- We also backport documentation fixes and improvements, at the discretion of the
- committer, to the last release branch. That's because it's highly advantageous
- to have the docs for the last release be up-to-date and correct (see
- :ref:`differences-between-doc-versions`).
- Getting started with Sphinx
- ---------------------------
- 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.
- __ http://sphinx-doc.org/
- __ http://docutils.sourceforge.net/
- To actually build the documentation locally, you'll currently need to install
- Sphinx -- ``sudo pip install Sphinx`` should do the trick.
- .. note::
- Building the Django documentation requires Sphinx 1.0.2 or newer. Sphinx
- also requires the Pygments__ library for syntax highlighting; building the
- Django documentation requires Pygments 1.1 or newer (a new-enough version
- should automatically be installed along with Sphinx).
- __ http://pygments.org
- Then, building the HTML is easy; just ``make html`` (or ``make.bat html`` on
- Windows) from the ``docs`` directory.
- To get started contributing, you'll want to read the :ref:`reStructuredText
- Primer <sphinx:rst-primer>`. After that, you'll want to read about the
- :ref:`Sphinx-specific markup <sphinx:sphinxmarkup>` that's used to manage
- metadata, indexing, and cross-references.
- 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.
- 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.
- * **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").
- * **Web**, **World Wide Web**, **the Web** -- note Web is always
- capitalized when referring to the World Wide Web.
- * **Web site** -- use two words, with Web capitalized.
- 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::
- Add ``django.contrib.auth`` to your ``INSTALLED_APPS``...
- Isn't nearly as helpful as::
- 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. There's basically no limit to the amount of
- useful markup you can add.
- * Use :mod:`~sphinx.ext.intersphinx` to reference Python's and Sphinx'
- documentation.
- Django-specific markup
- ----------------------
- Besides the `Sphinx built-in markup`__, Django's docs defines some extra
- description units:
- __ http://sphinx-doc.org/markup/desc.html
- * Settings::
- .. setting:: INSTALLED_APPS
- To link to a setting, use ``:setting:`INSTALLED_APPS```.
- * Template tags::
- .. templatetag:: regroup
- To link, use ``:ttag:`regroup```.
- * Template filters::
- .. templatefilter:: linebreaksbr
- To link, use ``:tfilter:`linebreaksbr```.
- * Field lookups (i.e. ``Foo.objects.filter(bar__exact=whatever)``)::
- .. fieldlookup:: exact
- To link, use ``:lookup:`exact```.
- * ``django-admin`` commands::
- .. django-admin:: migrate
- To link, use ``:djadmin:`migrate```.
- * ``django-admin`` command-line options::
- .. django-admin-option:: --traceback
- To link, use ``:djadminopt:`--traceback```.
- .. _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 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 content (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.
- 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 tuple)
- A tuple that lists 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 tuple 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.
- .. _improving-the-documentation:
- Improving the documentation
- ---------------------------
- A few small improvements can be made to make the documentation read and
- look better:
- * Most of the various ``index.txt`` documents have *very* short or even
- non-existent intro text. Each of those documents needs a good short
- intro the content below that point.
- * The glossary is very perfunctory. It needs to be filled out.
- * Add more metadata targets. Lots of places look like::
- ``File.close()``
- ~~~~~~~~~~~~~~~~
- \... these should be::
- .. method:: File.close()
- That is, use metadata instead of titles.
- * Add more links -- nearly everything that's an inline code literal
- right now can probably be turned into a xref.
- See the ``literals_to_xrefs.py`` file in ``_ext`` -- it's a shell script
- to help do this work.
- This will probably be a continuing, never-ending project.
- * Add `info field lists`__ where appropriate.
- __ http://sphinx-doc.org/markup/desc.html#info-field-lists
- * Whenever possible, use links. So, use ``:setting:`ADMINS``` instead
- of ````ADMINS````.
- * Use directives where appropriate. Some directives
- (e.g. ``.. setting::``) are prefix-style directives; they go *before*
- the unit they're describing. These are known as "crossref" directives.
- Others (e.g. ``.. class::``) generate their own markup; these should go
- inside the section they're describing. These are called
- "description units".
- You can tell which are which by looking at in
- :file:`_ext/djangodocs.py`; it registers roles as one of the other.
- * Add ``.. code-block:: <lang>`` to literal blocks so that they get
- highlighted.
- * When referring to classes/functions/modules, etc., you'll want to use
- the fully-qualified name of the target
- (``:class:`django.contrib.contenttypes.models.ContentType```).
- Since this doesn't look all that awesome in the output -- it shows the
- entire path to the object -- you can prefix the target with a ``~``
- (that's a tilde) to get just the "last bit" of that path. So
- ``:class:`~django.contrib.contenttypes.models.ContentType``` will just
- display a link with the title "ContentType".
- .. _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 a couple packages first:
- * `pyenchant <https://pypi.python.org/pypi/pyenchant/>`_ (which requires
- `enchant <http://www.abisource.com/projects/enchant/>`_)
- * `sphinxcontrib-spelling
- <https://pypi.python.org/pypi/sphinxcontrib-spelling/>`_
- Then from the ``docs`` directory, run ``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 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).
- Translating documentation
- -------------------------
- See :ref:`Localizing the Django documentation <translating-documentation>` if
- you'd like to help translate the documentation into another language.
|