mirror of https://github.com/django/django.git
Fixed many more ReST indentation errors, somehow accidentally missed from [16955]
git-svn-id: http://code.djangoproject.com/svn/django/trunk@16983 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
5109ac3709
commit
d1e5c55258
|
@ -8,12 +8,12 @@ The login cookie isn't being set correctly, because the domain of the cookie
|
||||||
sent out by Django doesn't match the domain in your browser. Try these two
|
sent out by Django doesn't match the domain in your browser. Try these two
|
||||||
things:
|
things:
|
||||||
|
|
||||||
* Set the :setting:`SESSION_COOKIE_DOMAIN` setting in your admin config
|
* Set the :setting:`SESSION_COOKIE_DOMAIN` setting in your admin config
|
||||||
file to match your domain. For example, if you're going to
|
file to match your domain. For example, if you're going to
|
||||||
"http://www.example.com/admin/" in your browser, in
|
"http://www.example.com/admin/" in your browser, in
|
||||||
"myproject.settings" you should set ``SESSION_COOKIE_DOMAIN = 'www.example.com'``.
|
"myproject.settings" you should set ``SESSION_COOKIE_DOMAIN = 'www.example.com'``.
|
||||||
|
|
||||||
* Some browsers (Firefox?) don't like to accept cookies from domains that
|
* Some browsers (Firefox?) don't like to accept cookies from domains that
|
||||||
don't have dots in them. If you're running the admin site on "localhost"
|
don't have dots in them. If you're running the admin site on "localhost"
|
||||||
or another domain that doesn't have a dot in it, try going to
|
or another domain that doesn't have a dot in it, try going to
|
||||||
"localhost.localdomain" or "127.0.0.1". And set
|
"localhost.localdomain" or "127.0.0.1". And set
|
||||||
|
|
|
@ -26,15 +26,15 @@ The best way to make sure tickets do not get hung up on the way to checkin is
|
||||||
to make it dead easy, even for someone who may not be intimately familiar with
|
to make it dead easy, even for someone who may not be intimately familiar with
|
||||||
that area of the code, to understand the problem and verify the fix:
|
that area of the code, to understand the problem and verify the fix:
|
||||||
|
|
||||||
* Are there clear instructions on how to reproduce the bug? If this
|
* Are there clear instructions on how to reproduce the bug? If this
|
||||||
touches a dependency (such as PIL), a contrib module, or a specific
|
touches a dependency (such as PIL), a contrib module, or a specific
|
||||||
database, are those instructions clear enough even for someone not
|
database, are those instructions clear enough even for someone not
|
||||||
familiar with it?
|
familiar with it?
|
||||||
|
|
||||||
* If there are several patches attached to the ticket, is it clear what
|
* If there are several patches attached to the ticket, is it clear what
|
||||||
each one does, which ones can be ignored and which matter?
|
each one does, which ones can be ignored and which matter?
|
||||||
|
|
||||||
* Does the patch include a unit test? If not, is there a very clear
|
* Does the patch include a unit test? If not, is there a very clear
|
||||||
explanation why not? A test expresses succinctly what the problem is,
|
explanation why not? A test expresses succinctly what the problem is,
|
||||||
and shows that the patch actually fixes it.
|
and shows that the patch actually fixes it.
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,10 @@ FAQ: Installation
|
||||||
How do I get started?
|
How do I get started?
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
#. `Download the code`_.
|
#. `Download the code`_.
|
||||||
#. Install Django (read the :doc:`installation guide </intro/install>`).
|
#. Install Django (read the :doc:`installation guide </intro/install>`).
|
||||||
#. Walk through the :doc:`tutorial </intro/tutorial01>`.
|
#. Walk through the :doc:`tutorial </intro/tutorial01>`.
|
||||||
#. Check out the rest of the :doc:`documentation </index>`, and `ask questions`_ if you
|
#. Check out the rest of the :doc:`documentation </index>`, and `ask questions`_ if you
|
||||||
run into trouble.
|
run into trouble.
|
||||||
|
|
||||||
.. _`Download the code`: http://www.djangoproject.com/download/
|
.. _`Download the code`: http://www.djangoproject.com/download/
|
||||||
|
|
|
@ -6,14 +6,14 @@ Why do I get an error about importing DJANGO_SETTINGS_MODULE?
|
||||||
|
|
||||||
Make sure that:
|
Make sure that:
|
||||||
|
|
||||||
* The environment variable DJANGO_SETTINGS_MODULE is set to a
|
* The environment variable DJANGO_SETTINGS_MODULE is set to a
|
||||||
fully-qualified Python module (i.e. "mysite.settings").
|
fully-qualified Python module (i.e. "mysite.settings").
|
||||||
|
|
||||||
* Said module is on ``sys.path`` (``import mysite.settings`` should work).
|
* Said module is on ``sys.path`` (``import mysite.settings`` should work).
|
||||||
|
|
||||||
* The module doesn't contain syntax errors (of course).
|
* The module doesn't contain syntax errors (of course).
|
||||||
|
|
||||||
* If you're using mod_python but *not* using Django's request handler,
|
* If you're using mod_python but *not* using Django's request handler,
|
||||||
you'll need to work around a mod_python bug related to the use of
|
you'll need to work around a mod_python bug related to the use of
|
||||||
``SetEnv``; before you import anything from Django you'll need to do
|
``SetEnv``; before you import anything from Django you'll need to do
|
||||||
the following::
|
the following::
|
||||||
|
@ -46,20 +46,20 @@ How do I use image and file fields?
|
||||||
Using a :class:`~django.db.models.FileField` or an
|
Using a :class:`~django.db.models.FileField` or an
|
||||||
:class:`~django.db.models.ImageField` in a model takes a few steps:
|
:class:`~django.db.models.ImageField` in a model takes a few steps:
|
||||||
|
|
||||||
#. In your settings file, you'll need to define :setting:`MEDIA_ROOT` as
|
#. In your settings file, you'll need to define :setting:`MEDIA_ROOT` as
|
||||||
the full path to a directory where you'd like Django to store uploaded
|
the full path to a directory where you'd like Django to store uploaded
|
||||||
files. (For performance, these files are not stored in the database.)
|
files. (For performance, these files are not stored in the database.)
|
||||||
Define :setting:`MEDIA_URL` as the base public URL of that directory.
|
Define :setting:`MEDIA_URL` as the base public URL of that directory.
|
||||||
Make sure that this directory is writable by the Web server's user
|
Make sure that this directory is writable by the Web server's user
|
||||||
account.
|
account.
|
||||||
|
|
||||||
#. Add the :class:`~django.db.models.FileField` or
|
#. Add the :class:`~django.db.models.FileField` or
|
||||||
:class:`~django.db.models.ImageField` to your model, making sure to
|
:class:`~django.db.models.ImageField` to your model, making sure to
|
||||||
define the :attr:`~django.db.models.FileField.upload_to` option to tell
|
define the :attr:`~django.db.models.FileField.upload_to` option to tell
|
||||||
Django to which subdirectory of :setting:`MEDIA_ROOT` it should upload
|
Django to which subdirectory of :setting:`MEDIA_ROOT` it should upload
|
||||||
files.
|
files.
|
||||||
|
|
||||||
#. All that will be stored in your database is a path to the file
|
#. All that will be stored in your database is a path to the file
|
||||||
(relative to :setting:`MEDIA_ROOT`). You'll most likely want to use the
|
(relative to :setting:`MEDIA_ROOT`). You'll most likely want to use the
|
||||||
convenience :attr:`~django.core.files.File.url` attribute provided by
|
convenience :attr:`~django.core.files.File.url` attribute provided by
|
||||||
Django. For example, if your :class:`~django.db.models.ImageField` is
|
Django. For example, if your :class:`~django.db.models.ImageField` is
|
||||||
|
|
|
@ -14,12 +14,12 @@ dealing with Apache, you can configuring Apache to authenticate against Django's
|
||||||
:doc:`authentication system </topics/auth>` directly. For example, you
|
:doc:`authentication system </topics/auth>` directly. For example, you
|
||||||
could:
|
could:
|
||||||
|
|
||||||
* Serve static/media files directly from Apache only to authenticated users.
|
* Serve static/media files directly from Apache only to authenticated users.
|
||||||
|
|
||||||
* Authenticate access to a Subversion_ repository against Django users with
|
* Authenticate access to a Subversion_ repository against Django users with
|
||||||
a certain permission.
|
a certain permission.
|
||||||
|
|
||||||
* Allow certain users to connect to a WebDAV share created with mod_dav_.
|
* Allow certain users to connect to a WebDAV share created with mod_dav_.
|
||||||
|
|
||||||
.. _Subversion: http://subversion.tigris.org/
|
.. _Subversion: http://subversion.tigris.org/
|
||||||
.. _mod_dav: http://httpd.apache.org/docs/2.0/mod/mod_dav.html
|
.. _mod_dav: http://httpd.apache.org/docs/2.0/mod/mod_dav.html
|
||||||
|
@ -93,29 +93,29 @@ By default, the authentication handler will limit access to the ``/example/``
|
||||||
location to users marked as staff members. You can use a set of
|
location to users marked as staff members. You can use a set of
|
||||||
``PythonOption`` directives to modify this behavior:
|
``PythonOption`` directives to modify this behavior:
|
||||||
|
|
||||||
================================ =========================================
|
================================ =========================================
|
||||||
``PythonOption`` Explanation
|
``PythonOption`` Explanation
|
||||||
================================ =========================================
|
================================ =========================================
|
||||||
``DjangoRequireStaffStatus`` If set to ``on`` only "staff" users (i.e.
|
``DjangoRequireStaffStatus`` If set to ``on`` only "staff" users (i.e.
|
||||||
those with the ``is_staff`` flag set)
|
those with the ``is_staff`` flag set)
|
||||||
will be allowed.
|
will be allowed.
|
||||||
|
|
||||||
Defaults to ``on``.
|
Defaults to ``on``.
|
||||||
|
|
||||||
``DjangoRequireSuperuserStatus`` If set to ``on`` only superusers (i.e.
|
``DjangoRequireSuperuserStatus`` If set to ``on`` only superusers (i.e.
|
||||||
those with the ``is_superuser`` flag set)
|
those with the ``is_superuser`` flag set)
|
||||||
will be allowed.
|
will be allowed.
|
||||||
|
|
||||||
Defaults to ``off``.
|
Defaults to ``off``.
|
||||||
|
|
||||||
``DjangoPermissionName`` The name of a permission to require for
|
``DjangoPermissionName`` The name of a permission to require for
|
||||||
access. See :ref:`custom permissions
|
access. See :ref:`custom permissions
|
||||||
<custom-permissions>` for more
|
<custom-permissions>` for more
|
||||||
information.
|
information.
|
||||||
|
|
||||||
By default no specific permission will be
|
By default no specific permission will be
|
||||||
required.
|
required.
|
||||||
================================ =========================================
|
================================ =========================================
|
||||||
|
|
||||||
Note that sometimes ``SetEnv`` doesn't play well in this mod_python
|
Note that sometimes ``SetEnv`` doesn't play well in this mod_python
|
||||||
configuration, for reasons unknown. If you're having problems getting
|
configuration, for reasons unknown. If you're having problems getting
|
||||||
|
|
|
@ -37,11 +37,11 @@ You'll need to follow these steps:
|
||||||
Your custom storage system may override any of the storage methods explained in
|
Your custom storage system may override any of the storage methods explained in
|
||||||
:doc:`/ref/files/storage`, but you **must** implement the following methods:
|
:doc:`/ref/files/storage`, but you **must** implement the following methods:
|
||||||
|
|
||||||
* :meth:`Storage.delete`
|
* :meth:`Storage.delete`
|
||||||
* :meth:`Storage.exists`
|
* :meth:`Storage.exists`
|
||||||
* :meth:`Storage.listdir`
|
* :meth:`Storage.listdir`
|
||||||
* :meth:`Storage.size`
|
* :meth:`Storage.size`
|
||||||
* :meth:`Storage.url`
|
* :meth:`Storage.url`
|
||||||
|
|
||||||
You'll also usually want to use hooks specifically designed for custom storage
|
You'll also usually want to use hooks specifically designed for custom storage
|
||||||
objects. These are:
|
objects. These are:
|
||||||
|
|
|
@ -133,12 +133,12 @@ example). If this sounds a bit tricky, don't worry -- it will become clearer in
|
||||||
the examples below. Just remember that you will often end up creating two
|
the examples below. Just remember that you will often end up creating two
|
||||||
classes when you want a custom field:
|
classes when you want a custom field:
|
||||||
|
|
||||||
* The first class is the Python object that your users will manipulate.
|
* The first class is the Python object that your users will manipulate.
|
||||||
They will assign it to the model attribute, they will read from it for
|
They will assign it to the model attribute, they will read from it for
|
||||||
displaying purposes, things like that. This is the ``Hand`` class in our
|
displaying purposes, things like that. This is the ``Hand`` class in our
|
||||||
example.
|
example.
|
||||||
|
|
||||||
* The second class is the ``Field`` subclass. This is the class that knows
|
* The second class is the ``Field`` subclass. This is the class that knows
|
||||||
how to convert your first class back and forth between its permanent
|
how to convert your first class back and forth between its permanent
|
||||||
storage form and the Python form.
|
storage form and the Python form.
|
||||||
|
|
||||||
|
@ -198,31 +198,31 @@ card values plus their suits; 104 characters in total.
|
||||||
The :meth:`~django.db.models.Field.__init__` method takes the following
|
The :meth:`~django.db.models.Field.__init__` method takes the following
|
||||||
parameters:
|
parameters:
|
||||||
|
|
||||||
* :attr:`~django.db.models.Field.verbose_name`
|
* :attr:`~django.db.models.Field.verbose_name`
|
||||||
* :attr:`~django.db.models.Field.name`
|
* :attr:`~django.db.models.Field.name`
|
||||||
* :attr:`~django.db.models.Field.primary_key`
|
* :attr:`~django.db.models.Field.primary_key`
|
||||||
* :attr:`~django.db.models.Field.max_length`
|
* :attr:`~django.db.models.Field.max_length`
|
||||||
* :attr:`~django.db.models.Field.unique`
|
* :attr:`~django.db.models.Field.unique`
|
||||||
* :attr:`~django.db.models.Field.blank`
|
* :attr:`~django.db.models.Field.blank`
|
||||||
* :attr:`~django.db.models.Field.null`
|
* :attr:`~django.db.models.Field.null`
|
||||||
* :attr:`~django.db.models.Field.db_index`
|
* :attr:`~django.db.models.Field.db_index`
|
||||||
* :attr:`~django.db.models.Field.rel`: Used for related fields (like
|
* :attr:`~django.db.models.Field.rel`: Used for related fields (like
|
||||||
:class:`ForeignKey`). For advanced use only.
|
:class:`ForeignKey`). For advanced use only.
|
||||||
* :attr:`~django.db.models.Field.default`
|
* :attr:`~django.db.models.Field.default`
|
||||||
* :attr:`~django.db.models.Field.editable`
|
* :attr:`~django.db.models.Field.editable`
|
||||||
* :attr:`~django.db.models.Field.serialize`: If ``False``, the field will
|
* :attr:`~django.db.models.Field.serialize`: If ``False``, the field will
|
||||||
not be serialized when the model is passed to Django's :doc:`serializers
|
not be serialized when the model is passed to Django's :doc:`serializers
|
||||||
</topics/serialization>`. Defaults to ``True``.
|
</topics/serialization>`. Defaults to ``True``.
|
||||||
* :attr:`~django.db.models.Field.unique_for_date`
|
* :attr:`~django.db.models.Field.unique_for_date`
|
||||||
* :attr:`~django.db.models.Field.unique_for_month`
|
* :attr:`~django.db.models.Field.unique_for_month`
|
||||||
* :attr:`~django.db.models.Field.unique_for_year`
|
* :attr:`~django.db.models.Field.unique_for_year`
|
||||||
* :attr:`~django.db.models.Field.choices`
|
* :attr:`~django.db.models.Field.choices`
|
||||||
* :attr:`~django.db.models.Field.help_text`
|
* :attr:`~django.db.models.Field.help_text`
|
||||||
* :attr:`~django.db.models.Field.db_column`
|
* :attr:`~django.db.models.Field.db_column`
|
||||||
* :attr:`~django.db.models.Field.db_tablespace`: Currently only used with
|
* :attr:`~django.db.models.Field.db_tablespace`: Currently only used with
|
||||||
the Oracle backend and only for index creation. You can usually ignore
|
the Oracle backend and only for index creation. You can usually ignore
|
||||||
this option.
|
this option.
|
||||||
* :attr:`~django.db.models.Field.auto_created`: True if the field was
|
* :attr:`~django.db.models.Field.auto_created`: True if the field was
|
||||||
automatically created, as for the `OneToOneField` used by model
|
automatically created, as for the `OneToOneField` used by model
|
||||||
inheritance. For advanced use only.
|
inheritance. For advanced use only.
|
||||||
|
|
||||||
|
@ -415,11 +415,11 @@ that are more complex than strings, dates, integers or floats, then you'll need
|
||||||
to override this method. As a general rule, the method should deal gracefully
|
to override this method. As a general rule, the method should deal gracefully
|
||||||
with any of the following arguments:
|
with any of the following arguments:
|
||||||
|
|
||||||
* An instance of the correct type (e.g., ``Hand`` in our ongoing example).
|
* An instance of the correct type (e.g., ``Hand`` in our ongoing example).
|
||||||
|
|
||||||
* A string (e.g., from a deserializer).
|
* A string (e.g., from a deserializer).
|
||||||
|
|
||||||
* Whatever the database returns for the column type you're using.
|
* Whatever the database returns for the column type you're using.
|
||||||
|
|
||||||
In our ``HandField`` class, we're storing the data as a VARCHAR field in the
|
In our ``HandField`` class, we're storing the data as a VARCHAR field in the
|
||||||
database, so we need to be able to process strings and ``Hand`` instances in
|
database, so we need to be able to process strings and ``Hand`` instances in
|
||||||
|
@ -695,12 +695,12 @@ complex conversions between your Python types and your database and
|
||||||
serialization formats. Here are a couple of tips to make things go more
|
serialization formats. Here are a couple of tips to make things go more
|
||||||
smoothly:
|
smoothly:
|
||||||
|
|
||||||
1. Look at the existing Django fields (in
|
1. Look at the existing Django fields (in
|
||||||
:file:`django/db/models/fields/__init__.py`) for inspiration. Try to find
|
:file:`django/db/models/fields/__init__.py`) for inspiration. Try to find
|
||||||
a field that's similar to what you want and extend it a little bit,
|
a field that's similar to what you want and extend it a little bit,
|
||||||
instead of creating an entirely new field from scratch.
|
instead of creating an entirely new field from scratch.
|
||||||
|
|
||||||
2. Put a :meth:`__str__` or :meth:`__unicode__` method on the class you're
|
2. Put a :meth:`__str__` or :meth:`__unicode__` method on the class you're
|
||||||
wrapping up as a field. There are a lot of places where the default
|
wrapping up as a field. There are a lot of places where the default
|
||||||
behavior of the field code is to call
|
behavior of the field code is to call
|
||||||
:func:`~django.utils.encoding.force_unicode` on the value. (In our
|
:func:`~django.utils.encoding.force_unicode` on the value. (In our
|
||||||
|
@ -735,12 +735,12 @@ A few suggestions
|
||||||
In addition to the above details, there are a few guidelines which can greatly
|
In addition to the above details, there are a few guidelines which can greatly
|
||||||
improve the efficiency and readability of the field's code.
|
improve the efficiency and readability of the field's code.
|
||||||
|
|
||||||
1. The source for Django's own ``ImageField`` (in
|
1. The source for Django's own ``ImageField`` (in
|
||||||
``django/db/models/fields/files.py``) is a great example of how to
|
``django/db/models/fields/files.py``) is a great example of how to
|
||||||
subclass ``FileField`` to support a particular type of file, as it
|
subclass ``FileField`` to support a particular type of file, as it
|
||||||
incorporates all of the techniques described above.
|
incorporates all of the techniques described above.
|
||||||
|
|
||||||
2. Cache file attributes wherever possible. Since files may be stored in
|
2. Cache file attributes wherever possible. Since files may be stored in
|
||||||
remote storage systems, retrieving them may cost extra time, or even
|
remote storage systems, retrieving them may cost extra time, or even
|
||||||
money, that isn't always necessary. Once a file is retrieved to obtain
|
money, that isn't always necessary. Once a file is retrieved to obtain
|
||||||
some data about its content, cache as much of that data as possible to
|
some data about its content, cache as much of that data as possible to
|
||||||
|
|
|
@ -77,8 +77,8 @@ Writing custom template filters
|
||||||
|
|
||||||
Custom filters are just Python functions that take one or two arguments:
|
Custom filters are just Python functions that take one or two arguments:
|
||||||
|
|
||||||
* The value of the variable (input) -- not necessarily a string.
|
* The value of the variable (input) -- not necessarily a string.
|
||||||
* The value of the argument -- this can have a default value, or be left
|
* The value of the argument -- this can have a default value, or be left
|
||||||
out altogether.
|
out altogether.
|
||||||
|
|
||||||
For example, in the filter ``{{ var|foo:"bar" }}``, the filter ``foo`` would be
|
For example, in the filter ``{{ var|foo:"bar" }}``, the filter ``foo`` would be
|
||||||
|
@ -124,8 +124,8 @@ your ``Library`` instance, to make it available to Django's template language:
|
||||||
|
|
||||||
The ``Library.filter()`` method takes two arguments:
|
The ``Library.filter()`` method takes two arguments:
|
||||||
|
|
||||||
1. The name of the filter -- a string.
|
1. The name of the filter -- a string.
|
||||||
2. The compilation function -- a Python function (not the name of the
|
2. The compilation function -- a Python function (not the name of the
|
||||||
function as a string).
|
function as a string).
|
||||||
|
|
||||||
You can use ``register.filter()`` as a decorator instead:
|
You can use ``register.filter()`` as a decorator instead:
|
||||||
|
@ -173,11 +173,11 @@ When writing a custom filter, give some thought to how the filter will interact
|
||||||
with Django's auto-escaping behavior. Note that three types of strings can be
|
with Django's auto-escaping behavior. Note that three types of strings can be
|
||||||
passed around inside the template code:
|
passed around inside the template code:
|
||||||
|
|
||||||
* **Raw strings** are the native Python ``str`` or ``unicode`` types. On
|
* **Raw strings** are the native Python ``str`` or ``unicode`` types. On
|
||||||
output, they're escaped if auto-escaping is in effect and presented
|
output, they're escaped if auto-escaping is in effect and presented
|
||||||
unchanged, otherwise.
|
unchanged, otherwise.
|
||||||
|
|
||||||
* **Safe strings** are strings that have been marked safe from further
|
* **Safe strings** are strings that have been marked safe from further
|
||||||
escaping at output time. Any necessary escaping has already been done.
|
escaping at output time. Any necessary escaping has already been done.
|
||||||
They're commonly used for output that contains raw HTML that is intended
|
They're commonly used for output that contains raw HTML that is intended
|
||||||
to be interpreted as-is on the client side.
|
to be interpreted as-is on the client side.
|
||||||
|
@ -192,7 +192,7 @@ passed around inside the template code:
|
||||||
# Do something with the "safe" string.
|
# Do something with the "safe" string.
|
||||||
...
|
...
|
||||||
|
|
||||||
* **Strings marked as "needing escaping"** are *always* escaped on
|
* **Strings marked as "needing escaping"** are *always* escaped on
|
||||||
output, regardless of whether they are in an :ttag:`autoescape` block or
|
output, regardless of whether they are in an :ttag:`autoescape` block or
|
||||||
not. These strings are only escaped once, however, even if auto-escaping
|
not. These strings are only escaped once, however, even if auto-escaping
|
||||||
applies.
|
applies.
|
||||||
|
@ -203,7 +203,7 @@ passed around inside the template code:
|
||||||
|
|
||||||
Template filter code falls into one of two situations:
|
Template filter code falls into one of two situations:
|
||||||
|
|
||||||
1. Your filter does not introduce any HTML-unsafe characters (``<``, ``>``,
|
1. Your filter does not introduce any HTML-unsafe characters (``<``, ``>``,
|
||||||
``'``, ``"`` or ``&``) into the result that were not already present. In
|
``'``, ``"`` or ``&``) into the result that were not already present. In
|
||||||
this case, you can let Django take care of all the auto-escaping
|
this case, you can let Django take care of all the auto-escaping
|
||||||
handling for you. All you need to do is put the ``is_safe`` attribute on
|
handling for you. All you need to do is put the ``is_safe`` attribute on
|
||||||
|
@ -264,7 +264,7 @@ Template filter code falls into one of two situations:
|
||||||
consequences (such as converting a boolean False to the string
|
consequences (such as converting a boolean False to the string
|
||||||
'False').
|
'False').
|
||||||
|
|
||||||
2. Alternatively, your filter code can manually take care of any necessary
|
2. Alternatively, your filter code can manually take care of any necessary
|
||||||
escaping. This is necessary when you're introducing new HTML markup into
|
escaping. This is necessary when you're introducing new HTML markup into
|
||||||
the result. You want to mark the output as safe from further
|
the result. You want to mark the output as safe from further
|
||||||
escaping so that your HTML markup isn't escaped further, so you'll need
|
escaping so that your HTML markup isn't escaped further, so you'll need
|
||||||
|
@ -381,34 +381,34 @@ object:
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
* ``parser`` is the template parser object. We don't need it in this
|
* ``parser`` is the template parser object. We don't need it in this
|
||||||
example.
|
example.
|
||||||
|
|
||||||
* ``token.contents`` is a string of the raw contents of the tag. In our
|
* ``token.contents`` is a string of the raw contents of the tag. In our
|
||||||
example, it's ``'current_time "%Y-%m-%d %I:%M %p"'``.
|
example, it's ``'current_time "%Y-%m-%d %I:%M %p"'``.
|
||||||
|
|
||||||
* The ``token.split_contents()`` method separates the arguments on spaces
|
* The ``token.split_contents()`` method separates the arguments on spaces
|
||||||
while keeping quoted strings together. The more straightforward
|
while keeping quoted strings together. The more straightforward
|
||||||
``token.contents.split()`` wouldn't be as robust, as it would naively
|
``token.contents.split()`` wouldn't be as robust, as it would naively
|
||||||
split on *all* spaces, including those within quoted strings. It's a good
|
split on *all* spaces, including those within quoted strings. It's a good
|
||||||
idea to always use ``token.split_contents()``.
|
idea to always use ``token.split_contents()``.
|
||||||
|
|
||||||
* This function is responsible for raising
|
* This function is responsible for raising
|
||||||
``django.template.TemplateSyntaxError``, with helpful messages, for
|
``django.template.TemplateSyntaxError``, with helpful messages, for
|
||||||
any syntax error.
|
any syntax error.
|
||||||
|
|
||||||
* The ``TemplateSyntaxError`` exceptions use the ``tag_name`` variable.
|
* The ``TemplateSyntaxError`` exceptions use the ``tag_name`` variable.
|
||||||
Don't hard-code the tag's name in your error messages, because that
|
Don't hard-code the tag's name in your error messages, because that
|
||||||
couples the tag's name to your function. ``token.contents.split()[0]``
|
couples the tag's name to your function. ``token.contents.split()[0]``
|
||||||
will ''always'' be the name of your tag -- even when the tag has no
|
will ''always'' be the name of your tag -- even when the tag has no
|
||||||
arguments.
|
arguments.
|
||||||
|
|
||||||
* The function returns a ``CurrentTimeNode`` with everything the node needs
|
* The function returns a ``CurrentTimeNode`` with everything the node needs
|
||||||
to know about this tag. In this case, it just passes the argument --
|
to know about this tag. In this case, it just passes the argument --
|
||||||
``"%Y-%m-%d %I:%M %p"``. The leading and trailing quotes from the
|
``"%Y-%m-%d %I:%M %p"``. The leading and trailing quotes from the
|
||||||
template tag are removed in ``format_string[1:-1]``.
|
template tag are removed in ``format_string[1:-1]``.
|
||||||
|
|
||||||
* The parsing is very low-level. The Django developers have experimented
|
* The parsing is very low-level. The Django developers have experimented
|
||||||
with writing small frameworks on top of this parsing system, using
|
with writing small frameworks on top of this parsing system, using
|
||||||
techniques such as EBNF grammars, but those experiments made the template
|
techniques such as EBNF grammars, but those experiments made the template
|
||||||
engine too slow. It's low-level because that's fastest.
|
engine too slow. It's low-level because that's fastest.
|
||||||
|
@ -433,13 +433,13 @@ Continuing the above example, we need to define ``CurrentTimeNode``:
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
* ``__init__()`` gets the ``format_string`` from ``do_current_time()``.
|
* ``__init__()`` gets the ``format_string`` from ``do_current_time()``.
|
||||||
Always pass any options/parameters/arguments to a ``Node`` via its
|
Always pass any options/parameters/arguments to a ``Node`` via its
|
||||||
``__init__()``.
|
``__init__()``.
|
||||||
|
|
||||||
* The ``render()`` method is where the work actually happens.
|
* The ``render()`` method is where the work actually happens.
|
||||||
|
|
||||||
* ``render()`` should never raise ``TemplateSyntaxError`` or any other
|
* ``render()`` should never raise ``TemplateSyntaxError`` or any other
|
||||||
exception. It should fail silently, just as template filters should.
|
exception. It should fail silently, just as template filters should.
|
||||||
|
|
||||||
Ultimately, this decoupling of compilation and rendering results in an
|
Ultimately, this decoupling of compilation and rendering results in an
|
||||||
|
@ -525,13 +525,13 @@ A naive implementation of ``CycleNode`` might look something like this:
|
||||||
But, suppose we have two templates rendering the template snippet from above at
|
But, suppose we have two templates rendering the template snippet from above at
|
||||||
the same time:
|
the same time:
|
||||||
|
|
||||||
1. Thread 1 performs its first loop iteration, ``CycleNode.render()``
|
1. Thread 1 performs its first loop iteration, ``CycleNode.render()``
|
||||||
returns 'row1'
|
returns 'row1'
|
||||||
2. Thread 2 performs its first loop iteration, ``CycleNode.render()``
|
2. Thread 2 performs its first loop iteration, ``CycleNode.render()``
|
||||||
returns 'row2'
|
returns 'row2'
|
||||||
3. Thread 1 performs its second loop iteration, ``CycleNode.render()``
|
3. Thread 1 performs its second loop iteration, ``CycleNode.render()``
|
||||||
returns 'row1'
|
returns 'row1'
|
||||||
4. Thread 2 performs its second loop iteration, ``CycleNode.render()``
|
4. Thread 2 performs its second loop iteration, ``CycleNode.render()``
|
||||||
returns 'row2'
|
returns 'row2'
|
||||||
|
|
||||||
The CycleNode is iterating, but it's iterating globally. As far as Thread 1
|
The CycleNode is iterating, but it's iterating globally. As far as Thread 1
|
||||||
|
@ -584,9 +584,9 @@ in "Writing custom template filters" above. Example:
|
||||||
|
|
||||||
The ``tag()`` method takes two arguments:
|
The ``tag()`` method takes two arguments:
|
||||||
|
|
||||||
1. The name of the template tag -- a string. If this is left out, the
|
1. The name of the template tag -- a string. If this is left out, the
|
||||||
name of the compilation function will be used.
|
name of the compilation function will be used.
|
||||||
2. The compilation function -- a Python function (not the name of the
|
2. The compilation function -- a Python function (not the name of the
|
||||||
function as a string).
|
function as a string).
|
||||||
|
|
||||||
As with filter registration, it is also possible to use this as a decorator:
|
As with filter registration, it is also possible to use this as a decorator:
|
||||||
|
@ -623,10 +623,10 @@ tag format that date-time:
|
||||||
|
|
||||||
Initially, ``token.split_contents()`` will return three values:
|
Initially, ``token.split_contents()`` will return three values:
|
||||||
|
|
||||||
1. The tag name ``format_time``.
|
1. The tag name ``format_time``.
|
||||||
2. The string ``"blog_entry.date_updated"`` (without the surrounding
|
2. The string ``"blog_entry.date_updated"`` (without the surrounding
|
||||||
quotes).
|
quotes).
|
||||||
3. The formatting string ``"%Y-%m-%d %I:%M %p"``. The return value from
|
3. The formatting string ``"%Y-%m-%d %I:%M %p"``. The return value from
|
||||||
``split_contents()`` will include the leading and trailing quotes for
|
``split_contents()`` will include the leading and trailing quotes for
|
||||||
string literals like this.
|
string literals like this.
|
||||||
|
|
||||||
|
@ -706,11 +706,11 @@ The decorator syntax also works:
|
||||||
|
|
||||||
A few things to note about the ``simple_tag`` helper function:
|
A few things to note about the ``simple_tag`` helper function:
|
||||||
|
|
||||||
* Checking for the required number of arguments, etc., has already been
|
* Checking for the required number of arguments, etc., has already been
|
||||||
done by the time our function is called, so we don't need to do that.
|
done by the time our function is called, so we don't need to do that.
|
||||||
* The quotes around the argument (if any) have already been stripped away,
|
* The quotes around the argument (if any) have already been stripped away,
|
||||||
so we just receive a plain string.
|
so we just receive a plain string.
|
||||||
* If the argument was a template variable, our function is passed the
|
* If the argument was a template variable, our function is passed the
|
||||||
current value of the variable, not the variable itself.
|
current value of the variable, not the variable itself.
|
||||||
|
|
||||||
.. versionadded:: 1.3
|
.. versionadded:: 1.3
|
||||||
|
|
|
@ -168,9 +168,9 @@ Once you've got that set up, point Apache at your Django FastCGI instance by
|
||||||
editing the ``httpd.conf`` (Apache configuration) file. You'll need to do two
|
editing the ``httpd.conf`` (Apache configuration) file. You'll need to do two
|
||||||
things:
|
things:
|
||||||
|
|
||||||
* Use the ``FastCGIExternalServer`` directive to specify the location of
|
* Use the ``FastCGIExternalServer`` directive to specify the location of
|
||||||
your FastCGI server.
|
your FastCGI server.
|
||||||
* Use ``mod_rewrite`` to point URLs at FastCGI as appropriate.
|
* Use ``mod_rewrite`` to point URLs at FastCGI as appropriate.
|
||||||
|
|
||||||
.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
|
.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
|
||||||
|
|
||||||
|
|
|
@ -240,11 +240,11 @@ server you choose.
|
||||||
We recommend using a separate Web server -- i.e., one that's not also running
|
We recommend using a separate Web server -- i.e., one that's not also running
|
||||||
Django -- for serving media. Here are some good choices:
|
Django -- for serving media. Here are some good choices:
|
||||||
|
|
||||||
* lighttpd_
|
* lighttpd_
|
||||||
* Nginx_
|
* Nginx_
|
||||||
* TUX_
|
* TUX_
|
||||||
* A stripped-down version of Apache_
|
* A stripped-down version of Apache_
|
||||||
* Cherokee_
|
* Cherokee_
|
||||||
|
|
||||||
If, however, you have no option but to serve media or static files on the
|
If, however, you have no option but to serve media or static files on the
|
||||||
same Apache ``VirtualHost`` as Django, here's how you can turn off mod_python
|
same Apache ``VirtualHost`` as Django, here's how you can turn off mod_python
|
||||||
|
@ -299,10 +299,10 @@ Django distribution.
|
||||||
We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
|
We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
|
||||||
the admin files, but here are two other approaches:
|
the admin files, but here are two other approaches:
|
||||||
|
|
||||||
1. Create a symbolic link to the admin static files from within your
|
1. Create a symbolic link to the admin static files from within your
|
||||||
document root.
|
document root.
|
||||||
|
|
||||||
2. Or, copy the admin static files so that they live within your Apache
|
2. Or, copy the admin static files so that they live within your Apache
|
||||||
document root.
|
document root.
|
||||||
|
|
||||||
Using "eggs" with mod_python
|
Using "eggs" with mod_python
|
||||||
|
@ -362,11 +362,11 @@ If you get a segmentation fault
|
||||||
If Apache causes a segmentation fault, there are two probable causes, neither
|
If Apache causes a segmentation fault, there are two probable causes, neither
|
||||||
of which has to do with Django itself.
|
of which has to do with Django itself.
|
||||||
|
|
||||||
1. It may be because your Python code is importing the "pyexpat" module,
|
1. It may be because your Python code is importing the "pyexpat" module,
|
||||||
which may conflict with the version embedded in Apache. For full
|
which may conflict with the version embedded in Apache. For full
|
||||||
information, see `Expat Causing Apache Crash`_.
|
information, see `Expat Causing Apache Crash`_.
|
||||||
|
|
||||||
2. It may be because you're running mod_python and mod_php in the same
|
2. It may be because you're running mod_python and mod_php in the same
|
||||||
Apache instance, with MySQL as your database backend. In some cases,
|
Apache instance, with MySQL as your database backend. In some cases,
|
||||||
this causes a known mod_python issue due to version conflicts in PHP and
|
this causes a known mod_python issue due to version conflicts in PHP and
|
||||||
the Python MySQL backend. There's full information in the
|
the Python MySQL backend. There's full information in the
|
||||||
|
|
|
@ -64,11 +64,11 @@ server you choose.
|
||||||
We recommend using a separate Web server -- i.e., one that's not also running
|
We recommend using a separate Web server -- i.e., one that's not also running
|
||||||
Django -- for serving media. Here are some good choices:
|
Django -- for serving media. Here are some good choices:
|
||||||
|
|
||||||
* lighttpd_
|
* lighttpd_
|
||||||
* Nginx_
|
* Nginx_
|
||||||
* TUX_
|
* TUX_
|
||||||
* A stripped-down version of Apache_
|
* A stripped-down version of Apache_
|
||||||
* Cherokee_
|
* Cherokee_
|
||||||
|
|
||||||
If, however, you have no option but to serve media files on the same Apache
|
If, however, you have no option but to serve media files on the same Apache
|
||||||
``VirtualHost`` as Django, you can set up Apache to serve some URLs as
|
``VirtualHost`` as Django, you can set up Apache to serve some URLs as
|
||||||
|
@ -131,10 +131,10 @@ Django distribution.
|
||||||
We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
|
We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle
|
||||||
the admin files, but here are two other approaches:
|
the admin files, but here are two other approaches:
|
||||||
|
|
||||||
1. Create a symbolic link to the admin static files from within your
|
1. Create a symbolic link to the admin static files from within your
|
||||||
document root.
|
document root.
|
||||||
|
|
||||||
2. Or, copy the admin static files so that they live within your Apache
|
2. Or, copy the admin static files so that they live within your Apache
|
||||||
document root.
|
document root.
|
||||||
|
|
||||||
Details
|
Details
|
||||||
|
|
|
@ -56,11 +56,11 @@ setting.
|
||||||
Django can also be configured to email errors about broken links (404 "page
|
Django can also be configured to email errors about broken links (404 "page
|
||||||
not found" errors). Django sends emails about 404 errors when:
|
not found" errors). Django sends emails about 404 errors when:
|
||||||
|
|
||||||
* :setting:`DEBUG` is ``False``
|
* :setting:`DEBUG` is ``False``
|
||||||
|
|
||||||
* :setting:`SEND_BROKEN_LINK_EMAILS` is ``True``
|
* :setting:`SEND_BROKEN_LINK_EMAILS` is ``True``
|
||||||
|
|
||||||
* Your :setting:`MIDDLEWARE_CLASSES` setting includes ``CommonMiddleware``
|
* Your :setting:`MIDDLEWARE_CLASSES` setting includes ``CommonMiddleware``
|
||||||
(which it does by default).
|
(which it does by default).
|
||||||
|
|
||||||
If those conditions are met, Django will email the users listed in the
|
If those conditions are met, Django will email the users listed in the
|
||||||
|
@ -144,9 +144,7 @@ production environment (that is, where :setting:`DEBUG` is set to ``False``):
|
||||||
If a function (either a view or any regular callback) in your code uses
|
If a function (either a view or any regular callback) in your code uses
|
||||||
local variables susceptible to contain sensitive information, you may
|
local variables susceptible to contain sensitive information, you may
|
||||||
prevent the values of those variables from being included in error reports
|
prevent the values of those variables from being included in error reports
|
||||||
using the ``sensitive_variables`` decorator:
|
using the ``sensitive_variables`` decorator::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
from django.views.decorators.debug import sensitive_variables
|
from django.views.decorators.debug import sensitive_variables
|
||||||
|
|
||||||
|
@ -163,9 +161,7 @@ production environment (that is, where :setting:`DEBUG` is set to ``False``):
|
||||||
disclosed.
|
disclosed.
|
||||||
|
|
||||||
To systematically hide all local variables of a function from error logs,
|
To systematically hide all local variables of a function from error logs,
|
||||||
do not provide any argument to the ``sensitive_variables`` decorator:
|
do not provide any argument to the ``sensitive_variables`` decorator::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
@sensitive_variables()
|
@sensitive_variables()
|
||||||
def my_function():
|
def my_function():
|
||||||
|
@ -177,9 +173,7 @@ production environment (that is, where :setting:`DEBUG` is set to ``False``):
|
||||||
:attr:`POST parameters<HttpRequest.POST>` susceptible to contain sensitive
|
:attr:`POST parameters<HttpRequest.POST>` susceptible to contain sensitive
|
||||||
information, you may prevent the values of those parameters from being
|
information, you may prevent the values of those parameters from being
|
||||||
included in the error reports using the ``sensitive_post_parameters``
|
included in the error reports using the ``sensitive_post_parameters``
|
||||||
decorator:
|
decorator::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
from django.views.decorators.debug import sensitive_post_parameters
|
from django.views.decorators.debug import sensitive_post_parameters
|
||||||
|
|
||||||
|
@ -197,9 +191,7 @@ production environment (that is, where :setting:`DEBUG` is set to ``False``):
|
||||||
reports, whereas the value of the ``name`` parameter will be disclosed.
|
reports, whereas the value of the ``name`` parameter will be disclosed.
|
||||||
|
|
||||||
To systematically hide all POST parameters of a request in error reports,
|
To systematically hide all POST parameters of a request in error reports,
|
||||||
do not provide any argument to the ``sensitive_post_parameters`` decorator:
|
do not provide any argument to the ``sensitive_post_parameters`` decorator::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
@sensitive_post_parameters()
|
@sensitive_post_parameters()
|
||||||
def my_view(request):
|
def my_view(request):
|
||||||
|
@ -231,17 +223,13 @@ decorators' annotations to replace the corresponding values with stars
|
||||||
(`**********`) when the error reports are produced. If you wish to override or
|
(`**********`) when the error reports are produced. If you wish to override or
|
||||||
customize this default behavior for your entire site, you need to define your
|
customize this default behavior for your entire site, you need to define your
|
||||||
own filter class and tell Django to use it via the
|
own filter class and tell Django to use it via the
|
||||||
:setting:`DEFAULT_EXCEPTION_REPORTER_FILTER` setting:
|
:setting:`DEFAULT_EXCEPTION_REPORTER_FILTER` setting::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
DEFAULT_EXCEPTION_REPORTER_FILTER = 'path.to.your.CustomExceptionReporterFilter'
|
DEFAULT_EXCEPTION_REPORTER_FILTER = 'path.to.your.CustomExceptionReporterFilter'
|
||||||
|
|
||||||
You may also control in a more granular way which filter to use within any
|
You may also control in a more granular way which filter to use within any
|
||||||
given view by setting the ``HttpRequest``'s ``exception_reporter_filter``
|
given view by setting the ``HttpRequest``'s ``exception_reporter_filter``
|
||||||
attribute:
|
attribute::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def my_view(request):
|
def my_view(request):
|
||||||
if request.user.is_authenticated():
|
if request.user.is_authenticated():
|
||||||
|
|
|
@ -10,15 +10,15 @@ the order in which it examines the different file paths to load the compiled
|
||||||
:term:`message files <message file>` (``.mo``) and the precedence of multiple
|
:term:`message files <message file>` (``.mo``) and the precedence of multiple
|
||||||
translations for the same literal:
|
translations for the same literal:
|
||||||
|
|
||||||
1. The directories listed in :setting:`LOCALE_PATHS` have the highest
|
1. The directories listed in :setting:`LOCALE_PATHS` have the highest
|
||||||
precedence, with the ones appearing first having higher precedence than
|
precedence, with the ones appearing first having higher precedence than
|
||||||
the ones appearing later.
|
the ones appearing later.
|
||||||
2. Then, it looks for and uses if it exists a ``locale`` directory in each
|
2. Then, it looks for and uses if it exists a ``locale`` directory in each
|
||||||
of the installed apps listed in :setting:`INSTALLED_APPS`. The ones
|
of the installed apps listed in :setting:`INSTALLED_APPS`. The ones
|
||||||
appearing first have higher precedence than the ones appearing later.
|
appearing first have higher precedence than the ones appearing later.
|
||||||
3. Then, it looks for a ``locale`` directory in the project directory, or
|
3. Then, it looks for a ``locale`` directory in the project directory, or
|
||||||
more accurately, in the directory containing your settings file.
|
more accurately, in the directory containing your settings file.
|
||||||
4. Finally, the Django-provided base translation in ``django/conf/locale``
|
4. Finally, the Django-provided base translation in ``django/conf/locale``
|
||||||
is used as a fallback.
|
is used as a fallback.
|
||||||
|
|
||||||
.. deprecated:: 1.3
|
.. deprecated:: 1.3
|
||||||
|
@ -55,12 +55,12 @@ message file specific to the project you are composing. The choice is yours.
|
||||||
|
|
||||||
All message file repositories are structured the same way. They are:
|
All message file repositories are structured the same way. They are:
|
||||||
|
|
||||||
* All paths listed in :setting:`LOCALE_PATHS` in your settings file are
|
* All paths listed in :setting:`LOCALE_PATHS` in your settings file are
|
||||||
searched for ``<language>/LC_MESSAGES/django.(po|mo)``
|
searched for ``<language>/LC_MESSAGES/django.(po|mo)``
|
||||||
* ``$PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)`` --
|
* ``$PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)`` --
|
||||||
deprecated, see above.
|
deprecated, see above.
|
||||||
* ``$APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)``
|
* ``$APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)``
|
||||||
* ``$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)``
|
* ``$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)``
|
||||||
|
|
||||||
To create message files, you use the :djadmin:`django-admin.py makemessages <makemessages>`
|
To create message files, you use the :djadmin:`django-admin.py makemessages <makemessages>`
|
||||||
tool. You only need to be in the same directory where the ``locale/`` directory
|
tool. You only need to be in the same directory where the ``locale/`` directory
|
||||||
|
|
|
@ -64,10 +64,10 @@ Differences with Django on Jython
|
||||||
At this point, Django on Jython should behave nearly identically to Django
|
At this point, Django on Jython should behave nearly identically to Django
|
||||||
running on standard Python. However, are a few differences to keep in mind:
|
running on standard Python. However, are a few differences to keep in mind:
|
||||||
|
|
||||||
* Remember to use the ``jython`` command instead of ``python``. The
|
* Remember to use the ``jython`` command instead of ``python``. The
|
||||||
documentation uses ``python`` for consistency, but if you're using Jython
|
documentation uses ``python`` for consistency, but if you're using Jython
|
||||||
you'll want to mentally replace ``python`` with ``jython`` every time it
|
you'll want to mentally replace ``python`` with ``jython`` every time it
|
||||||
occurs.
|
occurs.
|
||||||
|
|
||||||
* Similarly, you'll need to use the ``JYTHONPATH`` environment variable
|
* Similarly, you'll need to use the ``JYTHONPATH`` environment variable
|
||||||
instead of ``PYTHONPATH``.
|
instead of ``PYTHONPATH``.
|
||||||
|
|
|
@ -20,12 +20,12 @@ what the name of the database is. Do that by editing the :setting:`DATABASES`
|
||||||
setting and assigning values to the following keys for the ``'default'``
|
setting and assigning values to the following keys for the ``'default'``
|
||||||
connection:
|
connection:
|
||||||
|
|
||||||
* :setting:`NAME`
|
* :setting:`NAME`
|
||||||
* :setting:`ENGINE`
|
* :setting:`ENGINE`
|
||||||
* :setting:`USER`
|
* :setting:`USER`
|
||||||
* :setting:`PASSWORD`
|
* :setting:`PASSWORD`
|
||||||
* :setting:`HOST`
|
* :setting:`HOST`
|
||||||
* :setting:`PORT`
|
* :setting:`PORT`
|
||||||
|
|
||||||
Auto-generate the models
|
Auto-generate the models
|
||||||
========================
|
========================
|
||||||
|
|
|
@ -32,25 +32,25 @@ Here's an example::
|
||||||
The code and comments should be self-explanatory, but a few things deserve a
|
The code and comments should be self-explanatory, but a few things deserve a
|
||||||
mention:
|
mention:
|
||||||
|
|
||||||
* The response gets a special MIME type, :mimetype:`text/csv`. This tells
|
* The response gets a special MIME type, :mimetype:`text/csv`. This tells
|
||||||
browsers that the document is a CSV file, rather than an HTML file. If
|
browsers that the document is a CSV file, rather than an HTML file. If
|
||||||
you leave this off, browsers will probably interpret the output as HTML,
|
you leave this off, browsers will probably interpret the output as HTML,
|
||||||
which will result in ugly, scary gobbledygook in the browser window.
|
which will result in ugly, scary gobbledygook in the browser window.
|
||||||
|
|
||||||
* The response gets an additional ``Content-Disposition`` header, which
|
* The response gets an additional ``Content-Disposition`` header, which
|
||||||
contains the name of the CSV file. This filename is arbitrary; call it
|
contains the name of the CSV file. This filename is arbitrary; call it
|
||||||
whatever you want. It'll be used by browsers in the "Save as..."
|
whatever you want. It'll be used by browsers in the "Save as..."
|
||||||
dialogue, etc.
|
dialogue, etc.
|
||||||
|
|
||||||
* Hooking into the CSV-generation API is easy: Just pass ``response`` as the
|
* Hooking into the CSV-generation API is easy: Just pass ``response`` as the
|
||||||
first argument to ``csv.writer``. The ``csv.writer`` function expects a
|
first argument to ``csv.writer``. The ``csv.writer`` function expects a
|
||||||
file-like object, and :class:`~django.http.HttpResponse` objects fit the
|
file-like object, and :class:`~django.http.HttpResponse` objects fit the
|
||||||
bill.
|
bill.
|
||||||
|
|
||||||
* For each row in your CSV file, call ``writer.writerow``, passing it an
|
* For each row in your CSV file, call ``writer.writerow``, passing it an
|
||||||
iterable object such as a list or tuple.
|
iterable object such as a list or tuple.
|
||||||
|
|
||||||
* The CSV module takes care of quoting for you, so you don't have to worry
|
* The CSV module takes care of quoting for you, so you don't have to worry
|
||||||
about escaping strings with quotes or commas in them. Just pass
|
about escaping strings with quotes or commas in them. Just pass
|
||||||
``writerow()`` your raw strings, and it'll do the right thing.
|
``writerow()`` your raw strings, and it'll do the right thing.
|
||||||
|
|
||||||
|
@ -62,12 +62,12 @@ Unicode internally this means strings read from sources such as
|
||||||
:class:`~django.http.HttpRequest` are potentially problematic. There are a few
|
:class:`~django.http.HttpRequest` are potentially problematic. There are a few
|
||||||
options for handling this:
|
options for handling this:
|
||||||
|
|
||||||
* Manually encode all Unicode objects to a compatible encoding.
|
* Manually encode all Unicode objects to a compatible encoding.
|
||||||
|
|
||||||
* Use the ``UnicodeWriter`` class provided in the `csv module's examples
|
* Use the ``UnicodeWriter`` class provided in the `csv module's examples
|
||||||
section`_.
|
section`_.
|
||||||
|
|
||||||
* Use the `python-unicodecsv module`_, which aims to be a drop-in
|
* Use the `python-unicodecsv module`_, which aims to be a drop-in
|
||||||
replacement for :mod:`csv` that gracefully handles Unicode.
|
replacement for :mod:`csv` that gracefully handles Unicode.
|
||||||
|
|
||||||
For more information, see the Python documentation of the :mod:`csv` module.
|
For more information, see the Python documentation of the :mod:`csv` module.
|
||||||
|
|
|
@ -63,18 +63,18 @@ Here's a "Hello World" example::
|
||||||
The code and comments should be self-explanatory, but a few things deserve a
|
The code and comments should be self-explanatory, but a few things deserve a
|
||||||
mention:
|
mention:
|
||||||
|
|
||||||
* The response gets a special MIME type, :mimetype:`application/pdf`. This
|
* The response gets a special MIME type, :mimetype:`application/pdf`. This
|
||||||
tells browsers that the document is a PDF file, rather than an HTML file.
|
tells browsers that the document is a PDF file, rather than an HTML file.
|
||||||
If you leave this off, browsers will probably interpret the output as
|
If you leave this off, browsers will probably interpret the output as
|
||||||
HTML, which would result in ugly, scary gobbledygook in the browser
|
HTML, which would result in ugly, scary gobbledygook in the browser
|
||||||
window.
|
window.
|
||||||
|
|
||||||
* The response gets an additional ``Content-Disposition`` header, which
|
* The response gets an additional ``Content-Disposition`` header, which
|
||||||
contains the name of the PDF file. This filename is arbitrary: Call it
|
contains the name of the PDF file. This filename is arbitrary: Call it
|
||||||
whatever you want. It'll be used by browsers in the "Save as..."
|
whatever you want. It'll be used by browsers in the "Save as..."
|
||||||
dialogue, etc.
|
dialogue, etc.
|
||||||
|
|
||||||
* The ``Content-Disposition`` header starts with ``'attachment; '`` in this
|
* The ``Content-Disposition`` header starts with ``'attachment; '`` in this
|
||||||
example. This forces Web browsers to pop-up a dialog box
|
example. This forces Web browsers to pop-up a dialog box
|
||||||
prompting/confirming how to handle the document even if a default is set
|
prompting/confirming how to handle the document even if a default is set
|
||||||
on the machine. If you leave off ``'attachment;'``, browsers will handle
|
on the machine. If you leave off ``'attachment;'``, browsers will handle
|
||||||
|
@ -83,15 +83,15 @@ mention:
|
||||||
|
|
||||||
response['Content-Disposition'] = 'filename=somefilename.pdf'
|
response['Content-Disposition'] = 'filename=somefilename.pdf'
|
||||||
|
|
||||||
* Hooking into the ReportLab API is easy: Just pass ``response`` as the
|
* Hooking into the ReportLab API is easy: Just pass ``response`` as the
|
||||||
first argument to ``canvas.Canvas``. The ``Canvas`` class expects a
|
first argument to ``canvas.Canvas``. The ``Canvas`` class expects a
|
||||||
file-like object, and :class:`~django.http.HttpResponse` objects fit the
|
file-like object, and :class:`~django.http.HttpResponse` objects fit the
|
||||||
bill.
|
bill.
|
||||||
|
|
||||||
* Note that all subsequent PDF-generation methods are called on the PDF
|
* Note that all subsequent PDF-generation methods are called on the PDF
|
||||||
object (in this case, ``p``) -- not on ``response``.
|
object (in this case, ``p``) -- not on ``response``.
|
||||||
|
|
||||||
* Finally, it's important to call ``showPage()`` and ``save()`` on the PDF
|
* Finally, it's important to call ``showPage()`` and ``save()`` on the PDF
|
||||||
file.
|
file.
|
||||||
|
|
||||||
Complex PDFs
|
Complex PDFs
|
||||||
|
@ -137,11 +137,11 @@ Here's the above "Hello World" example rewritten to use :mod:`cStringIO`::
|
||||||
Further resources
|
Further resources
|
||||||
=================
|
=================
|
||||||
|
|
||||||
* PDFlib_ is another PDF-generation library that has Python bindings. To
|
* PDFlib_ is another PDF-generation library that has Python bindings. To
|
||||||
use it with Django, just use the same concepts explained in this article.
|
use it with Django, just use the same concepts explained in this article.
|
||||||
* `Pisa XHTML2PDF`_ is yet another PDF-generation library. Pisa ships with
|
* `Pisa XHTML2PDF`_ is yet another PDF-generation library. Pisa ships with
|
||||||
an example of how to integrate Pisa with Django.
|
an example of how to integrate Pisa with Django.
|
||||||
* HTMLdoc_ is a command-line script that can convert HTML to PDF. It
|
* HTMLdoc_ is a command-line script that can convert HTML to PDF. It
|
||||||
doesn't have a Python interface, but you can escape out to the shell
|
doesn't have a Python interface, but you can escape out to the shell
|
||||||
using ``system`` or ``popen`` and retrieve the output in Python.
|
using ``system`` or ``popen`` and retrieve the output in Python.
|
||||||
|
|
||||||
|
|
|
@ -345,10 +345,10 @@ Serving the app and your static files from the same server
|
||||||
If you want to serve your static files from the same server that's already
|
If you want to serve your static files from the same server that's already
|
||||||
serving your site, the basic outline gets modified to look something like:
|
serving your site, the basic outline gets modified to look something like:
|
||||||
|
|
||||||
* Push your code up to the deployment server.
|
* Push your code up to the deployment server.
|
||||||
* On the server, run :djadmin:`collectstatic` to copy all the static files
|
* On the server, run :djadmin:`collectstatic` to copy all the static files
|
||||||
into :setting:`STATIC_ROOT`.
|
into :setting:`STATIC_ROOT`.
|
||||||
* Point your web server at :setting:`STATIC_ROOT`. For example, here's
|
* Point your web server at :setting:`STATIC_ROOT`. For example, here's
|
||||||
:ref:`how to do this under Apache and mod_wsgi <serving-files>`.
|
:ref:`how to do this under Apache and mod_wsgi <serving-files>`.
|
||||||
|
|
||||||
You'll probably want to automate this process, especially if you've got
|
You'll probably want to automate this process, especially if you've got
|
||||||
|
@ -386,11 +386,11 @@ Most larger Django apps use a separate Web server -- i.e., one that's not also
|
||||||
running Django -- for serving static files. This server often runs a different
|
running Django -- for serving static files. This server often runs a different
|
||||||
type of web server -- faster but less full-featured. Some good choices are:
|
type of web server -- faster but less full-featured. Some good choices are:
|
||||||
|
|
||||||
* lighttpd_
|
* lighttpd_
|
||||||
* Nginx_
|
* Nginx_
|
||||||
* TUX_
|
* TUX_
|
||||||
* Cherokee_
|
* Cherokee_
|
||||||
* A stripped-down version of Apache_
|
* A stripped-down version of Apache_
|
||||||
|
|
||||||
.. _lighttpd: http://www.lighttpd.net/
|
.. _lighttpd: http://www.lighttpd.net/
|
||||||
.. _Nginx: http://wiki.nginx.org/Main
|
.. _Nginx: http://wiki.nginx.org/Main
|
||||||
|
@ -404,8 +404,8 @@ server's respective documentation for instructions.
|
||||||
Since your static file server won't be running Django, you'll need to modify
|
Since your static file server won't be running Django, you'll need to modify
|
||||||
the deployment strategy to look something like:
|
the deployment strategy to look something like:
|
||||||
|
|
||||||
* When your static files change, run :djadmin:`collectstatic` locally.
|
* When your static files change, run :djadmin:`collectstatic` locally.
|
||||||
* Push your local :setting:`STATIC_ROOT` up to the static file server
|
* Push your local :setting:`STATIC_ROOT` up to the static file server
|
||||||
into the directory that's being served. ``rsync`` is a good
|
into the directory that's being served. ``rsync`` is a good
|
||||||
choice for this step since it only needs to transfer the
|
choice for this step since it only needs to transfer the
|
||||||
bits of static files that have changed.
|
bits of static files that have changed.
|
||||||
|
@ -479,25 +479,25 @@ Upgrading from ``django-staticfiles``
|
||||||
you're upgrading from `django-staticfiles`_ older than 1.0 (e.g. 0.3.4) to
|
you're upgrading from `django-staticfiles`_ older than 1.0 (e.g. 0.3.4) to
|
||||||
``django.contrib.staticfiles``, you'll need to make a few changes:
|
``django.contrib.staticfiles``, you'll need to make a few changes:
|
||||||
|
|
||||||
* Application files should now live in a ``static`` directory in each app
|
* Application files should now live in a ``static`` directory in each app
|
||||||
(`django-staticfiles`_ used the name ``media``, which was slightly
|
(`django-staticfiles`_ used the name ``media``, which was slightly
|
||||||
confusing).
|
confusing).
|
||||||
|
|
||||||
* The management commands ``build_static`` and ``resolve_static`` are now
|
* The management commands ``build_static`` and ``resolve_static`` are now
|
||||||
called :djadmin:`collectstatic` and :djadmin:`findstatic`.
|
called :djadmin:`collectstatic` and :djadmin:`findstatic`.
|
||||||
|
|
||||||
* The settings ``STATICFILES_PREPEND_LABEL_APPS``,
|
* The settings ``STATICFILES_PREPEND_LABEL_APPS``,
|
||||||
``STATICFILES_MEDIA_DIRNAMES`` and ``STATICFILES_EXCLUDED_APPS`` were
|
``STATICFILES_MEDIA_DIRNAMES`` and ``STATICFILES_EXCLUDED_APPS`` were
|
||||||
removed.
|
removed.
|
||||||
|
|
||||||
* The setting ``STATICFILES_RESOLVERS`` was removed, and replaced by the
|
* The setting ``STATICFILES_RESOLVERS`` was removed, and replaced by the
|
||||||
new :setting:`STATICFILES_FINDERS`.
|
new :setting:`STATICFILES_FINDERS`.
|
||||||
|
|
||||||
* The default for :setting:`STATICFILES_STORAGE` was renamed from
|
* The default for :setting:`STATICFILES_STORAGE` was renamed from
|
||||||
``staticfiles.storage.StaticFileStorage`` to
|
``staticfiles.storage.StaticFileStorage`` to
|
||||||
``staticfiles.storage.StaticFilesStorage``
|
``staticfiles.storage.StaticFilesStorage``
|
||||||
|
|
||||||
* If using :ref:`runserver<staticfiles-runserver>` for local development
|
* If using :ref:`runserver<staticfiles-runserver>` for local development
|
||||||
(and the :setting:`DEBUG` setting is ``True``), you no longer need to add
|
(and the :setting:`DEBUG` setting is ``True``), you no longer need to add
|
||||||
anything to your URLconf for serving static files in development.
|
anything to your URLconf for serving static files in development.
|
||||||
|
|
||||||
|
|
122
docs/index.txt
122
docs/index.txt
|
@ -34,11 +34,11 @@ Having trouble? We'd like to help!
|
||||||
First steps
|
First steps
|
||||||
===========
|
===========
|
||||||
|
|
||||||
* **From scratch:**
|
* **From scratch:**
|
||||||
:doc:`Overview <intro/overview>` |
|
:doc:`Overview <intro/overview>` |
|
||||||
:doc:`Installation <intro/install>`
|
:doc:`Installation <intro/install>`
|
||||||
|
|
||||||
* **Tutorial:**
|
* **Tutorial:**
|
||||||
:doc:`Part 1 <intro/tutorial01>` |
|
:doc:`Part 1 <intro/tutorial01>` |
|
||||||
:doc:`Part 2 <intro/tutorial02>` |
|
:doc:`Part 2 <intro/tutorial02>` |
|
||||||
:doc:`Part 3 <intro/tutorial03>` |
|
:doc:`Part 3 <intro/tutorial03>` |
|
||||||
|
@ -47,20 +47,20 @@ First steps
|
||||||
The model layer
|
The model layer
|
||||||
===============
|
===============
|
||||||
|
|
||||||
* **Models:**
|
* **Models:**
|
||||||
:doc:`Model syntax <topics/db/models>` |
|
:doc:`Model syntax <topics/db/models>` |
|
||||||
:doc:`Field types <ref/models/fields>` |
|
:doc:`Field types <ref/models/fields>` |
|
||||||
:doc:`Meta options <ref/models/options>`
|
:doc:`Meta options <ref/models/options>`
|
||||||
|
|
||||||
* **QuerySets:**
|
* **QuerySets:**
|
||||||
:doc:`Executing queries <topics/db/queries>` |
|
:doc:`Executing queries <topics/db/queries>` |
|
||||||
:doc:`QuerySet method reference <ref/models/querysets>`
|
:doc:`QuerySet method reference <ref/models/querysets>`
|
||||||
|
|
||||||
* **Model instances:**
|
* **Model instances:**
|
||||||
:doc:`Instance methods <ref/models/instances>` |
|
:doc:`Instance methods <ref/models/instances>` |
|
||||||
:doc:`Accessing related objects <ref/models/relations>`
|
:doc:`Accessing related objects <ref/models/relations>`
|
||||||
|
|
||||||
* **Advanced:**
|
* **Advanced:**
|
||||||
:doc:`Managers <topics/db/managers>` |
|
:doc:`Managers <topics/db/managers>` |
|
||||||
:doc:`Raw SQL <topics/db/sql>` |
|
:doc:`Raw SQL <topics/db/sql>` |
|
||||||
:doc:`Transactions <topics/db/transactions>` |
|
:doc:`Transactions <topics/db/transactions>` |
|
||||||
|
@ -68,7 +68,7 @@ The model layer
|
||||||
:doc:`Custom fields <howto/custom-model-fields>` |
|
:doc:`Custom fields <howto/custom-model-fields>` |
|
||||||
:doc:`Multiple databases <topics/db/multi-db>`
|
:doc:`Multiple databases <topics/db/multi-db>`
|
||||||
|
|
||||||
* **Other:**
|
* **Other:**
|
||||||
:doc:`Supported databases <ref/databases>` |
|
:doc:`Supported databases <ref/databases>` |
|
||||||
:doc:`Legacy databases <howto/legacy-databases>` |
|
:doc:`Legacy databases <howto/legacy-databases>` |
|
||||||
:doc:`Providing initial data <howto/initial-data>` |
|
:doc:`Providing initial data <howto/initial-data>` |
|
||||||
|
@ -77,82 +77,82 @@ The model layer
|
||||||
The template layer
|
The template layer
|
||||||
==================
|
==================
|
||||||
|
|
||||||
* **For designers:**
|
* **For designers:**
|
||||||
:doc:`Syntax overview <topics/templates>` |
|
:doc:`Syntax overview <topics/templates>` |
|
||||||
:doc:`Built-in tags and filters <ref/templates/builtins>`
|
:doc:`Built-in tags and filters <ref/templates/builtins>`
|
||||||
|
|
||||||
* **For programmers:**
|
* **For programmers:**
|
||||||
:doc:`Template API <ref/templates/api>` |
|
:doc:`Template API <ref/templates/api>` |
|
||||||
:doc:`Custom tags and filters <howto/custom-template-tags>`
|
:doc:`Custom tags and filters <howto/custom-template-tags>`
|
||||||
|
|
||||||
The view layer
|
The view layer
|
||||||
==============
|
==============
|
||||||
|
|
||||||
* **The basics:**
|
* **The basics:**
|
||||||
:doc:`URLconfs <topics/http/urls>` |
|
:doc:`URLconfs <topics/http/urls>` |
|
||||||
:doc:`View functions <topics/http/views>` |
|
:doc:`View functions <topics/http/views>` |
|
||||||
:doc:`Shortcuts <topics/http/shortcuts>` |
|
:doc:`Shortcuts <topics/http/shortcuts>` |
|
||||||
:doc:`Decorators <topics/http/decorators>`
|
:doc:`Decorators <topics/http/decorators>`
|
||||||
|
|
||||||
* **Reference:**
|
* **Reference:**
|
||||||
:doc:`Request/response objects <ref/request-response>` |
|
:doc:`Request/response objects <ref/request-response>` |
|
||||||
:doc:`TemplateResponse objects <ref/template-response>`
|
:doc:`TemplateResponse objects <ref/template-response>`
|
||||||
|
|
||||||
* **File uploads:**
|
* **File uploads:**
|
||||||
:doc:`Overview <topics/http/file-uploads>` |
|
:doc:`Overview <topics/http/file-uploads>` |
|
||||||
:doc:`File objects <ref/files/file>` |
|
:doc:`File objects <ref/files/file>` |
|
||||||
:doc:`Storage API <ref/files/storage>` |
|
:doc:`Storage API <ref/files/storage>` |
|
||||||
:doc:`Managing files <topics/files>` |
|
:doc:`Managing files <topics/files>` |
|
||||||
:doc:`Custom storage <howto/custom-file-storage>`
|
:doc:`Custom storage <howto/custom-file-storage>`
|
||||||
|
|
||||||
* **Generic views:**
|
* **Generic views:**
|
||||||
:doc:`Overview<topics/class-based-views>` |
|
:doc:`Overview<topics/class-based-views>` |
|
||||||
:doc:`Built-in generic views<ref/class-based-views>`
|
:doc:`Built-in generic views<ref/class-based-views>`
|
||||||
|
|
||||||
* **Advanced:**
|
* **Advanced:**
|
||||||
:doc:`Generating CSV <howto/outputting-csv>` |
|
:doc:`Generating CSV <howto/outputting-csv>` |
|
||||||
:doc:`Generating PDF <howto/outputting-pdf>`
|
:doc:`Generating PDF <howto/outputting-pdf>`
|
||||||
|
|
||||||
* **Middleware:**
|
* **Middleware:**
|
||||||
:doc:`Overview <topics/http/middleware>` |
|
:doc:`Overview <topics/http/middleware>` |
|
||||||
:doc:`Built-in middleware classes <ref/middleware>`
|
:doc:`Built-in middleware classes <ref/middleware>`
|
||||||
|
|
||||||
Forms
|
Forms
|
||||||
=====
|
=====
|
||||||
|
|
||||||
* **The basics:**
|
* **The basics:**
|
||||||
:doc:`Overview <topics/forms/index>` |
|
:doc:`Overview <topics/forms/index>` |
|
||||||
:doc:`Form API <ref/forms/api>` |
|
:doc:`Form API <ref/forms/api>` |
|
||||||
:doc:`Built-in fields <ref/forms/fields>` |
|
:doc:`Built-in fields <ref/forms/fields>` |
|
||||||
:doc:`Built-in widgets <ref/forms/widgets>`
|
:doc:`Built-in widgets <ref/forms/widgets>`
|
||||||
|
|
||||||
* **Advanced:**
|
* **Advanced:**
|
||||||
:doc:`Forms for models <topics/forms/modelforms>` |
|
:doc:`Forms for models <topics/forms/modelforms>` |
|
||||||
:doc:`Integrating media <topics/forms/media>` |
|
:doc:`Integrating media <topics/forms/media>` |
|
||||||
:doc:`Formsets <topics/forms/formsets>` |
|
:doc:`Formsets <topics/forms/formsets>` |
|
||||||
:doc:`Customizing validation <ref/forms/validation>`
|
:doc:`Customizing validation <ref/forms/validation>`
|
||||||
|
|
||||||
* **Extras:**
|
* **Extras:**
|
||||||
:doc:`Form preview <ref/contrib/formtools/form-preview>` |
|
:doc:`Form preview <ref/contrib/formtools/form-preview>` |
|
||||||
:doc:`Form wizard <ref/contrib/formtools/form-wizard>`
|
:doc:`Form wizard <ref/contrib/formtools/form-wizard>`
|
||||||
|
|
||||||
The development process
|
The development process
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
* **Settings:**
|
* **Settings:**
|
||||||
:doc:`Overview <topics/settings>` |
|
:doc:`Overview <topics/settings>` |
|
||||||
:doc:`Full list of settings <ref/settings>`
|
:doc:`Full list of settings <ref/settings>`
|
||||||
|
|
||||||
* **Exceptions:**
|
* **Exceptions:**
|
||||||
:doc:`Overview <ref/exceptions>`
|
:doc:`Overview <ref/exceptions>`
|
||||||
|
|
||||||
* **django-admin.py and manage.py:**
|
* **django-admin.py and manage.py:**
|
||||||
:doc:`Overview <ref/django-admin>` |
|
:doc:`Overview <ref/django-admin>` |
|
||||||
:doc:`Adding custom commands <howto/custom-management-commands>`
|
:doc:`Adding custom commands <howto/custom-management-commands>`
|
||||||
|
|
||||||
* **Testing:** :doc:`Overview <topics/testing>`
|
* **Testing:** :doc:`Overview <topics/testing>`
|
||||||
|
|
||||||
* **Deployment:**
|
* **Deployment:**
|
||||||
:doc:`Overview <howto/deployment/index>` |
|
:doc:`Overview <howto/deployment/index>` |
|
||||||
:doc:`Apache/mod_wsgi <howto/deployment/modwsgi>` |
|
:doc:`Apache/mod_wsgi <howto/deployment/modwsgi>` |
|
||||||
:doc:`uWSGI <howto/deployment/uwsgi>` |
|
:doc:`uWSGI <howto/deployment/uwsgi>` |
|
||||||
|
@ -165,59 +165,59 @@ The development process
|
||||||
Other batteries included
|
Other batteries included
|
||||||
========================
|
========================
|
||||||
|
|
||||||
* :doc:`Admin site <ref/contrib/admin/index>` | :doc:`Admin actions <ref/contrib/admin/actions>` | :doc:`Admin documentation generator<ref/contrib/admin/admindocs>`
|
* :doc:`Admin site <ref/contrib/admin/index>` | :doc:`Admin actions <ref/contrib/admin/actions>` | :doc:`Admin documentation generator<ref/contrib/admin/admindocs>`
|
||||||
* :doc:`Authentication <topics/auth>`
|
* :doc:`Authentication <topics/auth>`
|
||||||
* :doc:`Cache system <topics/cache>`
|
* :doc:`Cache system <topics/cache>`
|
||||||
* :doc:`Clickjacking protection <ref/clickjacking>`
|
* :doc:`Clickjacking protection <ref/clickjacking>`
|
||||||
* :doc:`Comments <ref/contrib/comments/index>` | :doc:`Moderation <ref/contrib/comments/moderation>` | :doc:`Custom comments <ref/contrib/comments/custom>`
|
* :doc:`Comments <ref/contrib/comments/index>` | :doc:`Moderation <ref/contrib/comments/moderation>` | :doc:`Custom comments <ref/contrib/comments/custom>`
|
||||||
* :doc:`Conditional content processing <topics/conditional-view-processing>`
|
* :doc:`Conditional content processing <topics/conditional-view-processing>`
|
||||||
* :doc:`Content types <ref/contrib/contenttypes>`
|
* :doc:`Content types <ref/contrib/contenttypes>`
|
||||||
* :doc:`Cross Site Request Forgery protection <ref/contrib/csrf>`
|
* :doc:`Cross Site Request Forgery protection <ref/contrib/csrf>`
|
||||||
* :doc:`Cryptographic signing <topics/signing>`
|
* :doc:`Cryptographic signing <topics/signing>`
|
||||||
* :doc:`Databrowse <ref/contrib/databrowse>`
|
* :doc:`Databrowse <ref/contrib/databrowse>`
|
||||||
* :doc:`E-mail (sending) <topics/email>`
|
* :doc:`E-mail (sending) <topics/email>`
|
||||||
* :doc:`Flatpages <ref/contrib/flatpages>`
|
* :doc:`Flatpages <ref/contrib/flatpages>`
|
||||||
* :doc:`GeoDjango <ref/contrib/gis/index>`
|
* :doc:`GeoDjango <ref/contrib/gis/index>`
|
||||||
* :doc:`Humanize <ref/contrib/humanize>`
|
* :doc:`Humanize <ref/contrib/humanize>`
|
||||||
* :doc:`Internationalization <topics/i18n/index>`
|
* :doc:`Internationalization <topics/i18n/index>`
|
||||||
* :doc:`Jython support <howto/jython>`
|
* :doc:`Jython support <howto/jython>`
|
||||||
* :doc:`"Local flavor" <ref/contrib/localflavor>`
|
* :doc:`"Local flavor" <ref/contrib/localflavor>`
|
||||||
* :doc:`Logging <topics/logging>`
|
* :doc:`Logging <topics/logging>`
|
||||||
* :doc:`Messages <ref/contrib/messages>`
|
* :doc:`Messages <ref/contrib/messages>`
|
||||||
* :doc:`Pagination <topics/pagination>`
|
* :doc:`Pagination <topics/pagination>`
|
||||||
* :doc:`Redirects <ref/contrib/redirects>`
|
* :doc:`Redirects <ref/contrib/redirects>`
|
||||||
* :doc:`Security <topics/security>`
|
* :doc:`Security <topics/security>`
|
||||||
* :doc:`Serialization <topics/serialization>`
|
* :doc:`Serialization <topics/serialization>`
|
||||||
* :doc:`Sessions <topics/http/sessions>`
|
* :doc:`Sessions <topics/http/sessions>`
|
||||||
* :doc:`Signals <topics/signals>`
|
* :doc:`Signals <topics/signals>`
|
||||||
* :doc:`Sitemaps <ref/contrib/sitemaps>`
|
* :doc:`Sitemaps <ref/contrib/sitemaps>`
|
||||||
* :doc:`Sites <ref/contrib/sites>`
|
* :doc:`Sites <ref/contrib/sites>`
|
||||||
* :doc:`Static Files <ref/contrib/staticfiles>`
|
* :doc:`Static Files <ref/contrib/staticfiles>`
|
||||||
* :doc:`Syndication feeds (RSS/Atom) <ref/contrib/syndication>`
|
* :doc:`Syndication feeds (RSS/Atom) <ref/contrib/syndication>`
|
||||||
* :doc:`Unicode in Django <ref/unicode>`
|
* :doc:`Unicode in Django <ref/unicode>`
|
||||||
* :doc:`Web design helpers <ref/contrib/webdesign>`
|
* :doc:`Web design helpers <ref/contrib/webdesign>`
|
||||||
* :doc:`Validators <ref/validators>`
|
* :doc:`Validators <ref/validators>`
|
||||||
* Function-based generic views (Deprecated) :doc:`Overview<topics/generic-views>` | :doc:`Built-in generic views<ref/generic-views>` | :doc:`Migration guide<topics/generic-views-migration>`
|
* Function-based generic views (Deprecated) :doc:`Overview<topics/generic-views>` | :doc:`Built-in generic views<ref/generic-views>` | :doc:`Migration guide<topics/generic-views-migration>`
|
||||||
|
|
||||||
The Django open-source project
|
The Django open-source project
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
* **Community:**
|
* **Community:**
|
||||||
:doc:`How to get involved <internals/contributing/index>` |
|
:doc:`How to get involved <internals/contributing/index>` |
|
||||||
:doc:`The release process <internals/release-process>` |
|
:doc:`The release process <internals/release-process>` |
|
||||||
:doc:`Team of committers <internals/committers>` |
|
:doc:`Team of committers <internals/committers>` |
|
||||||
:doc:`The Django source code repository <internals/svn>`
|
:doc:`The Django source code repository <internals/svn>`
|
||||||
|
|
||||||
* **Design philosophies:**
|
* **Design philosophies:**
|
||||||
:doc:`Overview <misc/design-philosophies>`
|
:doc:`Overview <misc/design-philosophies>`
|
||||||
|
|
||||||
* **Documentation:**
|
* **Documentation:**
|
||||||
:doc:`About this documentation <internals/contributing/writing-documentation>`
|
:doc:`About this documentation <internals/contributing/writing-documentation>`
|
||||||
|
|
||||||
* **Third-party distributions:**
|
* **Third-party distributions:**
|
||||||
:doc:`Overview <misc/distributions>`
|
:doc:`Overview <misc/distributions>`
|
||||||
|
|
||||||
* **Django over time:**
|
* **Django over time:**
|
||||||
:doc:`API stability <misc/api-stability>` |
|
:doc:`API stability <misc/api-stability>` |
|
||||||
:doc:`Release notes and upgrading instructions <releases/index>` |
|
:doc:`Release notes and upgrading instructions <releases/index>` |
|
||||||
:doc:`Deprecation Timeline <internals/deprecation>`
|
:doc:`Deprecation Timeline <internals/deprecation>`
|
||||||
|
|
|
@ -30,20 +30,20 @@ amount of overhead involved in working with any bug tracking system so your
|
||||||
help in keeping our ticket tracker as useful as possible is appreciated. In
|
help in keeping our ticket tracker as useful as possible is appreciated. In
|
||||||
particular:
|
particular:
|
||||||
|
|
||||||
* **Do** read the :doc:`FAQ </faq/index>` to see if your issue might
|
* **Do** read the :doc:`FAQ </faq/index>` to see if your issue might
|
||||||
be a well-known question.
|
be a well-known question.
|
||||||
|
|
||||||
* **Do** ask on `django-users`_ or `#django`_ *first* if you're not sure if
|
* **Do** ask on `django-users`_ or `#django`_ *first* if you're not sure if
|
||||||
what you're seeing is a bug.
|
what you're seeing is a bug.
|
||||||
|
|
||||||
* **Do** write complete, reproducible, specific bug reports. You must
|
* **Do** write complete, reproducible, specific bug reports. You must
|
||||||
include a clear, concise description of the problem, and a set of
|
include a clear, concise description of the problem, and a set of
|
||||||
instructions for replicating it. Add as much debug information as you can:
|
instructions for replicating it. Add as much debug information as you can:
|
||||||
code snippets, test cases, exception backtraces, screenshots, etc. A nice
|
code snippets, test cases, exception backtraces, screenshots, etc. A nice
|
||||||
small test case is the best way to report a bug, as it gives us an easy
|
small test case is the best way to report a bug, as it gives us an easy
|
||||||
way to confirm the bug quickly.
|
way to confirm the bug quickly.
|
||||||
|
|
||||||
* **Don't** post to `django-developers`_ just to announce that you have
|
* **Don't** post to `django-developers`_ just to announce that you have
|
||||||
filed a bug report. All the tickets are mailed to another list,
|
filed a bug report. All the tickets are mailed to another list,
|
||||||
`django-updates`_, which is tracked by developers and interested
|
`django-updates`_, which is tracked by developers and interested
|
||||||
community members; we see them as they are filed.
|
community members; we see them as they are filed.
|
||||||
|
@ -67,25 +67,25 @@ Reporting security issues
|
||||||
In the event of a confirmed vulnerability in Django itself, we will take the
|
In the event of a confirmed vulnerability in Django itself, we will take the
|
||||||
following actions:
|
following actions:
|
||||||
|
|
||||||
* Acknowledge to the reporter that we've received the report and that a
|
* Acknowledge to the reporter that we've received the report and that a
|
||||||
fix is forthcoming. We'll give a rough timeline and ask the reporter
|
fix is forthcoming. We'll give a rough timeline and ask the reporter
|
||||||
to keep the issue confidential until we announce it.
|
to keep the issue confidential until we announce it.
|
||||||
|
|
||||||
* Focus on developing a fix as quickly as possible and produce patches
|
* Focus on developing a fix as quickly as possible and produce patches
|
||||||
against the current and two previous releases.
|
against the current and two previous releases.
|
||||||
|
|
||||||
* Determine a go-public date for announcing the vulnerability and the fix.
|
* Determine a go-public date for announcing the vulnerability and the fix.
|
||||||
To try to mitigate a possible "arms race" between those applying the
|
To try to mitigate a possible "arms race" between those applying the
|
||||||
patch and those trying to exploit the hole, we will not announce
|
patch and those trying to exploit the hole, we will not announce
|
||||||
security problems immediately.
|
security problems immediately.
|
||||||
|
|
||||||
* Pre-notify third-party distributors of Django ("vendors"). We will send
|
* Pre-notify third-party distributors of Django ("vendors"). We will send
|
||||||
these vendor notifications through private email which will include
|
these vendor notifications through private email which will include
|
||||||
documentation of the vulnerability, links to the relevant patch(es), and
|
documentation of the vulnerability, links to the relevant patch(es), and
|
||||||
a request to keep the vulnerability confidential until the official
|
a request to keep the vulnerability confidential until the official
|
||||||
go-public date.
|
go-public date.
|
||||||
|
|
||||||
* Publicly announce the vulnerability and the fix on the pre-determined
|
* Publicly announce the vulnerability and the fix on the pre-determined
|
||||||
go-public date. This will probably mean a new release of Django, but
|
go-public date. This will probably mean a new release of Django, but
|
||||||
in some cases it may simply be patches against current releases.
|
in some cases it may simply be patches against current releases.
|
||||||
|
|
||||||
|
@ -95,24 +95,24 @@ Reporting user interface bugs and features
|
||||||
If your bug or feature request touches on anything visual in nature, there
|
If your bug or feature request touches on anything visual in nature, there
|
||||||
are a few additional guidelines to follow:
|
are a few additional guidelines to follow:
|
||||||
|
|
||||||
* Include screenshots in your ticket which are the visual equivalent of a
|
* Include screenshots in your ticket which are the visual equivalent of a
|
||||||
minimal testcase. Show off the issue, not the crazy customizations
|
minimal testcase. Show off the issue, not the crazy customizations
|
||||||
you've made to your browser.
|
you've made to your browser.
|
||||||
|
|
||||||
* If the issue is difficult to show off using a still image, consider
|
* If the issue is difficult to show off using a still image, consider
|
||||||
capturing a *brief* screencast. If your software permits it, capture only
|
capturing a *brief* screencast. If your software permits it, capture only
|
||||||
the relevant area of the screen.
|
the relevant area of the screen.
|
||||||
|
|
||||||
* If you're offering a patch which changes the look or behavior of Django's
|
* If you're offering a patch which changes the look or behavior of Django's
|
||||||
UI, you **must** attach before *and* after screenshots/screencasts.
|
UI, you **must** attach before *and* after screenshots/screencasts.
|
||||||
Tickets lacking these are difficult for triagers and core developers to
|
Tickets lacking these are difficult for triagers and core developers to
|
||||||
assess quickly.
|
assess quickly.
|
||||||
|
|
||||||
* Screenshots don't absolve you of other good reporting practices. Make sure
|
* Screenshots don't absolve you of other good reporting practices. Make sure
|
||||||
to include URLs, code snippets, and step-by-step instructions on how to
|
to include URLs, code snippets, and step-by-step instructions on how to
|
||||||
reproduce the behavior visible in the screenshots.
|
reproduce the behavior visible in the screenshots.
|
||||||
|
|
||||||
* Make sure to set the UI/UX flag on the ticket so interested parties can
|
* Make sure to set the UI/UX flag on the ticket so interested parties can
|
||||||
find your ticket.
|
find your ticket.
|
||||||
|
|
||||||
Requesting features
|
Requesting features
|
||||||
|
@ -121,24 +121,24 @@ Requesting features
|
||||||
We're always trying to make Django better, and your feature requests are a key
|
We're always trying to make Django better, and your feature requests are a key
|
||||||
part of that. Here are some tips on how to make a request most effectively:
|
part of that. Here are some tips on how to make a request most effectively:
|
||||||
|
|
||||||
* Make sure the feature actually requires changes in Django's core. If your
|
* Make sure the feature actually requires changes in Django's core. If your
|
||||||
idea can be developed as an independent application or module — for
|
idea can be developed as an independent application or module — for
|
||||||
instance, you want to support another database engine — we'll probably
|
instance, you want to support another database engine — we'll probably
|
||||||
suggest that you to develop it independently. Then, if your project
|
suggest that you to develop it independently. Then, if your project
|
||||||
gathers sufficient community support, we may consider it for inclusion in
|
gathers sufficient community support, we may consider it for inclusion in
|
||||||
Django.
|
Django.
|
||||||
|
|
||||||
* First request the feature on the `django-developers`_ list, not in the
|
* First request the feature on the `django-developers`_ list, not in the
|
||||||
ticket tracker. It'll get read more closely if it's on the mailing list.
|
ticket tracker. It'll get read more closely if it's on the mailing list.
|
||||||
This is even more important for large-scale feature requests. We like to
|
This is even more important for large-scale feature requests. We like to
|
||||||
discuss any big changes to Django's core on the mailing list before
|
discuss any big changes to Django's core on the mailing list before
|
||||||
actually working on them.
|
actually working on them.
|
||||||
|
|
||||||
* Describe clearly and concisely what the missing feature is and how you'd
|
* Describe clearly and concisely what the missing feature is and how you'd
|
||||||
like to see it implemented. Include example code (non-functional is OK)
|
like to see it implemented. Include example code (non-functional is OK)
|
||||||
if possible.
|
if possible.
|
||||||
|
|
||||||
* Explain *why* you'd like the feature. In some cases this is obvious, but
|
* Explain *why* you'd like the feature. In some cases this is obvious, but
|
||||||
since Django is designed to help real developers get real work done,
|
since Django is designed to help real developers get real work done,
|
||||||
you'll need to explain it, if it isn't obvious why the feature would be
|
you'll need to explain it, if it isn't obvious why the feature would be
|
||||||
useful.
|
useful.
|
||||||
|
@ -165,13 +165,13 @@ have informal votes on `django-developers`_ about a feature. In these votes we
|
||||||
follow the voting style invented by Apache and used on Python itself, where
|
follow the voting style invented by Apache and used on Python itself, where
|
||||||
votes are given as +1, +0, -0, or -1. Roughly translated, these votes mean:
|
votes are given as +1, +0, -0, or -1. Roughly translated, these votes mean:
|
||||||
|
|
||||||
* +1: "I love the idea and I'm strongly committed to it."
|
* +1: "I love the idea and I'm strongly committed to it."
|
||||||
|
|
||||||
* +0: "Sounds OK to me."
|
* +0: "Sounds OK to me."
|
||||||
|
|
||||||
* -0: "I'm not thrilled, but I won't stand in the way."
|
* -0: "I'm not thrilled, but I won't stand in the way."
|
||||||
|
|
||||||
* -1: "I strongly disagree and would be very unhappy to see the idea turn
|
* -1: "I strongly disagree and would be very unhappy to see the idea turn
|
||||||
into reality."
|
into reality."
|
||||||
|
|
||||||
Although these votes on `django-developers`_ are informal, they'll be taken very
|
Although these votes on `django-developers`_ are informal, they'll be taken very
|
||||||
|
@ -186,11 +186,11 @@ Any :doc:`core committer</internals/committers>` may call for a formal vote
|
||||||
using the same voting mechanism above. A proposition will be considered carried
|
using the same voting mechanism above. A proposition will be considered carried
|
||||||
by the core team if:
|
by the core team if:
|
||||||
|
|
||||||
* There are three "+1" votes from members of the core team.
|
* There are three "+1" votes from members of the core team.
|
||||||
|
|
||||||
* There is no "-1" vote from any member of the core team.
|
* There is no "-1" vote from any member of the core team.
|
||||||
|
|
||||||
* The :ref:`BDFLs<django-bdfls>` haven't stepped in and executed their
|
* The :ref:`BDFLs<django-bdfls>` haven't stepped in and executed their
|
||||||
positive or negative veto.
|
positive or negative veto.
|
||||||
|
|
||||||
When calling for a vote, the caller should specify a deadline by which
|
When calling for a vote, the caller should specify a deadline by which
|
||||||
|
|
|
@ -38,7 +38,7 @@ Committing guidelines
|
||||||
Please follow these guidelines when committing code to Django's Subversion
|
Please follow these guidelines when committing code to Django's Subversion
|
||||||
repository:
|
repository:
|
||||||
|
|
||||||
* For any medium-to-big changes, where "medium-to-big" is according to
|
* For any medium-to-big changes, where "medium-to-big" is according to
|
||||||
your judgment, please bring things up on the `django-developers`_
|
your judgment, please bring things up on the `django-developers`_
|
||||||
mailing list before making the change.
|
mailing list before making the change.
|
||||||
|
|
||||||
|
@ -49,28 +49,28 @@ repository:
|
||||||
immediately, so you may have to wait a couple of days before getting a
|
immediately, so you may have to wait a couple of days before getting a
|
||||||
response.
|
response.
|
||||||
|
|
||||||
* Write detailed commit messages in the past tense, not present tense.
|
* Write detailed commit messages in the past tense, not present tense.
|
||||||
|
|
||||||
* Good: "Fixed Unicode bug in RSS API."
|
* Good: "Fixed Unicode bug in RSS API."
|
||||||
* Bad: "Fixes Unicode bug in RSS API."
|
* Bad: "Fixes Unicode bug in RSS API."
|
||||||
* Bad: "Fixing Unicode bug in RSS API."
|
* Bad: "Fixing Unicode bug in RSS API."
|
||||||
|
|
||||||
* For commits to a branch, prefix the commit message with the branch name.
|
* For commits to a branch, prefix the commit message with the branch name.
|
||||||
For example: "magic-removal: Added support for mind reading."
|
For example: "magic-removal: Added support for mind reading."
|
||||||
|
|
||||||
* Limit commits to the most granular change that makes sense. This means,
|
* Limit commits to the most granular change that makes sense. This means,
|
||||||
use frequent small commits rather than infrequent large commits. For
|
use frequent small commits rather than infrequent large commits. For
|
||||||
example, if implementing feature X requires a small change to library Y,
|
example, if implementing feature X requires a small change to library Y,
|
||||||
first commit the change to library Y, then commit feature X in a
|
first commit the change to library Y, then commit feature X in a
|
||||||
separate commit. This goes a *long way* in helping all core Django
|
separate commit. This goes a *long way* in helping all core Django
|
||||||
developers follow your changes.
|
developers follow your changes.
|
||||||
|
|
||||||
* Separate bug fixes from feature changes.
|
* Separate bug fixes from feature changes.
|
||||||
|
|
||||||
Bug fixes need to be added to the current bugfix branch as well as the
|
Bug fixes need to be added to the current bugfix branch as well as the
|
||||||
current trunk.
|
current trunk.
|
||||||
|
|
||||||
* If your commit closes a ticket in the Django `ticket tracker`_, begin
|
* If your commit closes a ticket in the Django `ticket tracker`_, begin
|
||||||
your commit message with the text "Fixed #abc", where "abc" is the
|
your commit message with the text "Fixed #abc", where "abc" is the
|
||||||
number of the ticket your commit fixes. Example: "Fixed #123 -- Added
|
number of the ticket your commit fixes. Example: "Fixed #123 -- Added
|
||||||
support for foo". We've rigged Subversion and Trac so that any commit
|
support for foo". We've rigged Subversion and Trac so that any commit
|
||||||
|
@ -85,7 +85,7 @@ repository:
|
||||||
|
|
||||||
.. _Trac post-commit hook: http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook
|
.. _Trac post-commit hook: http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook
|
||||||
|
|
||||||
* If your commit references a ticket in the Django `ticket tracker`_ but
|
* If your commit references a ticket in the Django `ticket tracker`_ but
|
||||||
does *not* close the ticket, include the phrase "Refs #abc", where "abc"
|
does *not* close the ticket, include the phrase "Refs #abc", where "abc"
|
||||||
is the number of the ticket your commit references. We've rigged
|
is the number of the ticket your commit references. We've rigged
|
||||||
Subversion and Trac so that any commit message in that format will
|
Subversion and Trac so that any commit message in that format will
|
||||||
|
@ -97,34 +97,34 @@ Reverting commits
|
||||||
Nobody's perfect; mistakes will be committed. When a mistaken commit is
|
Nobody's perfect; mistakes will be committed. When a mistaken commit is
|
||||||
discovered, please follow these guidelines:
|
discovered, please follow these guidelines:
|
||||||
|
|
||||||
* Try very hard to ensure that mistakes don't happen. Just because we
|
* Try very hard to ensure that mistakes don't happen. Just because we
|
||||||
have a reversion policy doesn't relax your responsibility to aim for
|
have a reversion policy doesn't relax your responsibility to aim for
|
||||||
the highest quality possible. Really: double-check your work before
|
the highest quality possible. Really: double-check your work before
|
||||||
you commit it in the first place!
|
you commit it in the first place!
|
||||||
|
|
||||||
* If possible, have the original author revert his/her own commit.
|
* If possible, have the original author revert his/her own commit.
|
||||||
|
|
||||||
* Don't revert another author's changes without permission from the
|
* Don't revert another author's changes without permission from the
|
||||||
original author.
|
original author.
|
||||||
|
|
||||||
* If the original author can't be reached (within a reasonable amount
|
* If the original author can't be reached (within a reasonable amount
|
||||||
of time -- a day or so) and the problem is severe -- crashing bug,
|
of time -- a day or so) and the problem is severe -- crashing bug,
|
||||||
major test failures, etc -- then ask for objections on the
|
major test failures, etc -- then ask for objections on the
|
||||||
`django-developers`_ mailing list then revert if there are none.
|
`django-developers`_ mailing list then revert if there are none.
|
||||||
|
|
||||||
* If the problem is small (a feature commit after feature freeze,
|
* If the problem is small (a feature commit after feature freeze,
|
||||||
say), wait it out.
|
say), wait it out.
|
||||||
|
|
||||||
* If there's a disagreement between the committer and the
|
* If there's a disagreement between the committer and the
|
||||||
reverter-to-be then try to work it out on the `django-developers`_
|
reverter-to-be then try to work it out on the `django-developers`_
|
||||||
mailing list. If an agreement can't be reached then it should
|
mailing list. If an agreement can't be reached then it should
|
||||||
be put to a vote.
|
be put to a vote.
|
||||||
|
|
||||||
* If the commit introduced a confirmed, disclosed security
|
* If the commit introduced a confirmed, disclosed security
|
||||||
vulnerability then the commit may be reverted immediately without
|
vulnerability then the commit may be reverted immediately without
|
||||||
permission from anyone.
|
permission from anyone.
|
||||||
|
|
||||||
* The release branch maintainer may back out commits to the release
|
* The release branch maintainer may back out commits to the release
|
||||||
branch without permission if the commit breaks the release branch.
|
branch without permission if the commit breaks the release branch.
|
||||||
|
|
||||||
.. _django-developers: http://groups.google.com/group/django-developers
|
.. _django-developers: http://groups.google.com/group/django-developers
|
||||||
|
|
|
@ -6,20 +6,20 @@ Django is a community that lives on its volunteers. As it keeps growing, we
|
||||||
always need more people to help others. As soon as you learn Django, you can
|
always need more people to help others. As soon as you learn Django, you can
|
||||||
contribute in many ways:
|
contribute in many ways:
|
||||||
|
|
||||||
* Join the `django-users`_ mailing list and answer questions. This
|
* Join the `django-users`_ mailing list and answer questions. This
|
||||||
mailing list has a huge audience, and we really want to maintain a
|
mailing list has a huge audience, and we really want to maintain a
|
||||||
friendly and helpful atmosphere. If you're new to the Django community,
|
friendly and helpful atmosphere. If you're new to the Django community,
|
||||||
you should read the `posting guidelines`_.
|
you should read the `posting guidelines`_.
|
||||||
|
|
||||||
* Join the `#django IRC channel`_ on Freenode and answer questions. By
|
* Join the `#django IRC channel`_ on Freenode and answer questions. By
|
||||||
explaining Django to other users, you're going to learn a lot about the
|
explaining Django to other users, you're going to learn a lot about the
|
||||||
framework yourself.
|
framework yourself.
|
||||||
|
|
||||||
* Blog about Django. We syndicate all the Django blogs we know about on
|
* Blog about Django. We syndicate all the Django blogs we know about on
|
||||||
the `community page`_; if you'd like to see your blog on that page you
|
the `community page`_; if you'd like to see your blog on that page you
|
||||||
can `register it here`_.
|
can `register it here`_.
|
||||||
|
|
||||||
* Contribute to open-source Django projects, write some documentation, or
|
* Contribute to open-source Django projects, write some documentation, or
|
||||||
release your own code as an open-source pluggable application. The
|
release your own code as an open-source pluggable application. The
|
||||||
ecosystem of pluggable applications is a big strength of Django, help us
|
ecosystem of pluggable applications is a big strength of Django, help us
|
||||||
build it!
|
build it!
|
||||||
|
@ -29,19 +29,19 @@ it. We're passionate about helping Django users make the jump to contributing
|
||||||
members of the community, so there are several ways you can help Django's
|
members of the community, so there are several ways you can help Django's
|
||||||
development:
|
development:
|
||||||
|
|
||||||
* :doc:`Report bugs <bugs-and-features>` in our `ticket tracker`_.
|
* :doc:`Report bugs <bugs-and-features>` in our `ticket tracker`_.
|
||||||
|
|
||||||
* Join the `django-developers`_ mailing list and share your ideas for how
|
* Join the `django-developers`_ mailing list and share your ideas for how
|
||||||
to improve Django. We're always open to suggestions.
|
to improve Django. We're always open to suggestions.
|
||||||
|
|
||||||
* :doc:`Submit patches <writing-code/submitting-patches>` for new and/or
|
* :doc:`Submit patches <writing-code/submitting-patches>` for new and/or
|
||||||
fixed behavior. If you're looking for an easy way to start contributing
|
fixed behavior. If you're looking for an easy way to start contributing
|
||||||
to Django have a look at the `easy pickings`_ tickets.
|
to Django have a look at the `easy pickings`_ tickets.
|
||||||
|
|
||||||
* :doc:`Improve the documentation <writing-documentation>` or
|
* :doc:`Improve the documentation <writing-documentation>` or
|
||||||
:doc:`write unit tests <writing-code/unit-tests>`.
|
:doc:`write unit tests <writing-code/unit-tests>`.
|
||||||
|
|
||||||
* :doc:`Triage tickets and review patches <triaging-tickets>` created by
|
* :doc:`Triage tickets and review patches <triaging-tickets>` created by
|
||||||
other users.
|
other users.
|
||||||
|
|
||||||
Really, **ANYONE** can do something to help make Django better and greater!
|
Really, **ANYONE** can do something to help make Django better and greater!
|
||||||
|
|
|
@ -19,24 +19,24 @@ go to the `translation team`_ page for that language. If you would like to help
|
||||||
out with translating or add a language that isn't yet translated, here's what to
|
out with translating or add a language that isn't yet translated, here's what to
|
||||||
do:
|
do:
|
||||||
|
|
||||||
* Join the `Django i18n mailing list`_ and introduce yourself.
|
* Join the `Django i18n mailing list`_ and introduce yourself.
|
||||||
|
|
||||||
* Make sure you read the notes about :ref:`specialties-of-django-i18n`.
|
* Make sure you read the notes about :ref:`specialties-of-django-i18n`.
|
||||||
|
|
||||||
* Signup at `Transifex`_ and visit the `Django project page`_.
|
* Signup at `Transifex`_ and visit the `Django project page`_.
|
||||||
|
|
||||||
* On the `translation teams`_ page, choose the language team you want
|
* On the `translation teams`_ page, choose the language team you want
|
||||||
to work with, **or** -- in case the language team doesn't exist yet --
|
to work with, **or** -- in case the language team doesn't exist yet --
|
||||||
request a new team by clicking on the "Request a new team" button
|
request a new team by clicking on the "Request a new team" button
|
||||||
and select the appropriate language.
|
and select the appropriate language.
|
||||||
|
|
||||||
* Then, click the "Join this Team" button to become a member of this team.
|
* Then, click the "Join this Team" button to become a member of this team.
|
||||||
Every team has at least one coordinator who is responsible to review
|
Every team has at least one coordinator who is responsible to review
|
||||||
your membership request. You can of course also contact the team
|
your membership request. You can of course also contact the team
|
||||||
coordinator to clarify procedural problems and handle the actual
|
coordinator to clarify procedural problems and handle the actual
|
||||||
translation process.
|
translation process.
|
||||||
|
|
||||||
* Once you are a member of a team choose the translation resource you
|
* Once you are a member of a team choose the translation resource you
|
||||||
want to update on the team page. For example the "core" resource refers
|
want to update on the team page. For example the "core" resource refers
|
||||||
to the translation catalogue that contains all non-contrib translations.
|
to the translation catalogue that contains all non-contrib translations.
|
||||||
Each of the contrib apps also have a resource (prefixed with "contrib").
|
Each of the contrib apps also have a resource (prefixed with "contrib").
|
||||||
|
@ -55,9 +55,9 @@ the date, time and numbers formatting particularities of your locale. See
|
||||||
The format files aren't managed by the use of Transifex. To change them, you
|
The format files aren't managed by the use of Transifex. To change them, you
|
||||||
must :doc:`create a patch<writing-code/submitting-patches>` against the Django source tree, as for any code change:
|
must :doc:`create a patch<writing-code/submitting-patches>` against the Django source tree, as for any code change:
|
||||||
|
|
||||||
* Create a diff against the current Subversion trunk.
|
* Create a diff against the current Subversion trunk.
|
||||||
|
|
||||||
* Open a ticket in Django's ticket system, set its ``Component`` field to
|
* Open a ticket in Django's ticket system, set its ``Component`` field to
|
||||||
``Translations``, and attach the patch to it.
|
``Translations``, and attach the patch to it.
|
||||||
|
|
||||||
.. _Transifex: http://www.transifex.net/
|
.. _Transifex: http://www.transifex.net/
|
||||||
|
|
|
@ -57,12 +57,12 @@ Since a picture is worth a thousand words, let's start there:
|
||||||
|
|
||||||
We've got two roles in this diagram:
|
We've got two roles in this diagram:
|
||||||
|
|
||||||
* :doc:`Committers</internals/committers>` (also called core developers):
|
* :doc:`Committers</internals/committers>` (also called core developers):
|
||||||
people with commit access who are responsible for making the big
|
people with commit access who are responsible for making the big
|
||||||
decisions, writing large portions of the code and integrating the
|
decisions, writing large portions of the code and integrating the
|
||||||
contributions of the community.
|
contributions of the community.
|
||||||
|
|
||||||
* Ticket triagers: anyone in the Django community who chooses to
|
* Ticket triagers: anyone in the Django community who chooses to
|
||||||
become involved in Django's development process. Our Trac installation
|
become involved in Django's development process. Our Trac installation
|
||||||
is intentionally left open to the public, and anyone can triage tickets.
|
is intentionally left open to the public, and anyone can triage tickets.
|
||||||
Django is a community project, and we encourage :ref:`triage by the
|
Django is a community project, and we encourage :ref:`triage by the
|
||||||
|
@ -185,34 +185,38 @@ Other triage attributes
|
||||||
|
|
||||||
A number of flags, appearing as checkboxes in Trac, can be set on a ticket:
|
A number of flags, appearing as checkboxes in Trac, can be set on a ticket:
|
||||||
|
|
||||||
* Has patch
|
* Has patch
|
||||||
This means the ticket has an associated
|
This means the ticket has an associated
|
||||||
:doc:`patch<writing-code/submitting-patches>`. These will be reviewed
|
:doc:`patch<writing-code/submitting-patches>`. These will be reviewed
|
||||||
to see if the patch is "good".
|
to see if the patch is "good".
|
||||||
* Needs documentation:
|
|
||||||
|
* Needs documentation:
|
||||||
This flag is used for tickets with patches that need associated
|
This flag is used for tickets with patches that need associated
|
||||||
documentation. Complete documentation of features is a prerequisite
|
documentation. Complete documentation of features is a prerequisite
|
||||||
before we can check them into the codebase.
|
before we can check them into the codebase.
|
||||||
* Needs tests
|
|
||||||
|
* Needs tests
|
||||||
This flags the patch as needing associated unit tests. Again, this
|
This flags the patch as needing associated unit tests. Again, this
|
||||||
is a required part of a valid patch.
|
is a required part of a valid patch.
|
||||||
* Patch needs improvement
|
|
||||||
|
* Patch needs improvement
|
||||||
This flag means that although the ticket *has* a patch, it's not quite
|
This flag means that although the ticket *has* a patch, it's not quite
|
||||||
ready for checkin. This could mean the patch no longer applies
|
ready for checkin. This could mean the patch no longer applies
|
||||||
cleanly, there is a flaw in the implementation, or that the code
|
cleanly, there is a flaw in the implementation, or that the code
|
||||||
doesn't meet our standards.
|
doesn't meet our standards.
|
||||||
* Easy pickings
|
|
||||||
|
* Easy pickings
|
||||||
Tickets that would require small, easy, patches.
|
Tickets that would require small, easy, patches.
|
||||||
|
|
||||||
Tickets should be categorized by *type* between:
|
Tickets should be categorized by *type* between:
|
||||||
|
|
||||||
* New Feature
|
* New Feature
|
||||||
For adding something new.
|
For adding something new.
|
||||||
|
|
||||||
* Bug
|
* Bug
|
||||||
For when an existing thing is broken or not behaving as expected.
|
For when an existing thing is broken or not behaving as expected.
|
||||||
|
|
||||||
* Cleanup/optimization
|
* Cleanup/optimization
|
||||||
For when nothing is broken but something could be made cleaner,
|
For when nothing is broken but something could be made cleaner,
|
||||||
better, faster, stronger.
|
better, faster, stronger.
|
||||||
|
|
||||||
|
@ -243,18 +247,18 @@ leave a comment with your thoughts instead.
|
||||||
|
|
||||||
If you do close a ticket, you should always make sure of the following:
|
If you do close a ticket, you should always make sure of the following:
|
||||||
|
|
||||||
* Be certain that the issue is resolved.
|
* Be certain that the issue is resolved.
|
||||||
|
|
||||||
* Leave a comment explaining the decision to close the ticket.
|
* Leave a comment explaining the decision to close the ticket.
|
||||||
|
|
||||||
* If there is a way they can improve the ticket to reopen it, let them know.
|
* If there is a way they can improve the ticket to reopen it, let them know.
|
||||||
|
|
||||||
* If the ticket is a duplicate, reference the original ticket. Also
|
* If the ticket is a duplicate, reference the original ticket. Also
|
||||||
cross-reference the closed ticket by leaving a comment in the original one
|
cross-reference the closed ticket by leaving a comment in the original one
|
||||||
-- this allows to access more related information about the reported bug
|
-- this allows to access more related information about the reported bug
|
||||||
or requested feature.
|
or requested feature.
|
||||||
|
|
||||||
* **Be polite.** No one likes having their ticket closed. It can be
|
* **Be polite.** No one likes having their ticket closed. It can be
|
||||||
frustrating or even discouraging. The best way to avoid turning people
|
frustrating or even discouraging. The best way to avoid turning people
|
||||||
off from contributing to Django is to be polite and friendly and to offer
|
off from contributing to Django is to be polite and friendly and to offer
|
||||||
suggestions for how they could improve this ticket and other tickets in
|
suggestions for how they could improve this ticket and other tickets in
|
||||||
|
@ -262,18 +266,18 @@ If you do close a ticket, you should always make sure of the following:
|
||||||
|
|
||||||
A ticket can be resolved in a number of ways:
|
A ticket can be resolved in a number of ways:
|
||||||
|
|
||||||
* fixed
|
* fixed
|
||||||
Used by the core developers once a patch has been rolled into
|
Used by the core developers once a patch has been rolled into
|
||||||
Django and the issue is fixed.
|
Django and the issue is fixed.
|
||||||
|
|
||||||
* invalid
|
* invalid
|
||||||
Used if the ticket is found to be incorrect. This means that the
|
Used if the ticket is found to be incorrect. This means that the
|
||||||
issue in the ticket is actually the result of a user error, or
|
issue in the ticket is actually the result of a user error, or
|
||||||
describes a problem with something other than Django, or isn't
|
describes a problem with something other than Django, or isn't
|
||||||
a bug report or feature request at all (for example, some new users
|
a bug report or feature request at all (for example, some new users
|
||||||
submit support queries as tickets).
|
submit support queries as tickets).
|
||||||
|
|
||||||
* wontfix
|
* wontfix
|
||||||
Used when a core developer decides that this request is not
|
Used when a core developer decides that this request is not
|
||||||
appropriate for consideration in Django. This is usually chosen after
|
appropriate for consideration in Django. This is usually chosen after
|
||||||
discussion in the `django-developers`_ mailing list. Feel free to
|
discussion in the `django-developers`_ mailing list. Feel free to
|
||||||
|
@ -281,16 +285,16 @@ A ticket can be resolved in a number of ways:
|
||||||
django-developers_ mailing list, but please do not reopen tickets
|
django-developers_ mailing list, but please do not reopen tickets
|
||||||
closed as "wontfix" by a :doc:`core developer</internals/committers>`.
|
closed as "wontfix" by a :doc:`core developer</internals/committers>`.
|
||||||
|
|
||||||
* duplicate
|
* duplicate
|
||||||
Used when another ticket covers the same issue. By closing duplicate
|
Used when another ticket covers the same issue. By closing duplicate
|
||||||
tickets, we keep all the discussion in one place, which helps
|
tickets, we keep all the discussion in one place, which helps
|
||||||
everyone.
|
everyone.
|
||||||
|
|
||||||
* worksforme
|
* worksforme
|
||||||
Used when the ticket doesn't contain enough detail to replicate
|
Used when the ticket doesn't contain enough detail to replicate
|
||||||
the original bug.
|
the original bug.
|
||||||
|
|
||||||
* needsinfo
|
* needsinfo
|
||||||
Used when the ticket does not contain enough information to replicate
|
Used when the ticket does not contain enough information to replicate
|
||||||
the reported issue but is potentially still valid. The ticket
|
the reported issue but is potentially still valid. The ticket
|
||||||
should be reopened when more information is supplied.
|
should be reopened when more information is supplied.
|
||||||
|
@ -315,35 +319,35 @@ forgotten your password, you can reset it using the `password reset page`_.
|
||||||
|
|
||||||
Then, you can help out by:
|
Then, you can help out by:
|
||||||
|
|
||||||
* Closing "Unreviewed" tickets as "invalid", "worksforme" or "duplicate."
|
* Closing "Unreviewed" tickets as "invalid", "worksforme" or "duplicate."
|
||||||
|
|
||||||
* Promoting "Unreviewed" tickets to "Design decision needed" if a design
|
* Promoting "Unreviewed" tickets to "Design decision needed" if a design
|
||||||
decision needs to be made, or "Accepted" in case of obvious bugs or
|
decision needs to be made, or "Accepted" in case of obvious bugs or
|
||||||
sensible, clearly defined, feature requests.
|
sensible, clearly defined, feature requests.
|
||||||
|
|
||||||
* Correcting the "Needs tests", "Needs documentation", or "Has patch"
|
* Correcting the "Needs tests", "Needs documentation", or "Has patch"
|
||||||
flags for tickets where they are incorrectly set.
|
flags for tickets where they are incorrectly set.
|
||||||
|
|
||||||
* Setting the "`Easy pickings`_" flag for tickets that are small and
|
* Setting the "`Easy pickings`_" flag for tickets that are small and
|
||||||
relatively straightforward.
|
relatively straightforward.
|
||||||
|
|
||||||
* Checking that old tickets are still valid. If a ticket hasn't seen
|
* Checking that old tickets are still valid. If a ticket hasn't seen
|
||||||
any activity in a long time, it's possible that the problem has been
|
any activity in a long time, it's possible that the problem has been
|
||||||
fixed but the ticket hasn't yet been closed.
|
fixed but the ticket hasn't yet been closed.
|
||||||
|
|
||||||
* Contacting the owners of tickets that have been claimed but have not
|
* Contacting the owners of tickets that have been claimed but have not
|
||||||
seen any recent activity. If the owner doesn't respond after a week
|
seen any recent activity. If the owner doesn't respond after a week
|
||||||
or so, remove the owner's claim on the ticket.
|
or so, remove the owner's claim on the ticket.
|
||||||
|
|
||||||
* Identifying trends and themes in the tickets. If there a lot of bug
|
* Identifying trends and themes in the tickets. If there a lot of bug
|
||||||
reports about a particular part of Django, it may indicate we should
|
reports about a particular part of Django, it may indicate we should
|
||||||
consider refactoring that part of the code. If a trend is emerging,
|
consider refactoring that part of the code. If a trend is emerging,
|
||||||
you should raise it for discussion (referencing the relevant tickets)
|
you should raise it for discussion (referencing the relevant tickets)
|
||||||
on `django-developers`_.
|
on `django-developers`_.
|
||||||
|
|
||||||
* Set the *type* of tickets that are still uncategorized.
|
* Set the *type* of tickets that are still uncategorized.
|
||||||
|
|
||||||
* Verify if patches submitted by other users are correct. If they do and
|
* Verify if patches submitted by other users are correct. If they do and
|
||||||
also contain appropriate documentation and tests then move them to the
|
also contain appropriate documentation and tests then move them to the
|
||||||
"Ready for Checkin" stage. If they don't then leave a comment to explain
|
"Ready for Checkin" stage. If they don't then leave a comment to explain
|
||||||
why and set the corresponding flags ("Patch needs improvement",
|
why and set the corresponding flags ("Patch needs improvement",
|
||||||
|
@ -362,20 +366,20 @@ Then, you can help out by:
|
||||||
However, we do ask the following of all general community members working in
|
However, we do ask the following of all general community members working in
|
||||||
the ticket database:
|
the ticket database:
|
||||||
|
|
||||||
* Please **don't** close tickets as "wontfix." The core developers will
|
* Please **don't** close tickets as "wontfix." The core developers will
|
||||||
make the final determination of the fate of a ticket, usually after
|
make the final determination of the fate of a ticket, usually after
|
||||||
consultation with the community.
|
consultation with the community.
|
||||||
|
|
||||||
* Please **don't** promote your own tickets to "Ready for checkin". You
|
* Please **don't** promote your own tickets to "Ready for checkin". You
|
||||||
may mark other people's tickets which you've reviewed as "Ready for
|
may mark other people's tickets which you've reviewed as "Ready for
|
||||||
checkin", but you should get at minimum one other community member to
|
checkin", but you should get at minimum one other community member to
|
||||||
review a patch that you submit.
|
review a patch that you submit.
|
||||||
|
|
||||||
* Please **don't** reverse a decision that has been made by a :doc:`core
|
* Please **don't** reverse a decision that has been made by a :doc:`core
|
||||||
developer</internals/committers>`. If you disagree with a decision that
|
developer</internals/committers>`. If you disagree with a decision that
|
||||||
has been made, please post a message to `django-developers`_.
|
has been made, please post a message to `django-developers`_.
|
||||||
|
|
||||||
* If you're unsure if you should be making a change, don't make the
|
* If you're unsure if you should be making a change, don't make the
|
||||||
change but instead leave a comment with your concerns on the ticket,
|
change but instead leave a comment with your concerns on the ticket,
|
||||||
or post a message to `django-developers`_. It's okay to be unsure,
|
or post a message to `django-developers`_. It's okay to be unsure,
|
||||||
but your input is still valuable.
|
but your input is still valuable.
|
||||||
|
|
|
@ -14,7 +14,7 @@ take more than a single patch, or requires large-scale refactoring -- you need
|
||||||
to do it on a feature branch. Our development process recognizes two options
|
to do it on a feature branch. Our development process recognizes two options
|
||||||
for feature branches:
|
for feature branches:
|
||||||
|
|
||||||
1. Feature branches using a distributed revision control system like
|
1. Feature branches using a distributed revision control system like
|
||||||
Git_, Mercurial_, Bazaar_, etc.
|
Git_, Mercurial_, Bazaar_, etc.
|
||||||
|
|
||||||
If you're familiar with one of these tools, this is probably your best
|
If you're familiar with one of these tools, this is probably your best
|
||||||
|
@ -31,7 +31,7 @@ for feature branches:
|
||||||
make it public, please add the branch to the `Django branches`_ wiki
|
make it public, please add the branch to the `Django branches`_ wiki
|
||||||
page.
|
page.
|
||||||
|
|
||||||
2. Feature branches using SVN have a higher bar. If you want a branch
|
2. Feature branches using SVN have a higher bar. If you want a branch
|
||||||
in SVN itself, you'll need a "mentor" among the :doc:`core committers
|
in SVN itself, you'll need a "mentor" among the :doc:`core committers
|
||||||
</internals/committers>`. This person is responsible for actually
|
</internals/committers>`. This person is responsible for actually
|
||||||
creating the branch, monitoring your process (see below), and
|
creating the branch, monitoring your process (see below), and
|
||||||
|
@ -60,11 +60,11 @@ Developers with branches in SVN, however, **must** follow these rules. The
|
||||||
branch mentor will keep on eye on the branch and **will delete it** if these
|
branch mentor will keep on eye on the branch and **will delete it** if these
|
||||||
rules are broken.
|
rules are broken.
|
||||||
|
|
||||||
* Only branch entire copies of the Django tree, even if work is only
|
* Only branch entire copies of the Django tree, even if work is only
|
||||||
happening on part of that tree. This makes it painless to switch to a
|
happening on part of that tree. This makes it painless to switch to a
|
||||||
branch.
|
branch.
|
||||||
|
|
||||||
* Merge changes from trunk no less than once a week, and preferably every
|
* Merge changes from trunk no less than once a week, and preferably every
|
||||||
couple-three days.
|
couple-three days.
|
||||||
|
|
||||||
In our experience, doing regular trunk merges is often the difference
|
In our experience, doing regular trunk merges is often the difference
|
||||||
|
@ -73,7 +73,7 @@ rules are broken.
|
||||||
If you're working on an SVN branch, you should be using `svnmerge.py`_
|
If you're working on an SVN branch, you should be using `svnmerge.py`_
|
||||||
to track merges from trunk.
|
to track merges from trunk.
|
||||||
|
|
||||||
* Keep tests passing and documentation up-to-date. As with patches,
|
* Keep tests passing and documentation up-to-date. As with patches,
|
||||||
we'll only merge a branch that comes with tests and documentation.
|
we'll only merge a branch that comes with tests and documentation.
|
||||||
|
|
||||||
.. _svnmerge.py: http://www.orcaware.com/svn/wiki/Svnmerge.py
|
.. _svnmerge.py: http://www.orcaware.com/svn/wiki/Svnmerge.py
|
||||||
|
@ -91,9 +91,9 @@ Using branches
|
||||||
|
|
||||||
To use a branch, you'll need to do two things:
|
To use a branch, you'll need to do two things:
|
||||||
|
|
||||||
* Get the branch's code through Subversion.
|
* Get the branch's code through Subversion.
|
||||||
|
|
||||||
* Point your Python ``site-packages`` directory at the branch's version of
|
* Point your Python ``site-packages`` directory at the branch's version of
|
||||||
the ``django`` package rather than the version you already have
|
the ``django`` package rather than the version you already have
|
||||||
installed.
|
installed.
|
||||||
|
|
||||||
|
|
|
@ -7,21 +7,21 @@ Please follow these coding standards when writing code for inclusion in Django.
|
||||||
Python style
|
Python style
|
||||||
------------
|
------------
|
||||||
|
|
||||||
* Unless otherwise specified, follow :pep:`8`.
|
* Unless otherwise specified, follow :pep:`8`.
|
||||||
|
|
||||||
You could use a tool like `pep8`_ to check for some problems in this
|
You could use a tool like `pep8`_ to check for some problems in this
|
||||||
area, but remember that :pep:`8` is only a guide, so respect the style of
|
area, but remember that :pep:`8` is only a guide, so respect the style of
|
||||||
the surrounding code as a primary goal.
|
the surrounding code as a primary goal.
|
||||||
|
|
||||||
* Use four spaces for indentation.
|
* Use four spaces for indentation.
|
||||||
|
|
||||||
* Use underscores, not camelCase, for variable, function and method names
|
* Use underscores, not camelCase, for variable, function and method names
|
||||||
(i.e. ``poll.get_unique_voters()``, not ``poll.getUniqueVoters``).
|
(i.e. ``poll.get_unique_voters()``, not ``poll.getUniqueVoters``).
|
||||||
|
|
||||||
* Use ``InitialCaps`` for class names (or for factory functions that
|
* Use ``InitialCaps`` for class names (or for factory functions that
|
||||||
return classes).
|
return classes).
|
||||||
|
|
||||||
* In docstrings, use "action words" such as::
|
* In docstrings, use "action words" such as::
|
||||||
|
|
||||||
def foo():
|
def foo():
|
||||||
"""
|
"""
|
||||||
|
@ -40,7 +40,7 @@ Python style
|
||||||
Template style
|
Template style
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
* In Django template code, put one (and only one) space between the curly
|
* In Django template code, put one (and only one) space between the curly
|
||||||
brackets and the tag contents.
|
brackets and the tag contents.
|
||||||
|
|
||||||
Do this:
|
Do this:
|
||||||
|
@ -58,7 +58,7 @@ Template style
|
||||||
View style
|
View style
|
||||||
----------
|
----------
|
||||||
|
|
||||||
* In Django views, the first parameter in a view function should be called
|
* In Django views, the first parameter in a view function should be called
|
||||||
``request``.
|
``request``.
|
||||||
|
|
||||||
Do this::
|
Do this::
|
||||||
|
@ -74,7 +74,7 @@ View style
|
||||||
Model style
|
Model style
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
* Field names should be all lowercase, using underscores instead of
|
* Field names should be all lowercase, using underscores instead of
|
||||||
camelCase.
|
camelCase.
|
||||||
|
|
||||||
Do this::
|
Do this::
|
||||||
|
@ -89,7 +89,7 @@ Model style
|
||||||
FirstName = models.CharField(max_length=20)
|
FirstName = models.CharField(max_length=20)
|
||||||
Last_Name = models.CharField(max_length=40)
|
Last_Name = models.CharField(max_length=40)
|
||||||
|
|
||||||
* The ``class Meta`` should appear *after* the fields are defined, with
|
* The ``class Meta`` should appear *after* the fields are defined, with
|
||||||
a single blank line separating the fields and the class definition.
|
a single blank line separating the fields and the class definition.
|
||||||
|
|
||||||
Do this::
|
Do this::
|
||||||
|
@ -118,7 +118,7 @@ Model style
|
||||||
first_name = models.CharField(max_length=20)
|
first_name = models.CharField(max_length=20)
|
||||||
last_name = models.CharField(max_length=40)
|
last_name = models.CharField(max_length=40)
|
||||||
|
|
||||||
* The order of model inner classes and standard methods should be as
|
* The order of model inner classes and standard methods should be as
|
||||||
follows (noting that these are not all required):
|
follows (noting that these are not all required):
|
||||||
|
|
||||||
* All database fields
|
* All database fields
|
||||||
|
@ -130,7 +130,7 @@ Model style
|
||||||
* ``def get_absolute_url()``
|
* ``def get_absolute_url()``
|
||||||
* Any custom methods
|
* Any custom methods
|
||||||
|
|
||||||
* If ``choices`` is defined for a given model field, define the choices as
|
* If ``choices`` is defined for a given model field, define the choices as
|
||||||
a tuple of tuples, with an all-uppercase name, either near the top of
|
a tuple of tuples, with an all-uppercase name, either near the top of
|
||||||
the model module or just above the model class. Example::
|
the model module or just above the model class. Example::
|
||||||
|
|
||||||
|
@ -178,13 +178,13 @@ as :class:`django.utils.functional.LazyObject`,
|
||||||
Miscellaneous
|
Miscellaneous
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
* Mark all strings for internationalization; see the :doc:`i18n
|
* Mark all strings for internationalization; see the :doc:`i18n
|
||||||
documentation </topics/i18n/index>` for details.
|
documentation </topics/i18n/index>` for details.
|
||||||
|
|
||||||
* Remove ``import`` statements that are no longer used when you change code.
|
* Remove ``import`` statements that are no longer used when you change code.
|
||||||
The most common tools for this task are `pyflakes`_ and `pylint`_.
|
The most common tools for this task are `pyflakes`_ and `pylint`_.
|
||||||
|
|
||||||
* Systematically remove all trailing whitespaces from your code as those
|
* Systematically remove all trailing whitespaces from your code as those
|
||||||
add unnecessary bytes, add visual clutter to the patches and can also
|
add unnecessary bytes, add visual clutter to the patches and can also
|
||||||
occasionally cause unnecessary merge conflicts. Some IDE's can be
|
occasionally cause unnecessary merge conflicts. Some IDE's can be
|
||||||
configured to automatically remove them and most VCS tools can be set to
|
configured to automatically remove them and most VCS tools can be set to
|
||||||
|
@ -193,7 +193,7 @@ Miscellaneous
|
||||||
are likely to be rejected, since they only introduce noise rather than
|
are likely to be rejected, since they only introduce noise rather than
|
||||||
code improvement. Tidy up when you're next changing code in the area.
|
code improvement. Tidy up when you're next changing code in the area.
|
||||||
|
|
||||||
* Please don't put your name in the code you contribute. Our policy is to
|
* Please don't put your name in the code you contribute. Our policy is to
|
||||||
keep contributors' names in the ``AUTHORS`` file distributed with Django
|
keep contributors' names in the ``AUTHORS`` file distributed with Django
|
||||||
-- not scattered throughout the codebase itself. Feel free to include a
|
-- not scattered throughout the codebase itself. Feel free to include a
|
||||||
change to the ``AUTHORS`` file in your patch if you make more than a
|
change to the ``AUTHORS`` file in your patch if you make more than a
|
||||||
|
|
|
@ -19,24 +19,24 @@ If you have identified a contribution you want to make and you're capable of
|
||||||
fixing it (as measured by your coding ability, knowledge of Django internals
|
fixing it (as measured by your coding ability, knowledge of Django internals
|
||||||
and time availability), claim it by following these steps:
|
and time availability), claim it by following these steps:
|
||||||
|
|
||||||
* `Create an account`_ to use in our ticket system. If you have an account
|
* `Create an account`_ to use in our ticket system. If you have an account
|
||||||
but have forgotten your password, you can reset it using the
|
but have forgotten your password, you can reset it using the
|
||||||
`password reset page`_.
|
`password reset page`_.
|
||||||
|
|
||||||
* If a ticket for this issue doesn't exist yet, create one in our
|
* If a ticket for this issue doesn't exist yet, create one in our
|
||||||
`ticket tracker`_.
|
`ticket tracker`_.
|
||||||
|
|
||||||
* If a ticket for this issue already exists, make sure nobody else has
|
* If a ticket for this issue already exists, make sure nobody else has
|
||||||
claimed it. To do this, look at the "Assigned to" section of the ticket.
|
claimed it. To do this, look at the "Assigned to" section of the ticket.
|
||||||
If it's assigned to "nobody," then it's available to be claimed.
|
If it's assigned to "nobody," then it's available to be claimed.
|
||||||
Otherwise, somebody else is working on this ticket, and you either find
|
Otherwise, somebody else is working on this ticket, and you either find
|
||||||
another bug/feature to work on, or contact the developer working on the
|
another bug/feature to work on, or contact the developer working on the
|
||||||
ticket to offer your help.
|
ticket to offer your help.
|
||||||
|
|
||||||
* Log into your account, if you haven't already, by clicking "Login" in
|
* Log into your account, if you haven't already, by clicking "Login" in
|
||||||
the upper right of the ticket page.
|
the upper right of the ticket page.
|
||||||
|
|
||||||
* Claim the ticket:
|
* Claim the ticket:
|
||||||
|
|
||||||
1. click the "accept" radio button under "Action" near the bottom of the
|
1. click the "accept" radio button under "Action" near the bottom of the
|
||||||
page,
|
page,
|
||||||
|
@ -76,9 +76,9 @@ it.
|
||||||
Patch style
|
Patch style
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
* Make sure your code matches our :doc:`coding-style`.
|
* Make sure your code matches our :doc:`coding-style`.
|
||||||
|
|
||||||
* Submit patches in the format returned by the ``svn diff`` command.
|
* Submit patches in the format returned by the ``svn diff`` command.
|
||||||
An exception is for code changes that are described more clearly in
|
An exception is for code changes that are described more clearly in
|
||||||
plain English than in code. Indentation is the most common example; it's
|
plain English than in code. Indentation is the most common example; it's
|
||||||
hard to read patches when the only difference in code is that it's
|
hard to read patches when the only difference in code is that it's
|
||||||
|
@ -86,23 +86,23 @@ Patch style
|
||||||
|
|
||||||
Patches in ``git diff`` format are also acceptable.
|
Patches in ``git diff`` format are also acceptable.
|
||||||
|
|
||||||
* When creating patches, always run ``svn diff`` from the top-level
|
* When creating patches, always run ``svn diff`` from the top-level
|
||||||
``trunk`` directory -- i.e. the one that contains ``django``, ``docs``,
|
``trunk`` directory -- i.e. the one that contains ``django``, ``docs``,
|
||||||
``tests``, ``AUTHORS``, etc. This makes it easy for other people to
|
``tests``, ``AUTHORS``, etc. This makes it easy for other people to
|
||||||
apply your patches.
|
apply your patches.
|
||||||
|
|
||||||
* Attach patches to a ticket in the `ticket tracker`_, using the "attach
|
* Attach patches to a ticket in the `ticket tracker`_, using the "attach
|
||||||
file" button. Please *don't* put the patch in the ticket description
|
file" button. Please *don't* put the patch in the ticket description
|
||||||
or comment unless it's a single line patch.
|
or comment unless it's a single line patch.
|
||||||
|
|
||||||
* Name the patch file with a ``.diff`` extension; this will let the ticket
|
* Name the patch file with a ``.diff`` extension; this will let the ticket
|
||||||
tracker apply correct syntax highlighting, which is quite helpful.
|
tracker apply correct syntax highlighting, which is quite helpful.
|
||||||
|
|
||||||
* Check the "Has patch" box on the ticket details. This will make it
|
* Check the "Has patch" box on the ticket details. This will make it
|
||||||
obvious that the ticket includes a patch, and it will add the ticket to
|
obvious that the ticket includes a patch, and it will add the ticket to
|
||||||
the `list of tickets with patches`_.
|
the `list of tickets with patches`_.
|
||||||
|
|
||||||
* The code required to fix a problem or add a feature is an essential part
|
* The code required to fix a problem or add a feature is an essential part
|
||||||
of a patch, but it is not the only part. A good patch should also
|
of a patch, but it is not the only part. A good patch should also
|
||||||
include a regression test to validate the behavior that has been fixed
|
include a regression test to validate the behavior that has been fixed
|
||||||
and to prevent the problem from arising again. Also, if some tickets are
|
and to prevent the problem from arising again. Also, if some tickets are
|
||||||
|
@ -110,7 +110,7 @@ Patch style
|
||||||
some comments in the test so that one can easily trace back the relevant
|
some comments in the test so that one can easily trace back the relevant
|
||||||
discussions after your patch gets committed and the tickets get closed.
|
discussions after your patch gets committed and the tickets get closed.
|
||||||
|
|
||||||
* If the code associated with a patch adds a new feature, or modifies
|
* If the code associated with a patch adds a new feature, or modifies
|
||||||
behavior of an existing feature, the patch should also contain
|
behavior of an existing feature, the patch should also contain
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,9 @@ code base. It's our policy to make sure all tests pass at all times.
|
||||||
|
|
||||||
The tests cover:
|
The tests cover:
|
||||||
|
|
||||||
* Models and the database API (``tests/modeltests``),
|
* Models and the database API (``tests/modeltests``),
|
||||||
* Everything else in core Django code (``tests/regressiontests``),
|
* Everything else in core Django code (``tests/regressiontests``),
|
||||||
* :ref:`contrib-apps` (``django/contrib/<app>/tests``).
|
* :ref:`contrib-apps` (``django/contrib/<app>/tests``).
|
||||||
|
|
||||||
We appreciate any and all contributions to the test suite!
|
We appreciate any and all contributions to the test suite!
|
||||||
|
|
||||||
|
@ -58,10 +58,10 @@ and type:
|
||||||
The :setting:`DATABASES` setting in this test settings module needs to define
|
The :setting:`DATABASES` setting in this test settings module needs to define
|
||||||
two databases:
|
two databases:
|
||||||
|
|
||||||
* A ``default`` database. This database should use the backend that
|
* A ``default`` database. This database should use the backend that
|
||||||
you want to use for primary testing
|
you want to use for primary testing
|
||||||
|
|
||||||
* A database with the alias ``other``. The ``other`` database is
|
* A database with the alias ``other``. The ``other`` database is
|
||||||
used to establish that queries can be directed to different
|
used to establish that queries can be directed to different
|
||||||
databases. As a result, this database can use any backend you
|
databases. As a result, this database can use any backend you
|
||||||
want. It doesn't need to use the same backend as the ``default``
|
want. It doesn't need to use the same backend as the ``default``
|
||||||
|
@ -70,13 +70,13 @@ two databases:
|
||||||
If you're using a backend that isn't SQLite, you will need to provide other
|
If you're using a backend that isn't SQLite, you will need to provide other
|
||||||
details for each database:
|
details for each database:
|
||||||
|
|
||||||
* The :setting:`USER` option for each of your databases needs to
|
* The :setting:`USER` option for each of your databases needs to
|
||||||
specify an existing user account for the database.
|
specify an existing user account for the database.
|
||||||
|
|
||||||
* The :setting:`PASSWORD` option needs to provide the password for
|
* The :setting:`PASSWORD` option needs to provide the password for
|
||||||
the :setting:`USER` that has been specified.
|
the :setting:`USER` that has been specified.
|
||||||
|
|
||||||
* The :setting:`NAME` option must be the name of an existing database to
|
* The :setting:`NAME` option must be the name of an existing database to
|
||||||
which the given user has permission to connect. The unit tests will not
|
which the given user has permission to connect. The unit tests will not
|
||||||
touch this database; the test runner creates a new database whose name
|
touch this database; the test runner creates a new database whose name
|
||||||
is :setting:`NAME` prefixed with ``test_``, and this test database is
|
is :setting:`NAME` prefixed with ``test_``, and this test database is
|
||||||
|
@ -128,13 +128,13 @@ Running all the tests
|
||||||
If you want to run the full suite of tests, you'll need to install a number of
|
If you want to run the full suite of tests, you'll need to install a number of
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
||||||
* PyYAML_
|
* PyYAML_
|
||||||
* Markdown_
|
* Markdown_
|
||||||
* Textile_
|
* Textile_
|
||||||
* Docutils_
|
* Docutils_
|
||||||
* setuptools_
|
* setuptools_
|
||||||
* memcached_, plus a :ref:`supported Python binding <memcached>`
|
* memcached_, plus a :ref:`supported Python binding <memcached>`
|
||||||
* gettext_ (:ref:`gettext_on_windows`)
|
* gettext_ (:ref:`gettext_on_windows`)
|
||||||
|
|
||||||
If you want to test the memcached cache backend, you'll also need to define
|
If you want to test the memcached cache backend, you'll also need to define
|
||||||
a :setting:`CACHES` setting that points at your memcached instance.
|
a :setting:`CACHES` setting that points at your memcached instance.
|
||||||
|
|
|
@ -9,10 +9,10 @@ possible.
|
||||||
|
|
||||||
Documentation changes generally come in two forms:
|
Documentation changes generally come in two forms:
|
||||||
|
|
||||||
* General improvements: typo corrections, error fixes and better
|
* General improvements: typo corrections, error fixes and better
|
||||||
explanations through clearer writing and more examples.
|
explanations through clearer writing and more examples.
|
||||||
|
|
||||||
* New features: documentation of features that have been added to the
|
* New features: documentation of features that have been added to the
|
||||||
framework since the last release.
|
framework since the last release.
|
||||||
|
|
||||||
This section explains how writers can craft their documentation changes
|
This section explains how writers can craft their documentation changes
|
||||||
|
@ -54,37 +54,37 @@ Commonly used terms
|
||||||
Here are some style guidelines on commonly used terms throughout the
|
Here are some style guidelines on commonly used terms throughout the
|
||||||
documentation:
|
documentation:
|
||||||
|
|
||||||
* **Django** -- when referring to the framework, capitalize Django. It is
|
* **Django** -- when referring to the framework, capitalize Django. It is
|
||||||
lowercase only in Python code and in the djangoproject.com logo.
|
lowercase only in Python code and in the djangoproject.com logo.
|
||||||
|
|
||||||
* **email** -- no hyphen.
|
* **email** -- no hyphen.
|
||||||
|
|
||||||
* **MySQL**, **PostgreSQL**, **SQLite**
|
* **MySQL**, **PostgreSQL**, **SQLite**
|
||||||
|
|
||||||
* **Python** -- when referring to the language, capitalize Python.
|
* **Python** -- when referring to the language, capitalize Python.
|
||||||
|
|
||||||
* **realize**, **customize**, **initialize**, etc. -- use the American
|
* **realize**, **customize**, **initialize**, etc. -- use the American
|
||||||
"ize" suffix, not "ise."
|
"ize" suffix, not "ise."
|
||||||
|
|
||||||
* **subclass** -- it's a single word without a hyphen, both as a verb
|
* **subclass** -- it's a single word without a hyphen, both as a verb
|
||||||
("subclass that model") and as a noun ("create a subclass").
|
("subclass that model") and as a noun ("create a subclass").
|
||||||
|
|
||||||
* **Web**, **World Wide Web**, **the Web** -- note Web is always
|
* **Web**, **World Wide Web**, **the Web** -- note Web is always
|
||||||
capitalized when referring to the World Wide Web.
|
capitalized when referring to the World Wide Web.
|
||||||
|
|
||||||
* **Web site** -- use two words, with Web capitalized.
|
* **Web site** -- use two words, with Web capitalized.
|
||||||
|
|
||||||
Django-specific terminology
|
Django-specific terminology
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
* **model** -- it's not capitalized.
|
* **model** -- it's not capitalized.
|
||||||
|
|
||||||
* **template** -- it's not capitalized.
|
* **template** -- it's not capitalized.
|
||||||
|
|
||||||
* **URLconf** -- use three capitalized letters, with no space before
|
* **URLconf** -- use three capitalized letters, with no space before
|
||||||
"conf."
|
"conf."
|
||||||
|
|
||||||
* **view** -- it's not capitalized.
|
* **view** -- it's not capitalized.
|
||||||
|
|
||||||
Guidelines for reStructuredText files
|
Guidelines for reStructuredText files
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
@ -92,13 +92,13 @@ Guidelines for reStructuredText files
|
||||||
These guidelines regulate the format of our reST (reStructuredText)
|
These guidelines regulate the format of our reST (reStructuredText)
|
||||||
documentation:
|
documentation:
|
||||||
|
|
||||||
* In section titles, capitalize only initial words and proper nouns.
|
* In section titles, capitalize only initial words and proper nouns.
|
||||||
|
|
||||||
* Wrap the documentation at 80 characters wide, unless a code example
|
* Wrap the documentation at 80 characters wide, unless a code example
|
||||||
is significantly less readable when split over two lines, or for another
|
is significantly less readable when split over two lines, or for another
|
||||||
good reason.
|
good reason.
|
||||||
|
|
||||||
* The main thing to keep in mind as you write and edit docs is that the
|
* 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::
|
more semantic markup you can add the better. So::
|
||||||
|
|
||||||
Add ``django.contrib.auth`` to your ``INSTALLED_APPS``...
|
Add ``django.contrib.auth`` to your ``INSTALLED_APPS``...
|
||||||
|
@ -111,7 +111,7 @@ documentation:
|
||||||
greatly helps readers. There's basically no limit to the amount of
|
greatly helps readers. There's basically no limit to the amount of
|
||||||
useful markup you can add.
|
useful markup you can add.
|
||||||
|
|
||||||
* Use :mod:`~sphinx.ext.intersphinx` to reference Python's and Sphinx'
|
* Use :mod:`~sphinx.ext.intersphinx` to reference Python's and Sphinx'
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
Django-specific markup
|
Django-specific markup
|
||||||
|
@ -122,37 +122,37 @@ description units:
|
||||||
|
|
||||||
__ http://sphinx.pocoo.org/markup/desc.html
|
__ http://sphinx.pocoo.org/markup/desc.html
|
||||||
|
|
||||||
* Settings::
|
* Settings::
|
||||||
|
|
||||||
.. setting:: INSTALLED_APPS
|
.. setting:: INSTALLED_APPS
|
||||||
|
|
||||||
To link to a setting, use ``:setting:`INSTALLED_APPS```.
|
To link to a setting, use ``:setting:`INSTALLED_APPS```.
|
||||||
|
|
||||||
* Template tags::
|
* Template tags::
|
||||||
|
|
||||||
.. templatetag:: regroup
|
.. templatetag:: regroup
|
||||||
|
|
||||||
To link, use ``:ttag:`regroup```.
|
To link, use ``:ttag:`regroup```.
|
||||||
|
|
||||||
* Template filters::
|
* Template filters::
|
||||||
|
|
||||||
.. templatefilter:: linebreaksbr
|
.. templatefilter:: linebreaksbr
|
||||||
|
|
||||||
To link, use ``:tfilter:`linebreaksbr```.
|
To link, use ``:tfilter:`linebreaksbr```.
|
||||||
|
|
||||||
* Field lookups (i.e. ``Foo.objects.filter(bar__exact=whatever)``)::
|
* Field lookups (i.e. ``Foo.objects.filter(bar__exact=whatever)``)::
|
||||||
|
|
||||||
.. fieldlookup:: exact
|
.. fieldlookup:: exact
|
||||||
|
|
||||||
To link, use ``:lookup:`exact```.
|
To link, use ``:lookup:`exact```.
|
||||||
|
|
||||||
* ``django-admin`` commands::
|
* ``django-admin`` commands::
|
||||||
|
|
||||||
.. django-admin:: syncdb
|
.. django-admin:: syncdb
|
||||||
|
|
||||||
To link, use ``:djadmin:`syncdb```.
|
To link, use ``:djadmin:`syncdb```.
|
||||||
|
|
||||||
* ``django-admin`` command-line options::
|
* ``django-admin`` command-line options::
|
||||||
|
|
||||||
.. django-admin-option:: --traceback
|
.. django-admin-option:: --traceback
|
||||||
|
|
||||||
|
@ -184,7 +184,7 @@ An example
|
||||||
For a quick example of how it all fits together, consider this hypothetical
|
For a quick example of how it all fits together, consider this hypothetical
|
||||||
example:
|
example:
|
||||||
|
|
||||||
* First, the ``ref/settings.txt`` document could have an overall layout
|
* First, the ``ref/settings.txt`` document could have an overall layout
|
||||||
like this:
|
like this:
|
||||||
|
|
||||||
.. code-block:: rst
|
.. code-block:: rst
|
||||||
|
@ -209,7 +209,7 @@ example:
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
* Next, the ``topics/settings.txt`` document could contain something like
|
* Next, the ``topics/settings.txt`` document could contain something like
|
||||||
this:
|
this:
|
||||||
|
|
||||||
.. code-block:: rst
|
.. code-block:: rst
|
||||||
|
@ -225,7 +225,7 @@ example:
|
||||||
link to another document as a whole and the :rst:role:`ref` element when
|
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.
|
we want to link to an arbitrary location in a document.
|
||||||
|
|
||||||
* Next, notice how the settings are annotated:
|
* Next, notice how the settings are annotated:
|
||||||
|
|
||||||
.. code-block:: rst
|
.. code-block:: rst
|
||||||
|
|
||||||
|
@ -257,13 +257,13 @@ Improving the documentation
|
||||||
A few small improvements can be made to make the documentation read and
|
A few small improvements can be made to make the documentation read and
|
||||||
look better:
|
look better:
|
||||||
|
|
||||||
* Most of the various ``index.txt`` documents have *very* short or even
|
* Most of the various ``index.txt`` documents have *very* short or even
|
||||||
non-existent intro text. Each of those documents needs a good short
|
non-existent intro text. Each of those documents needs a good short
|
||||||
intro the content below that point.
|
intro the content below that point.
|
||||||
|
|
||||||
* The glossary is very perfunctory. It needs to be filled out.
|
* The glossary is very perfunctory. It needs to be filled out.
|
||||||
|
|
||||||
* Add more metadata targets. Lots of places look like::
|
* Add more metadata targets. Lots of places look like::
|
||||||
|
|
||||||
``File.close()``
|
``File.close()``
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
@ -274,7 +274,7 @@ look better:
|
||||||
|
|
||||||
That is, use metadata instead of titles.
|
That is, use metadata instead of titles.
|
||||||
|
|
||||||
* Add more links -- nearly everything that's an inline code literal
|
* Add more links -- nearly everything that's an inline code literal
|
||||||
right now can probably be turned into a xref.
|
right now can probably be turned into a xref.
|
||||||
|
|
||||||
See the ``literals_to_xrefs.py`` file in ``_ext`` -- it's a shell script
|
See the ``literals_to_xrefs.py`` file in ``_ext`` -- it's a shell script
|
||||||
|
@ -282,14 +282,14 @@ look better:
|
||||||
|
|
||||||
This will probably be a continuing, never-ending project.
|
This will probably be a continuing, never-ending project.
|
||||||
|
|
||||||
* Add `info field lists`__ where appropriate.
|
* Add `info field lists`__ where appropriate.
|
||||||
|
|
||||||
__ http://sphinx.pocoo.org/markup/desc.html#info-field-lists
|
__ http://sphinx.pocoo.org/markup/desc.html#info-field-lists
|
||||||
|
|
||||||
* Whenever possible, use links. So, use ``:setting:`ADMIN_FOR``` instead
|
* Whenever possible, use links. So, use ``:setting:`ADMIN_FOR``` instead
|
||||||
of ````ADMIN_FOR````.
|
of ````ADMIN_FOR````.
|
||||||
|
|
||||||
* Use directives where appropriate. Some directives
|
* Use directives where appropriate. Some directives
|
||||||
(e.g. ``.. setting::``) are prefix-style directives; they go *before*
|
(e.g. ``.. setting::``) are prefix-style directives; they go *before*
|
||||||
the unit they're describing. These are known as "crossref" directives.
|
the unit they're describing. These are known as "crossref" directives.
|
||||||
Others (e.g. ``.. class::``) generate their own markup; these should go
|
Others (e.g. ``.. class::``) generate their own markup; these should go
|
||||||
|
@ -299,10 +299,10 @@ look better:
|
||||||
You can tell which are which by looking at in
|
You can tell which are which by looking at in
|
||||||
:file:`_ext/djangodocs.py`; it registers roles as one of the other.
|
:file:`_ext/djangodocs.py`; it registers roles as one of the other.
|
||||||
|
|
||||||
* Add ``.. code-block:: <lang>`` to literal blocks so that they get
|
* Add ``.. code-block:: <lang>`` to literal blocks so that they get
|
||||||
highlighted.
|
highlighted.
|
||||||
|
|
||||||
* When referring to classes/functions/modules, etc., you'll want to use
|
* When referring to classes/functions/modules, etc., you'll want to use
|
||||||
the fully-qualified name of the target
|
the fully-qualified name of the target
|
||||||
(``:class:`django.contrib.contenttypes.models.ContentType```).
|
(``:class:`django.contrib.contenttypes.models.ContentType```).
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,10 @@ about each item can often be found in the release notes of two versions prior.
|
||||||
See the :doc:`Django 1.1 release notes</releases/1.1>` for more details on
|
See the :doc:`Django 1.1 release notes</releases/1.1>` for more details on
|
||||||
these changes.
|
these changes.
|
||||||
|
|
||||||
* ``AdminSite.root()``. This method of hooking up the admin URLs will be
|
* ``AdminSite.root()``. This method of hooking up the admin URLs will be
|
||||||
removed in favor of including ``admin.site.urls``.
|
removed in favor of including ``admin.site.urls``.
|
||||||
|
|
||||||
* Authentication backends need to define the boolean attributes
|
* Authentication backends need to define the boolean attributes
|
||||||
``supports_object_permissions`` and ``supports_anonymous_user`` until
|
``supports_object_permissions`` and ``supports_anonymous_user`` until
|
||||||
version 1.4, at which point it will be assumed that all backends will
|
version 1.4, at which point it will be assumed that all backends will
|
||||||
support these options.
|
support these options.
|
||||||
|
@ -27,32 +27,32 @@ these changes.
|
||||||
See the :doc:`Django 1.2 release notes</releases/1.2>` for more details on
|
See the :doc:`Django 1.2 release notes</releases/1.2>` for more details on
|
||||||
these changes.
|
these changes.
|
||||||
|
|
||||||
* ``CsrfResponseMiddleware`` and ``CsrfMiddleware`` will be removed. Use
|
* ``CsrfResponseMiddleware`` and ``CsrfMiddleware`` will be removed. Use
|
||||||
the {% csrf_token %} template tag inside forms to enable CSRF
|
the {% csrf_token %} template tag inside forms to enable CSRF
|
||||||
protection. ``CsrfViewMiddleware`` remains and is enabled by default.
|
protection. ``CsrfViewMiddleware`` remains and is enabled by default.
|
||||||
|
|
||||||
* The old imports for CSRF functionality (``django.contrib.csrf.*``),
|
* The old imports for CSRF functionality (``django.contrib.csrf.*``),
|
||||||
which moved to core in 1.2, will be removed.
|
which moved to core in 1.2, will be removed.
|
||||||
|
|
||||||
* The :mod:`django.contrib.gis.db.backend` module will be removed in favor
|
* The :mod:`django.contrib.gis.db.backend` module will be removed in favor
|
||||||
of the specific backends.
|
of the specific backends.
|
||||||
|
|
||||||
* ``SMTPConnection`` will be removed in favor of a generic E-mail backend API.
|
* ``SMTPConnection`` will be removed in favor of a generic E-mail backend API.
|
||||||
|
|
||||||
* The many to many SQL generation functions on the database backends
|
* The many to many SQL generation functions on the database backends
|
||||||
will be removed.
|
will be removed.
|
||||||
|
|
||||||
* The ability to use the ``DATABASE_*`` family of top-level settings to
|
* The ability to use the ``DATABASE_*`` family of top-level settings to
|
||||||
define database connections will be removed.
|
define database connections will be removed.
|
||||||
|
|
||||||
* The ability to use shorthand notation to specify a database backend
|
* The ability to use shorthand notation to specify a database backend
|
||||||
(i.e., ``sqlite3`` instead of ``django.db.backends.sqlite3``) will be
|
(i.e., ``sqlite3`` instead of ``django.db.backends.sqlite3``) will be
|
||||||
removed.
|
removed.
|
||||||
|
|
||||||
* The ``get_db_prep_save``, ``get_db_prep_value`` and
|
* The ``get_db_prep_save``, ``get_db_prep_value`` and
|
||||||
``get_db_prep_lookup`` methods will have to support multiple databases.
|
``get_db_prep_lookup`` methods will have to support multiple databases.
|
||||||
|
|
||||||
* The ``Message`` model (in ``django.contrib.auth``), its related
|
* The ``Message`` model (in ``django.contrib.auth``), its related
|
||||||
manager in the ``User`` model (``user.message_set``), and the
|
manager in the ``User`` model (``user.message_set``), and the
|
||||||
associated methods (``user.message_set.create()`` and
|
associated methods (``user.message_set.create()`` and
|
||||||
``user.get_and_delete_messages()``), will be removed. The
|
``user.get_and_delete_messages()``), will be removed. The
|
||||||
|
@ -62,53 +62,53 @@ these changes.
|
||||||
means that the admin application will depend on the messages
|
means that the admin application will depend on the messages
|
||||||
context processor.
|
context processor.
|
||||||
|
|
||||||
* Authentication backends will need to support the ``obj`` parameter for
|
* Authentication backends will need to support the ``obj`` parameter for
|
||||||
permission checking. The ``supports_object_permissions`` attribute
|
permission checking. The ``supports_object_permissions`` attribute
|
||||||
will no longer be checked and can be removed from custom backends.
|
will no longer be checked and can be removed from custom backends.
|
||||||
|
|
||||||
* Authentication backends will need to support the ``AnonymousUser`` class
|
* Authentication backends will need to support the ``AnonymousUser`` class
|
||||||
being passed to all methods dealing with permissions. The
|
being passed to all methods dealing with permissions. The
|
||||||
``supports_anonymous_user`` variable will no longer be checked and can be
|
``supports_anonymous_user`` variable will no longer be checked and can be
|
||||||
removed from custom backends.
|
removed from custom backends.
|
||||||
|
|
||||||
* The ability to specify a callable template loader rather than a
|
* The ability to specify a callable template loader rather than a
|
||||||
``Loader`` class will be removed, as will the ``load_template_source``
|
``Loader`` class will be removed, as will the ``load_template_source``
|
||||||
functions that are included with the built in template loaders for
|
functions that are included with the built in template loaders for
|
||||||
backwards compatibility.
|
backwards compatibility.
|
||||||
|
|
||||||
* ``django.utils.translation.get_date_formats()`` and
|
* ``django.utils.translation.get_date_formats()`` and
|
||||||
``django.utils.translation.get_partial_date_formats()``. These functions
|
``django.utils.translation.get_partial_date_formats()``. These functions
|
||||||
will be removed; use the locale-aware
|
will be removed; use the locale-aware
|
||||||
``django.utils.formats.get_format()`` to get the appropriate formats.
|
``django.utils.formats.get_format()`` to get the appropriate formats.
|
||||||
|
|
||||||
* In ``django.forms.fields``, the constants: ``DEFAULT_DATE_INPUT_FORMATS``,
|
* In ``django.forms.fields``, the constants: ``DEFAULT_DATE_INPUT_FORMATS``,
|
||||||
``DEFAULT_TIME_INPUT_FORMATS`` and
|
``DEFAULT_TIME_INPUT_FORMATS`` and
|
||||||
``DEFAULT_DATETIME_INPUT_FORMATS`` will be removed. Use
|
``DEFAULT_DATETIME_INPUT_FORMATS`` will be removed. Use
|
||||||
``django.utils.formats.get_format()`` to get the appropriate
|
``django.utils.formats.get_format()`` to get the appropriate
|
||||||
formats.
|
formats.
|
||||||
|
|
||||||
* The ability to use a function-based test runners will be removed,
|
* The ability to use a function-based test runners will be removed,
|
||||||
along with the ``django.test.simple.run_tests()`` test runner.
|
along with the ``django.test.simple.run_tests()`` test runner.
|
||||||
|
|
||||||
* The ``views.feed()`` view and ``feeds.Feed`` class in
|
* The ``views.feed()`` view and ``feeds.Feed`` class in
|
||||||
``django.contrib.syndication`` will be removed. The class-based view
|
``django.contrib.syndication`` will be removed. The class-based view
|
||||||
``views.Feed`` should be used instead.
|
``views.Feed`` should be used instead.
|
||||||
|
|
||||||
* ``django.core.context_processors.auth``. This release will
|
* ``django.core.context_processors.auth``. This release will
|
||||||
remove the old method in favor of the new method in
|
remove the old method in favor of the new method in
|
||||||
``django.contrib.auth.context_processors.auth``.
|
``django.contrib.auth.context_processors.auth``.
|
||||||
|
|
||||||
* The ``postgresql`` database backend will be removed, use the
|
* The ``postgresql`` database backend will be removed, use the
|
||||||
``postgresql_psycopg2`` backend instead.
|
``postgresql_psycopg2`` backend instead.
|
||||||
|
|
||||||
* The ``no`` language code will be removed and has been replaced by the
|
* The ``no`` language code will be removed and has been replaced by the
|
||||||
``nb`` language code.
|
``nb`` language code.
|
||||||
|
|
||||||
* Authentication backends will need to define the boolean attribute
|
* Authentication backends will need to define the boolean attribute
|
||||||
``supports_inactive_user`` until version 1.5 when it will be assumed that
|
``supports_inactive_user`` until version 1.5 when it will be assumed that
|
||||||
all backends will handle inactive users.
|
all backends will handle inactive users.
|
||||||
|
|
||||||
* ``django.db.models.fields.XMLField`` will be removed. This was
|
* ``django.db.models.fields.XMLField`` will be removed. This was
|
||||||
deprecated as part of the 1.3 release. An accelerated deprecation
|
deprecated as part of the 1.3 release. An accelerated deprecation
|
||||||
schedule has been used because the field hasn't performed any role
|
schedule has been used because the field hasn't performed any role
|
||||||
beyond that of a simple ``TextField`` since the removal of oldforms.
|
beyond that of a simple ``TextField`` since the removal of oldforms.
|
||||||
|
@ -121,64 +121,64 @@ these changes.
|
||||||
See the :doc:`Django 1.3 release notes</releases/1.3>` for more details on
|
See the :doc:`Django 1.3 release notes</releases/1.3>` for more details on
|
||||||
these changes.
|
these changes.
|
||||||
|
|
||||||
* The ``mod_python`` request handler will be removed. The ``mod_wsgi``
|
* The ``mod_python`` request handler will be removed. The ``mod_wsgi``
|
||||||
handler should be used instead.
|
handler should be used instead.
|
||||||
|
|
||||||
* The ``template`` attribute on :class:`~django.test.client.Response`
|
* The ``template`` attribute on :class:`~django.test.client.Response`
|
||||||
objects returned by the :ref:`test client <test-client>` will be removed.
|
objects returned by the :ref:`test client <test-client>` will be removed.
|
||||||
The :attr:`~django.test.client.Response.templates` attribute should be
|
The :attr:`~django.test.client.Response.templates` attribute should be
|
||||||
used instead.
|
used instead.
|
||||||
|
|
||||||
* The :class:`~django.test.simple.DjangoTestRunner` will be removed.
|
* The :class:`~django.test.simple.DjangoTestRunner` will be removed.
|
||||||
Instead use a unittest-native class. The features of the
|
Instead use a unittest-native class. The features of the
|
||||||
:class:`django.test.simple.DjangoTestRunner` (including fail-fast and
|
:class:`django.test.simple.DjangoTestRunner` (including fail-fast and
|
||||||
Ctrl-C test termination) can currently be provided by the unittest-native
|
Ctrl-C test termination) can currently be provided by the unittest-native
|
||||||
:class:`TextTestRunner`.
|
:class:`TextTestRunner`.
|
||||||
|
|
||||||
* The undocumented function
|
* The undocumented function
|
||||||
:func:`django.contrib.formtools.utils.security_hash` will be removed,
|
:func:`django.contrib.formtools.utils.security_hash` will be removed,
|
||||||
instead use :func:`django.contrib.formtools.utils.form_hmac`
|
instead use :func:`django.contrib.formtools.utils.form_hmac`
|
||||||
|
|
||||||
* The function-based generic view modules will be removed in favor of their
|
* The function-based generic view modules will be removed in favor of their
|
||||||
class-based equivalents, outlined :doc:`here
|
class-based equivalents, outlined :doc:`here
|
||||||
</topics/generic-views-migration>`:
|
</topics/generic-views-migration>`:
|
||||||
|
|
||||||
* The :class:`~django.core.servers.basehttp.AdminMediaHandler` will be
|
* The :class:`~django.core.servers.basehttp.AdminMediaHandler` will be
|
||||||
removed. In its place use
|
removed. In its place use
|
||||||
:class:`~django.contrib.staticfiles.handlers.StaticFilesHandler`.
|
:class:`~django.contrib.staticfiles.handlers.StaticFilesHandler`.
|
||||||
|
|
||||||
* The :ttag:`url` and :ttag:`ssi` template tags will be
|
* The :ttag:`url` and :ttag:`ssi` template tags will be
|
||||||
modified so that the first argument to each tag is a
|
modified so that the first argument to each tag is a
|
||||||
template variable, not an implied string. Until then, the new-style
|
template variable, not an implied string. Until then, the new-style
|
||||||
behavior is provided in the ``future`` template tag library.
|
behavior is provided in the ``future`` template tag library.
|
||||||
|
|
||||||
* The :djadmin:`reset` and :djadmin:`sqlreset` management commands
|
* The :djadmin:`reset` and :djadmin:`sqlreset` management commands
|
||||||
will be removed.
|
will be removed.
|
||||||
|
|
||||||
* Authentication backends will need to support an inactive user
|
* Authentication backends will need to support an inactive user
|
||||||
being passed to all methods dealing with permissions.
|
being passed to all methods dealing with permissions.
|
||||||
The ``supports_inactive_user`` attribute will no longer be checked
|
The ``supports_inactive_user`` attribute will no longer be checked
|
||||||
and can be removed from custom backends.
|
and can be removed from custom backends.
|
||||||
|
|
||||||
* :meth:`~django.contrib.gis.geos.GEOSGeometry.transform` will raise
|
* :meth:`~django.contrib.gis.geos.GEOSGeometry.transform` will raise
|
||||||
a :class:`~django.contrib.gis.geos.GEOSException` when called
|
a :class:`~django.contrib.gis.geos.GEOSException` when called
|
||||||
on a geometry with no SRID value.
|
on a geometry with no SRID value.
|
||||||
|
|
||||||
* :class:`~django.http.CompatCookie` will be removed in favor of
|
* :class:`~django.http.CompatCookie` will be removed in favor of
|
||||||
:class:`~django.http.SimpleCookie`.
|
:class:`~django.http.SimpleCookie`.
|
||||||
|
|
||||||
* :class:`django.core.context_processors.PermWrapper` and
|
* :class:`django.core.context_processors.PermWrapper` and
|
||||||
:class:`django.core.context_processors.PermLookupDict` will be removed in
|
:class:`django.core.context_processors.PermLookupDict` will be removed in
|
||||||
favor of the corresponding
|
favor of the corresponding
|
||||||
:class:`django.contrib.auth.context_processors.PermWrapper` and
|
:class:`django.contrib.auth.context_processors.PermWrapper` and
|
||||||
:class:`django.contrib.auth.context_processors.PermLookupDict`,
|
:class:`django.contrib.auth.context_processors.PermLookupDict`,
|
||||||
respectively.
|
respectively.
|
||||||
|
|
||||||
* The :setting:`MEDIA_URL` or :setting:`STATIC_URL` settings will be
|
* The :setting:`MEDIA_URL` or :setting:`STATIC_URL` settings will be
|
||||||
required to end with a trailing slash to ensure there is a consistent
|
required to end with a trailing slash to ensure there is a consistent
|
||||||
way to combine paths in templates.
|
way to combine paths in templates.
|
||||||
|
|
||||||
* ``django.db.models.fields.URLField.verify_exists`` will be removed. The
|
* ``django.db.models.fields.URLField.verify_exists`` will be removed. The
|
||||||
feature was deprecated in 1.3.1 due to intractable security and
|
feature was deprecated in 1.3.1 due to intractable security and
|
||||||
performance issues and will follow a slightly accelerated deprecation
|
performance issues and will follow a slightly accelerated deprecation
|
||||||
timeframe.
|
timeframe.
|
||||||
|
@ -189,64 +189,64 @@ these changes.
|
||||||
See the :doc:`Django 1.4 release notes</releases/1.4>` for more details on
|
See the :doc:`Django 1.4 release notes</releases/1.4>` for more details on
|
||||||
these changes.
|
these changes.
|
||||||
|
|
||||||
* The compatibility modules ``django.utils.copycompat`` and
|
* The compatibility modules ``django.utils.copycompat`` and
|
||||||
``django.utils.hashcompat`` as well as the functions
|
``django.utils.hashcompat`` as well as the functions
|
||||||
``django.utils.itercompat.all`` and ``django.utils.itercompat.any`` will
|
``django.utils.itercompat.all`` and ``django.utils.itercompat.any`` will
|
||||||
be removed. The Python builtin versions should be used instead.
|
be removed. The Python builtin versions should be used instead.
|
||||||
|
|
||||||
* The :func:`~django.views.decorators.csrf.csrf_response_exempt` and
|
* The :func:`~django.views.decorators.csrf.csrf_response_exempt` and
|
||||||
:func:`~django.views.decorators.csrf.csrf_view_exempt` decorators will
|
:func:`~django.views.decorators.csrf.csrf_view_exempt` decorators will
|
||||||
be removed. Since 1.4 ``csrf_response_exempt`` has been a no-op (it
|
be removed. Since 1.4 ``csrf_response_exempt`` has been a no-op (it
|
||||||
returns the same function), and ``csrf_view_exempt`` has been a
|
returns the same function), and ``csrf_view_exempt`` has been a
|
||||||
synonym for ``django.views.decorators.csrf.csrf_exempt``, which should
|
synonym for ``django.views.decorators.csrf.csrf_exempt``, which should
|
||||||
be used to replace it.
|
be used to replace it.
|
||||||
|
|
||||||
* The :class:`~django.core.cache.backends.memcached.CacheClass` backend
|
* The :class:`~django.core.cache.backends.memcached.CacheClass` backend
|
||||||
was split into two in Django 1.3 in order to introduce support for
|
was split into two in Django 1.3 in order to introduce support for
|
||||||
PyLibMC. The historical :class:`~django.core.cache.backends.memcached.CacheClass`
|
PyLibMC. The historical :class:`~django.core.cache.backends.memcached.CacheClass`
|
||||||
will be removed in favor of :class:`~django.core.cache.backends.memcached.MemcachedCache`.
|
will be removed in favor of :class:`~django.core.cache.backends.memcached.MemcachedCache`.
|
||||||
|
|
||||||
* The UK-prefixed objects of ``django.contrib.localflavor.uk`` will only
|
* The UK-prefixed objects of ``django.contrib.localflavor.uk`` will only
|
||||||
be accessible through their GB-prefixed names (GB is the correct
|
be accessible through their GB-prefixed names (GB is the correct
|
||||||
ISO 3166 code for United Kingdom).
|
ISO 3166 code for United Kingdom).
|
||||||
|
|
||||||
* The :setting:`IGNORABLE_404_STARTS` and :setting:`IGNORABLE_404_ENDS`
|
* The :setting:`IGNORABLE_404_STARTS` and :setting:`IGNORABLE_404_ENDS`
|
||||||
settings have been superseded by :setting:`IGNORABLE_404_URLS` in
|
settings have been superseded by :setting:`IGNORABLE_404_URLS` in
|
||||||
the 1.4 release. They will be removed.
|
the 1.4 release. They will be removed.
|
||||||
|
|
||||||
* The :doc:`form wizard </ref/contrib/formtools/form-wizard>` has been
|
* The :doc:`form wizard </ref/contrib/formtools/form-wizard>` has been
|
||||||
refactored to use class based views with pluggable backends in 1.4.
|
refactored to use class based views with pluggable backends in 1.4.
|
||||||
The previous implementation will be removed.
|
The previous implementation will be removed.
|
||||||
|
|
||||||
* Legacy ways of calling
|
* Legacy ways of calling
|
||||||
:func:`~django.views.decorators.cache.cache_page` will be removed.
|
:func:`~django.views.decorators.cache.cache_page` will be removed.
|
||||||
|
|
||||||
* The backward-compatibility shim to automatically add a debug-false
|
* The backward-compatibility shim to automatically add a debug-false
|
||||||
filter to the ``'mail_admins'`` logging handler will be removed. The
|
filter to the ``'mail_admins'`` logging handler will be removed. The
|
||||||
:setting:`LOGGING` setting should include this filter explicitly if
|
:setting:`LOGGING` setting should include this filter explicitly if
|
||||||
it is desired.
|
it is desired.
|
||||||
|
|
||||||
* The template tag
|
* The template tag
|
||||||
:func:`django.contrib.admin.templatetags.adminmedia.admin_media_prefix`
|
:func:`django.contrib.admin.templatetags.adminmedia.admin_media_prefix`
|
||||||
will be removed in favor of the generic static files handling.
|
will be removed in favor of the generic static files handling.
|
||||||
|
|
||||||
* The builtin truncation functions :func:`django.utils.text.truncate_words`
|
* The builtin truncation functions :func:`django.utils.text.truncate_words`
|
||||||
and :func:`django.utils.text.truncate_html_words` will be removed in
|
and :func:`django.utils.text.truncate_html_words` will be removed in
|
||||||
favor of the ``django.utils.text.Truncator`` class.
|
favor of the ``django.utils.text.Truncator`` class.
|
||||||
|
|
||||||
* The :class:`~django.contrib.gis.geoip.GeoIP` class was moved to
|
* The :class:`~django.contrib.gis.geoip.GeoIP` class was moved to
|
||||||
:mod:`django.contrib.gis.geoip` in 1.4 -- the shortcut in
|
:mod:`django.contrib.gis.geoip` in 1.4 -- the shortcut in
|
||||||
:mod:`django.contrib.gis.utils` will be removed.
|
:mod:`django.contrib.gis.utils` will be removed.
|
||||||
|
|
||||||
* ``django.conf.urls.defaults`` will be removed. The functions
|
* ``django.conf.urls.defaults`` will be removed. The functions
|
||||||
:func:`~django.conf.urls.include`, :func:`~django.conf.urls.patterns` and
|
:func:`~django.conf.urls.include`, :func:`~django.conf.urls.patterns` and
|
||||||
:func:`~django.conf.urls.url` plus :data:`~django.conf.urls.handler404`,
|
:func:`~django.conf.urls.url` plus :data:`~django.conf.urls.handler404`,
|
||||||
:data:`~django.conf.urls.handler500`, are now available through
|
:data:`~django.conf.urls.handler500`, are now available through
|
||||||
:mod:`django.conf.urls` .
|
:mod:`django.conf.urls` .
|
||||||
|
|
||||||
* The Databrowse contrib module will be removed.
|
* The Databrowse contrib module will be removed.
|
||||||
|
|
||||||
* The functions :func:`~django.core.management.setup_environ` and
|
* The functions :func:`~django.core.management.setup_environ` and
|
||||||
:func:`~django.core.management.execute_manager` will be removed from
|
:func:`~django.core.management.execute_manager` will be removed from
|
||||||
:mod:`django.core.management`. This also means that the old (pre-1.4)
|
:mod:`django.core.management`. This also means that the old (pre-1.4)
|
||||||
style of :file:`manage.py` file will no longer work.
|
style of :file:`manage.py` file will no longer work.
|
||||||
|
@ -254,7 +254,7 @@ these changes.
|
||||||
2.0
|
2.0
|
||||||
---
|
---
|
||||||
|
|
||||||
* ``django.views.defaults.shortcut()``. This function has been moved
|
* ``django.views.defaults.shortcut()``. This function has been moved
|
||||||
to ``django.contrib.contenttypes.views.shortcut()`` as part of the
|
to ``django.contrib.contenttypes.views.shortcut()`` as part of the
|
||||||
goal of removing all ``django.contrib`` references from the core
|
goal of removing all ``django.contrib`` references from the core
|
||||||
Django codebase. The old shortcut will be removed in the 2.0
|
Django codebase. The old shortcut will be removed in the 2.0
|
||||||
|
|
|
@ -9,25 +9,25 @@ Official releases
|
||||||
|
|
||||||
Since version 1.0, Django's release numbering works as follows:
|
Since version 1.0, Django's release numbering works as follows:
|
||||||
|
|
||||||
* Versions are numbered in the form ``A.B`` or ``A.B.C``.
|
* Versions are numbered in the form ``A.B`` or ``A.B.C``.
|
||||||
|
|
||||||
* ``A`` is the *major version* number, which is only incremented for major
|
* ``A`` is the *major version* number, which is only incremented for major
|
||||||
changes to Django, and these changes are not necessarily
|
changes to Django, and these changes are not necessarily
|
||||||
backwards-compatible. That is, code you wrote for Django 1.2 may break
|
backwards-compatible. That is, code you wrote for Django 1.2 may break
|
||||||
when we release Django 2.0.
|
when we release Django 2.0.
|
||||||
|
|
||||||
* ``B`` is the *minor version* number, which is incremented for large yet
|
* ``B`` is the *minor version* number, which is incremented for large yet
|
||||||
backwards compatible changes. Code written for Django 1.2 will continue
|
backwards compatible changes. Code written for Django 1.2 will continue
|
||||||
to work under Django 1.3. Exceptions to this rule will be listed in the
|
to work under Django 1.3. Exceptions to this rule will be listed in the
|
||||||
release notes.
|
release notes.
|
||||||
|
|
||||||
* ``C`` is the *micro version* number, which is incremented for bug and
|
* ``C`` is the *micro version* number, which is incremented for bug and
|
||||||
security fixes. A new micro-release will be 100% backwards-compatible with
|
security fixes. A new micro-release will be 100% backwards-compatible with
|
||||||
the previous micro-release. The only exception is when a security issue
|
the previous micro-release. The only exception is when a security issue
|
||||||
can't be fixed without breaking backwards-compatibility. If this happens,
|
can't be fixed without breaking backwards-compatibility. If this happens,
|
||||||
the release notes will provide detailed upgrade instructions.
|
the release notes will provide detailed upgrade instructions.
|
||||||
|
|
||||||
* In some cases, we'll make alpha, beta, or release candidate releases.
|
* In some cases, we'll make alpha, beta, or release candidate releases.
|
||||||
These are of the form ``A.B alpha/beta/rc N``, which means the ``Nth``
|
These are of the form ``A.B alpha/beta/rc N``, which means the ``Nth``
|
||||||
alpha/beta/release candidate of version ``A.B``.
|
alpha/beta/release candidate of version ``A.B``.
|
||||||
|
|
||||||
|
@ -59,15 +59,15 @@ remove the feature entirely.
|
||||||
|
|
||||||
So, for example, if we decided to remove a function that existed in Django 1.0:
|
So, for example, if we decided to remove a function that existed in Django 1.0:
|
||||||
|
|
||||||
* Django 1.1 will contain a backwards-compatible replica of the function
|
* Django 1.1 will contain a backwards-compatible replica of the function
|
||||||
which will raise a ``PendingDeprecationWarning``. This warning is silent
|
which will raise a ``PendingDeprecationWarning``. This warning is silent
|
||||||
by default; you need to explicitly turn on display of these warnings.
|
by default; you need to explicitly turn on display of these warnings.
|
||||||
|
|
||||||
* Django 1.2 will contain the backwards-compatible replica, but the warning
|
* Django 1.2 will contain the backwards-compatible replica, but the warning
|
||||||
will be promoted to a full-fledged ``DeprecationWarning``. This warning is
|
will be promoted to a full-fledged ``DeprecationWarning``. This warning is
|
||||||
*loud* by default, and will likely be quite annoying.
|
*loud* by default, and will likely be quite annoying.
|
||||||
|
|
||||||
* Django 1.3 will remove the feature outright.
|
* Django 1.3 will remove the feature outright.
|
||||||
|
|
||||||
Micro releases
|
Micro releases
|
||||||
--------------
|
--------------
|
||||||
|
@ -90,10 +90,10 @@ Supported versions
|
||||||
At any moment in time, Django's developer team will support a set of releases to
|
At any moment in time, Django's developer team will support a set of releases to
|
||||||
varying levels:
|
varying levels:
|
||||||
|
|
||||||
* The current development trunk will get new features and bug fixes
|
* The current development trunk will get new features and bug fixes
|
||||||
requiring major refactoring.
|
requiring major refactoring.
|
||||||
|
|
||||||
* Patches applied to the trunk will also be applied to the last minor
|
* Patches applied to the trunk will also be applied to the last minor
|
||||||
release, to be released as the next micro release, when they fix critical
|
release, to be released as the next micro release, when they fix critical
|
||||||
problems:
|
problems:
|
||||||
|
|
||||||
|
@ -108,18 +108,18 @@ varying levels:
|
||||||
The rule of thumb is that fixes will be backported to the last minor
|
The rule of thumb is that fixes will be backported to the last minor
|
||||||
release for bugs that would have prevented a release in the first place.
|
release for bugs that would have prevented a release in the first place.
|
||||||
|
|
||||||
* Security fixes will be applied to the current trunk and the previous two
|
* Security fixes will be applied to the current trunk and the previous two
|
||||||
minor releases.
|
minor releases.
|
||||||
|
|
||||||
As a concrete example, consider a moment in time halfway between the release of
|
As a concrete example, consider a moment in time halfway between the release of
|
||||||
Django 1.3 and 1.4. At this point in time:
|
Django 1.3 and 1.4. At this point in time:
|
||||||
|
|
||||||
* Features will be added to development trunk, to be released as Django 1.4.
|
* Features will be added to development trunk, to be released as Django 1.4.
|
||||||
|
|
||||||
* Critical bug fixes will be applied to a ``1.3.X`` branch, and released as
|
* Critical bug fixes will be applied to a ``1.3.X`` branch, and released as
|
||||||
1.3.1, 1.3.2, etc.
|
1.3.1, 1.3.2, etc.
|
||||||
|
|
||||||
* Security fixes will be applied to trunk, a ``1.3.X`` branch and a
|
* Security fixes will be applied to trunk, a ``1.3.X`` branch and a
|
||||||
``1.2.X`` branch. They will trigger the release of ``1.3.1``, ``1.2.1``,
|
``1.2.X`` branch. They will trigger the release of ``1.3.1``, ``1.2.1``,
|
||||||
etc.
|
etc.
|
||||||
|
|
||||||
|
@ -204,15 +204,15 @@ Let's look at a hypothetical example for how this all first together. Imagine,
|
||||||
if you will, a point about halfway between 1.1 and 1.2. At this point,
|
if you will, a point about halfway between 1.1 and 1.2. At this point,
|
||||||
development will be happening in a bunch of places:
|
development will be happening in a bunch of places:
|
||||||
|
|
||||||
* On trunk, development towards 1.2 proceeds with small additions, bugs
|
* On trunk, development towards 1.2 proceeds with small additions, bugs
|
||||||
fixes, etc. being checked in daily.
|
fixes, etc. being checked in daily.
|
||||||
|
|
||||||
* On the branch "branches/releases/1.1.X", fixes for critical bugs found in
|
* On the branch "branches/releases/1.1.X", fixes for critical bugs found in
|
||||||
the 1.1 release are checked in as needed. At some point, this branch will
|
the 1.1 release are checked in as needed. At some point, this branch will
|
||||||
be released as "1.1.1", "1.1.2", etc.
|
be released as "1.1.1", "1.1.2", etc.
|
||||||
|
|
||||||
* On the branch "branches/releases/1.0.X", security fixes are made if
|
* On the branch "branches/releases/1.0.X", security fixes are made if
|
||||||
needed and released as "1.0.2", "1.0.3", etc.
|
needed and released as "1.0.2", "1.0.3", etc.
|
||||||
|
|
||||||
* On feature branches, development of major features is done. These
|
* On feature branches, development of major features is done. These
|
||||||
branches will be merged into trunk before the end of phase two.
|
branches will be merged into trunk before the end of phase two.
|
||||||
|
|
|
@ -57,15 +57,15 @@ Install Django
|
||||||
|
|
||||||
You've got three easy options to install Django:
|
You've got three easy options to install Django:
|
||||||
|
|
||||||
* Install a version of Django :doc:`provided by your operating system
|
* Install a version of Django :doc:`provided by your operating system
|
||||||
distribution </misc/distributions>`. This is the quickest option for those
|
distribution </misc/distributions>`. This is the quickest option for those
|
||||||
who have operating systems that distribute Django.
|
who have operating systems that distribute Django.
|
||||||
|
|
||||||
* :ref:`Install an official release <installing-official-release>`. This
|
* :ref:`Install an official release <installing-official-release>`. This
|
||||||
is the best approach for users who want a stable version number and aren't
|
is the best approach for users who want a stable version number and aren't
|
||||||
concerned about running a slightly older version of Django.
|
concerned about running a slightly older version of Django.
|
||||||
|
|
||||||
* :ref:`Install the latest development version
|
* :ref:`Install the latest development version
|
||||||
<installing-development-version>`. This is best for users who want the
|
<installing-development-version>`. This is best for users who want the
|
||||||
latest-and-greatest features and aren't afraid of running brand-new code.
|
latest-and-greatest features and aren't afraid of running brand-new code.
|
||||||
|
|
||||||
|
|
|
@ -307,13 +307,13 @@ This is just the surface
|
||||||
This has been only a quick overview of Django's functionality. Some more useful
|
This has been only a quick overview of Django's functionality. Some more useful
|
||||||
features:
|
features:
|
||||||
|
|
||||||
* A :doc:`caching framework </topics/cache>` that integrates with memcached
|
* A :doc:`caching framework </topics/cache>` that integrates with memcached
|
||||||
or other backends.
|
or other backends.
|
||||||
|
|
||||||
* A :doc:`syndication framework </ref/contrib/syndication>` that makes
|
* A :doc:`syndication framework </ref/contrib/syndication>` that makes
|
||||||
creating RSS and Atom feeds as easy as writing a small Python class.
|
creating RSS and Atom feeds as easy as writing a small Python class.
|
||||||
|
|
||||||
* More sexy automatically-generated admin features -- this overview barely
|
* More sexy automatically-generated admin features -- this overview barely
|
||||||
scratched the surface.
|
scratched the surface.
|
||||||
|
|
||||||
The next obvious steps are for you to `download Django`_, read :doc:`the
|
The next obvious steps are for you to `download Django`_, read :doc:`the
|
||||||
|
|
|
@ -9,8 +9,8 @@ poll application.
|
||||||
|
|
||||||
It'll consist of two parts:
|
It'll consist of two parts:
|
||||||
|
|
||||||
* A public site that lets people view polls and vote in them.
|
* A public site that lets people view polls and vote in them.
|
||||||
* An admin site that lets you add, change and delete polls.
|
* An admin site that lets you add, change and delete polls.
|
||||||
|
|
||||||
We'll assume you have :doc:`Django installed </intro/install>` already. You can
|
We'll assume you have :doc:`Django installed </intro/install>` already. You can
|
||||||
tell Django is installed by running the Python interactive interpreter and
|
tell Django is installed by running the Python interactive interpreter and
|
||||||
|
@ -190,13 +190,13 @@ module-level variables representing Django settings. Change the
|
||||||
following keys in the :setting:`DATABASES` ``'default'`` item to match
|
following keys in the :setting:`DATABASES` ``'default'`` item to match
|
||||||
your databases connection settings.
|
your databases connection settings.
|
||||||
|
|
||||||
* :setting:`ENGINE <DATABASE-ENGINE>` -- Either
|
* :setting:`ENGINE <DATABASE-ENGINE>` -- Either
|
||||||
``'django.db.backends.postgresql_psycopg2'``,
|
``'django.db.backends.postgresql_psycopg2'``,
|
||||||
``'django.db.backends.mysql'`` or
|
``'django.db.backends.mysql'`` or
|
||||||
``'django.db.backends.sqlite3'``. Other backends are
|
``'django.db.backends.sqlite3'``. Other backends are
|
||||||
:setting:`also available <DATABASE-ENGINE>`.
|
:setting:`also available <DATABASE-ENGINE>`.
|
||||||
|
|
||||||
* :setting:`NAME` -- The name of your database. If you're using
|
* :setting:`NAME` -- The name of your database. If you're using
|
||||||
SQLite, the database will be a file on your computer; in that
|
SQLite, the database will be a file on your computer; in that
|
||||||
case, :setting:`NAME` should be the full absolute path,
|
case, :setting:`NAME` should be the full absolute path,
|
||||||
including filename, of that file. If the file doesn't exist, it
|
including filename, of that file. If the file doesn't exist, it
|
||||||
|
@ -206,12 +206,12 @@ your databases connection settings.
|
||||||
When specifying the path, always use forward slashes, even on
|
When specifying the path, always use forward slashes, even on
|
||||||
Windows (e.g. ``C:/homes/user/mysite/sqlite3.db``).
|
Windows (e.g. ``C:/homes/user/mysite/sqlite3.db``).
|
||||||
|
|
||||||
* :setting:`USER` -- Your database username (not used for SQLite).
|
* :setting:`USER` -- Your database username (not used for SQLite).
|
||||||
|
|
||||||
* :setting:`PASSWORD` -- Your database password (not used for
|
* :setting:`PASSWORD` -- Your database password (not used for
|
||||||
SQLite).
|
SQLite).
|
||||||
|
|
||||||
* :setting:`HOST` -- The host your database is on. Leave this as
|
* :setting:`HOST` -- The host your database is on. Leave this as
|
||||||
an empty string if your database server is on the same physical
|
an empty string if your database server is on the same physical
|
||||||
machine (not used for SQLite).
|
machine (not used for SQLite).
|
||||||
|
|
||||||
|
@ -238,18 +238,18 @@ distribute them for use by others in their projects.
|
||||||
By default, :setting:`INSTALLED_APPS` contains the following apps, all of which
|
By default, :setting:`INSTALLED_APPS` contains the following apps, all of which
|
||||||
come with Django:
|
come with Django:
|
||||||
|
|
||||||
* :mod:`django.contrib.auth` -- An authentication system.
|
* :mod:`django.contrib.auth` -- An authentication system.
|
||||||
|
|
||||||
* :mod:`django.contrib.contenttypes` -- A framework for content types.
|
* :mod:`django.contrib.contenttypes` -- A framework for content types.
|
||||||
|
|
||||||
* :mod:`django.contrib.sessions` -- A session framework.
|
* :mod:`django.contrib.sessions` -- A session framework.
|
||||||
|
|
||||||
* :mod:`django.contrib.sites` -- A framework for managing multiple sites
|
* :mod:`django.contrib.sites` -- A framework for managing multiple sites
|
||||||
with one Django installation.
|
with one Django installation.
|
||||||
|
|
||||||
* :mod:`django.contrib.messages` -- A messaging framework.
|
* :mod:`django.contrib.messages` -- A messaging framework.
|
||||||
|
|
||||||
* :mod:`django.contrib.staticfiles` -- A framework for managing
|
* :mod:`django.contrib.staticfiles` -- A framework for managing
|
||||||
static files.
|
static files.
|
||||||
|
|
||||||
These applications are included by default as a convenience for the common case.
|
These applications are included by default as a convenience for the common case.
|
||||||
|
@ -390,8 +390,8 @@ Activating models
|
||||||
That small bit of model code gives Django a lot of information. With it, Django
|
That small bit of model code gives Django a lot of information. With it, Django
|
||||||
is able to:
|
is able to:
|
||||||
|
|
||||||
* Create a database schema (``CREATE TABLE`` statements) for this app.
|
* Create a database schema (``CREATE TABLE`` statements) for this app.
|
||||||
* Create a Python database-access API for accessing Poll and Choice objects.
|
* Create a Python database-access API for accessing Poll and Choice objects.
|
||||||
|
|
||||||
But first we need to tell our project that the ``polls`` app is installed.
|
But first we need to tell our project that the ``polls`` app is installed.
|
||||||
|
|
||||||
|
@ -441,28 +441,28 @@ statements for the polls app):
|
||||||
|
|
||||||
Note the following:
|
Note the following:
|
||||||
|
|
||||||
* The exact output will vary depending on the database you are using.
|
* The exact output will vary depending on the database you are using.
|
||||||
|
|
||||||
* Table names are automatically generated by combining the name of the app
|
* Table names are automatically generated by combining the name of the app
|
||||||
(``polls``) and the lowercase name of the model -- ``poll`` and
|
(``polls``) and the lowercase name of the model -- ``poll`` and
|
||||||
``choice``. (You can override this behavior.)
|
``choice``. (You can override this behavior.)
|
||||||
|
|
||||||
* Primary keys (IDs) are added automatically. (You can override this, too.)
|
* Primary keys (IDs) are added automatically. (You can override this, too.)
|
||||||
|
|
||||||
* By convention, Django appends ``"_id"`` to the foreign key field name.
|
* By convention, Django appends ``"_id"`` to the foreign key field name.
|
||||||
Yes, you can override this, as well.
|
Yes, you can override this, as well.
|
||||||
|
|
||||||
* The foreign key relationship is made explicit by a ``REFERENCES``
|
* The foreign key relationship is made explicit by a ``REFERENCES``
|
||||||
statement.
|
statement.
|
||||||
|
|
||||||
* It's tailored to the database you're using, so database-specific field
|
* It's tailored to the database you're using, so database-specific field
|
||||||
types such as ``auto_increment`` (MySQL), ``serial`` (PostgreSQL), or
|
types such as ``auto_increment`` (MySQL), ``serial`` (PostgreSQL), or
|
||||||
``integer primary key`` (SQLite) are handled for you automatically. Same
|
``integer primary key`` (SQLite) are handled for you automatically. Same
|
||||||
goes for quoting of field names -- e.g., using double quotes or single
|
goes for quoting of field names -- e.g., using double quotes or single
|
||||||
quotes. The author of this tutorial runs PostgreSQL, so the example
|
quotes. The author of this tutorial runs PostgreSQL, so the example
|
||||||
output is in PostgreSQL syntax.
|
output is in PostgreSQL syntax.
|
||||||
|
|
||||||
* The :djadmin:`sql` command doesn't actually run the SQL in your database -
|
* The :djadmin:`sql` command doesn't actually run the SQL in your database -
|
||||||
it just prints it to the screen so that you can see what SQL Django thinks
|
it just prints it to the screen so that you can see what SQL Django thinks
|
||||||
is required. If you wanted to, you could copy and paste this SQL into your
|
is required. If you wanted to, you could copy and paste this SQL into your
|
||||||
database prompt. However, as we will see shortly, Django provides an
|
database prompt. However, as we will see shortly, Django provides an
|
||||||
|
@ -470,21 +470,21 @@ Note the following:
|
||||||
|
|
||||||
If you're interested, also run the following commands:
|
If you're interested, also run the following commands:
|
||||||
|
|
||||||
* :djadmin:`python manage.py validate <validate>` -- Checks for any errors
|
* :djadmin:`python manage.py validate <validate>` -- Checks for any errors
|
||||||
in the construction of your models.
|
in the construction of your models.
|
||||||
|
|
||||||
* :djadmin:`python manage.py sqlcustom polls <sqlcustom>` -- Outputs any
|
* :djadmin:`python manage.py sqlcustom polls <sqlcustom>` -- Outputs any
|
||||||
:ref:`custom SQL statements <initial-sql>` (such as table modifications or
|
:ref:`custom SQL statements <initial-sql>` (such as table modifications or
|
||||||
constraints) that are defined for the application.
|
constraints) that are defined for the application.
|
||||||
|
|
||||||
* :djadmin:`python manage.py sqlclear polls <sqlclear>` -- Outputs the
|
* :djadmin:`python manage.py sqlclear polls <sqlclear>` -- Outputs the
|
||||||
necessary ``DROP TABLE`` statements for this app, according to which
|
necessary ``DROP TABLE`` statements for this app, according to which
|
||||||
tables already exist in your database (if any).
|
tables already exist in your database (if any).
|
||||||
|
|
||||||
* :djadmin:`python manage.py sqlindexes polls <sqlindexes>` -- Outputs the
|
* :djadmin:`python manage.py sqlindexes polls <sqlindexes>` -- Outputs the
|
||||||
``CREATE INDEX`` statements for this app.
|
``CREATE INDEX`` statements for this app.
|
||||||
|
|
||||||
* :djadmin:`python manage.py sqlall polls <sqlall>` -- A combination of all
|
* :djadmin:`python manage.py sqlall polls <sqlall>` -- A combination of all
|
||||||
the SQL from the :djadmin:`sql`, :djadmin:`sqlcustom`, and
|
the SQL from the :djadmin:`sql`, :djadmin:`sqlcustom`, and
|
||||||
:djadmin:`sqlindexes` commands.
|
:djadmin:`sqlindexes` commands.
|
||||||
|
|
||||||
|
|
|
@ -27,12 +27,12 @@ Activate the admin site
|
||||||
The Django admin site is not activated by default -- it's an opt-in thing. To
|
The Django admin site is not activated by default -- it's an opt-in thing. To
|
||||||
activate the admin site for your installation, do these three things:
|
activate the admin site for your installation, do these three things:
|
||||||
|
|
||||||
* Add ``"django.contrib.admin"`` to your :setting:`INSTALLED_APPS` setting.
|
* Add ``"django.contrib.admin"`` to your :setting:`INSTALLED_APPS` setting.
|
||||||
|
|
||||||
* Run ``python manage.py syncdb``. Since you have added a new application
|
* Run ``python manage.py syncdb``. Since you have added a new application
|
||||||
to :setting:`INSTALLED_APPS`, the database tables need to be updated.
|
to :setting:`INSTALLED_APPS`, the database tables need to be updated.
|
||||||
|
|
||||||
* Edit your ``mysite/urls.py`` file and uncomment the lines that reference
|
* Edit your ``mysite/urls.py`` file and uncomment the lines that reference
|
||||||
the admin -- there are three lines in total to uncomment. This file is a
|
the admin -- there are three lines in total to uncomment. This file is a
|
||||||
URLconf; we'll dig into URLconfs in the next tutorial. For now, all you
|
URLconf; we'll dig into URLconfs in the next tutorial. For now, all you
|
||||||
need to know is that it maps URL roots to applications. In the end, you
|
need to know is that it maps URL roots to applications. In the end, you
|
||||||
|
@ -145,29 +145,29 @@ Click the "What's up?" poll to edit it:
|
||||||
|
|
||||||
Things to note here:
|
Things to note here:
|
||||||
|
|
||||||
* The form is automatically generated from the Poll model.
|
* The form is automatically generated from the Poll model.
|
||||||
|
|
||||||
* The different model field types (:class:`~django.db.models.DateTimeField`,
|
* The different model field types (:class:`~django.db.models.DateTimeField`,
|
||||||
:class:`~django.db.models.CharField`) correspond to the appropriate HTML
|
:class:`~django.db.models.CharField`) correspond to the appropriate HTML
|
||||||
input widget. Each type of field knows how to display itself in the Django
|
input widget. Each type of field knows how to display itself in the Django
|
||||||
admin.
|
admin.
|
||||||
|
|
||||||
* Each :class:`~django.db.models.DateTimeField` gets free JavaScript
|
* Each :class:`~django.db.models.DateTimeField` gets free JavaScript
|
||||||
shortcuts. Dates get a "Today" shortcut and calendar popup, and times get
|
shortcuts. Dates get a "Today" shortcut and calendar popup, and times get
|
||||||
a "Now" shortcut and a convenient popup that lists commonly entered times.
|
a "Now" shortcut and a convenient popup that lists commonly entered times.
|
||||||
|
|
||||||
The bottom part of the page gives you a couple of options:
|
The bottom part of the page gives you a couple of options:
|
||||||
|
|
||||||
* Save -- Saves changes and returns to the change-list page for this type of
|
* Save -- Saves changes and returns to the change-list page for this type of
|
||||||
object.
|
object.
|
||||||
|
|
||||||
* Save and continue editing -- Saves changes and reloads the admin page for
|
* Save and continue editing -- Saves changes and reloads the admin page for
|
||||||
this object.
|
this object.
|
||||||
|
|
||||||
* Save and add another -- Saves changes and loads a new, blank form for this
|
* Save and add another -- Saves changes and loads a new, blank form for this
|
||||||
type of object.
|
type of object.
|
||||||
|
|
||||||
* Delete -- Displays a delete confirmation page.
|
* Delete -- Displays a delete confirmation page.
|
||||||
|
|
||||||
Change the "Date published" by clicking the "Today" and "Now" shortcuts. Then
|
Change the "Date published" by clicking the "Today" and "Now" shortcuts. Then
|
||||||
click "Save and continue editing." Then click "History" in the upper right.
|
click "Save and continue editing." Then click "History" in the upper right.
|
||||||
|
|
|
@ -13,30 +13,30 @@ A view is a "type" of Web page in your Django application that generally serves
|
||||||
a specific function and has a specific template. For example, in a Weblog
|
a specific function and has a specific template. For example, in a Weblog
|
||||||
application, you might have the following views:
|
application, you might have the following views:
|
||||||
|
|
||||||
* Blog homepage -- displays the latest few entries.
|
* Blog homepage -- displays the latest few entries.
|
||||||
|
|
||||||
* Entry "detail" page -- permalink page for a single entry.
|
* Entry "detail" page -- permalink page for a single entry.
|
||||||
|
|
||||||
* Year-based archive page -- displays all months with entries in the
|
* Year-based archive page -- displays all months with entries in the
|
||||||
given year.
|
given year.
|
||||||
|
|
||||||
* Month-based archive page -- displays all days with entries in the
|
* Month-based archive page -- displays all days with entries in the
|
||||||
given month.
|
given month.
|
||||||
|
|
||||||
* Day-based archive page -- displays all entries in the given day.
|
* Day-based archive page -- displays all entries in the given day.
|
||||||
|
|
||||||
* Comment action -- handles posting comments to a given entry.
|
* Comment action -- handles posting comments to a given entry.
|
||||||
|
|
||||||
In our poll application, we'll have the following four views:
|
In our poll application, we'll have the following four views:
|
||||||
|
|
||||||
* Poll "index" page -- displays the latest few polls.
|
* Poll "index" page -- displays the latest few polls.
|
||||||
|
|
||||||
* Poll "detail" page -- displays a poll question, with no results but
|
* Poll "detail" page -- displays a poll question, with no results but
|
||||||
with a form to vote.
|
with a form to vote.
|
||||||
|
|
||||||
* Poll "results" page -- displays results for a particular poll.
|
* Poll "results" page -- displays results for a particular poll.
|
||||||
|
|
||||||
* Vote action -- handles voting for a particular choice in a particular
|
* Vote action -- handles voting for a particular choice in a particular
|
||||||
poll.
|
poll.
|
||||||
|
|
||||||
In Django, each view is represented by a simple Python function.
|
In Django, each view is represented by a simple Python function.
|
||||||
|
@ -375,19 +375,19 @@ in ``django/conf/urls/defaults.py``, ``handler404`` is set to
|
||||||
|
|
||||||
Four more things to note about 404 views:
|
Four more things to note about 404 views:
|
||||||
|
|
||||||
* If :setting:`DEBUG` is set to ``True`` (in your settings module) then your
|
* If :setting:`DEBUG` is set to ``True`` (in your settings module) then your
|
||||||
404 view will never be used (and thus the ``404.html`` template will never
|
404 view will never be used (and thus the ``404.html`` template will never
|
||||||
be rendered) because the traceback will be displayed instead.
|
be rendered) because the traceback will be displayed instead.
|
||||||
|
|
||||||
* The 404 view is also called if Django doesn't find a match after checking
|
* The 404 view is also called if Django doesn't find a match after checking
|
||||||
every regular expression in the URLconf.
|
every regular expression in the URLconf.
|
||||||
|
|
||||||
* If you don't define your own 404 view -- and simply use the default, which
|
* If you don't define your own 404 view -- and simply use the default, which
|
||||||
is recommended -- you still have one obligation: To create a ``404.html``
|
is recommended -- you still have one obligation: To create a ``404.html``
|
||||||
template in the root of your template directory. The default 404 view will
|
template in the root of your template directory. The default 404 view will
|
||||||
use that template for all 404 errors.
|
use that template for all 404 errors.
|
||||||
|
|
||||||
* If :setting:`DEBUG` is set to ``False`` (in your settings module) and if
|
* If :setting:`DEBUG` is set to ``False`` (in your settings module) and if
|
||||||
you didn't create a ``404.html`` file, an ``Http500`` is raised instead.
|
you didn't create a ``404.html`` file, an ``Http500`` is raised instead.
|
||||||
So remember to create a ``404.html``.
|
So remember to create a ``404.html``.
|
||||||
|
|
||||||
|
@ -517,9 +517,9 @@ URLconf for further processing.
|
||||||
|
|
||||||
Here's what happens if a user goes to "/polls/34/" in this system:
|
Here's what happens if a user goes to "/polls/34/" in this system:
|
||||||
|
|
||||||
* Django will find the match at ``'^polls/'``
|
* Django will find the match at ``'^polls/'``
|
||||||
|
|
||||||
* Then, Django will strip off the matching text (``"polls/"``) and send the
|
* Then, Django will strip off the matching text (``"polls/"``) and send the
|
||||||
remaining text -- ``"34/"`` -- to the 'polls.urls' URLconf for
|
remaining text -- ``"34/"`` -- to the 'polls.urls' URLconf for
|
||||||
further processing.
|
further processing.
|
||||||
|
|
||||||
|
|
|
@ -29,23 +29,23 @@ tutorial, so that the template contains an HTML ``<form>`` element:
|
||||||
|
|
||||||
A quick rundown:
|
A quick rundown:
|
||||||
|
|
||||||
* The above template displays a radio button for each poll choice. The
|
* The above template displays a radio button for each poll choice. The
|
||||||
``value`` of each radio button is the associated poll choice's ID. The
|
``value`` of each radio button is the associated poll choice's ID. The
|
||||||
``name`` of each radio button is ``"choice"``. That means, when somebody
|
``name`` of each radio button is ``"choice"``. That means, when somebody
|
||||||
selects one of the radio buttons and submits the form, it'll send the
|
selects one of the radio buttons and submits the form, it'll send the
|
||||||
POST data ``choice=3``. This is HTML Forms 101.
|
POST data ``choice=3``. This is HTML Forms 101.
|
||||||
|
|
||||||
* We set the form's ``action`` to ``/polls/{{ poll.id }}/vote/``, and we
|
* We set the form's ``action`` to ``/polls/{{ poll.id }}/vote/``, and we
|
||||||
set ``method="post"``. Using ``method="post"`` (as opposed to
|
set ``method="post"``. Using ``method="post"`` (as opposed to
|
||||||
``method="get"``) is very important, because the act of submitting this
|
``method="get"``) is very important, because the act of submitting this
|
||||||
form will alter data server-side. Whenever you create a form that alters
|
form will alter data server-side. Whenever you create a form that alters
|
||||||
data server-side, use ``method="post"``. This tip isn't specific to
|
data server-side, use ``method="post"``. This tip isn't specific to
|
||||||
Django; it's just good Web development practice.
|
Django; it's just good Web development practice.
|
||||||
|
|
||||||
* ``forloop.counter`` indicates how many times the :ttag:`for` tag has gone
|
* ``forloop.counter`` indicates how many times the :ttag:`for` tag has gone
|
||||||
through its loop
|
through its loop
|
||||||
|
|
||||||
* Since we're creating a POST form (which can have the effect of modifying
|
* Since we're creating a POST form (which can have the effect of modifying
|
||||||
data), we need to worry about Cross Site Request Forgeries.
|
data), we need to worry about Cross Site Request Forgeries.
|
||||||
Thankfully, you don't have to worry too hard, because Django comes with
|
Thankfully, you don't have to worry too hard, because Django comes with
|
||||||
a very easy-to-use system for protecting against it. In short, all POST
|
a very easy-to-use system for protecting against it. In short, all POST
|
||||||
|
@ -102,7 +102,7 @@ create a real version. Add the following to ``polls/views.py``::
|
||||||
|
|
||||||
This code includes a few things we haven't covered yet in this tutorial:
|
This code includes a few things we haven't covered yet in this tutorial:
|
||||||
|
|
||||||
* :attr:`request.POST <django.http.HttpRequest.POST>` is a dictionary-like
|
* :attr:`request.POST <django.http.HttpRequest.POST>` is a dictionary-like
|
||||||
object that lets you access submitted data by key name. In this case,
|
object that lets you access submitted data by key name. In this case,
|
||||||
``request.POST['choice']`` returns the ID of the selected choice, as a
|
``request.POST['choice']`` returns the ID of the selected choice, as a
|
||||||
string. :attr:`request.POST <django.http.HttpRequest.POST>` values are
|
string. :attr:`request.POST <django.http.HttpRequest.POST>` values are
|
||||||
|
@ -114,11 +114,11 @@ This code includes a few things we haven't covered yet in this tutorial:
|
||||||
<django.http.HttpRequest.POST>` in our code, to ensure that data is only
|
<django.http.HttpRequest.POST>` in our code, to ensure that data is only
|
||||||
altered via a POST call.
|
altered via a POST call.
|
||||||
|
|
||||||
* ``request.POST['choice']`` will raise :exc:`KeyError` if ``choice`` wasn't
|
* ``request.POST['choice']`` will raise :exc:`KeyError` if ``choice`` wasn't
|
||||||
provided in POST data. The above code checks for :exc:`KeyError` and
|
provided in POST data. The above code checks for :exc:`KeyError` and
|
||||||
redisplays the poll form with an error message if ``choice`` isn't given.
|
redisplays the poll form with an error message if ``choice`` isn't given.
|
||||||
|
|
||||||
* After incrementing the choice count, the code returns an
|
* After incrementing the choice count, the code returns an
|
||||||
:class:`~django.http.HttpResponseRedirect` rather than a normal
|
:class:`~django.http.HttpResponseRedirect` rather than a normal
|
||||||
:class:`~django.http.HttpResponse`.
|
:class:`~django.http.HttpResponse`.
|
||||||
:class:`~django.http.HttpResponseRedirect` takes a single argument: the
|
:class:`~django.http.HttpResponseRedirect` takes a single argument: the
|
||||||
|
@ -130,7 +130,7 @@ This code includes a few things we haven't covered yet in this tutorial:
|
||||||
POST data. This tip isn't specific to Django; it's just good Web
|
POST data. This tip isn't specific to Django; it's just good Web
|
||||||
development practice.
|
development practice.
|
||||||
|
|
||||||
* We are using the :func:`~django.core.urlresolvers.reverse` function in the
|
* We are using the :func:`~django.core.urlresolvers.reverse` function in the
|
||||||
:class:`~django.http.HttpResponseRedirect` constructor in this example.
|
:class:`~django.http.HttpResponseRedirect` constructor in this example.
|
||||||
This function helps avoid having to hardcode a URL in the view function.
|
This function helps avoid having to hardcode a URL in the view function.
|
||||||
It is given the name of the view that we want to pass control to and the
|
It is given the name of the view that we want to pass control to and the
|
||||||
|
@ -197,11 +197,11 @@ Let's convert our poll app to use the generic views system, so we can delete a
|
||||||
bunch of our own code. We'll just have to take a few steps to make the
|
bunch of our own code. We'll just have to take a few steps to make the
|
||||||
conversion. We will:
|
conversion. We will:
|
||||||
|
|
||||||
1. Convert the URLconf.
|
1. Convert the URLconf.
|
||||||
|
|
||||||
2. Delete some of the old, unneeded views.
|
2. Delete some of the old, unneeded views.
|
||||||
|
|
||||||
3. Fix up URL handling for the new views.
|
3. Fix up URL handling for the new views.
|
||||||
|
|
||||||
Read on for details.
|
Read on for details.
|
||||||
|
|
||||||
|
@ -257,15 +257,15 @@ We're using two generic views here:
|
||||||
two views abstract the concepts of "display a list of objects" and
|
two views abstract the concepts of "display a list of objects" and
|
||||||
"display a detail page for a particular type of object."
|
"display a detail page for a particular type of object."
|
||||||
|
|
||||||
* Each generic view needs to know what model it will be acting
|
* Each generic view needs to know what model it will be acting
|
||||||
upon. This is provided using the ``model`` parameter.
|
upon. This is provided using the ``model`` parameter.
|
||||||
|
|
||||||
* The :class:`~django.views.generic.list.DetailView` generic view
|
* The :class:`~django.views.generic.list.DetailView` generic view
|
||||||
expects the primary key value captured from the URL to be called
|
expects the primary key value captured from the URL to be called
|
||||||
``"pk"``, so we've changed ``poll_id`` to ``pk`` for the generic
|
``"pk"``, so we've changed ``poll_id`` to ``pk`` for the generic
|
||||||
views.
|
views.
|
||||||
|
|
||||||
* We've added a name, ``poll_results``, to the results view so
|
* We've added a name, ``poll_results``, to the results view so
|
||||||
that we have a way to refer to its URL later on (see the
|
that we have a way to refer to its URL later on (see the
|
||||||
documentation about :ref:`naming URL patterns
|
documentation about :ref:`naming URL patterns
|
||||||
<naming-url-patterns>` for information). We're also using the
|
<naming-url-patterns>` for information). We're also using the
|
||||||
|
@ -328,12 +328,12 @@ Coming soon
|
||||||
The tutorial ends here for the time being. Future installments of the tutorial
|
The tutorial ends here for the time being. Future installments of the tutorial
|
||||||
will cover:
|
will cover:
|
||||||
|
|
||||||
* Advanced form processing
|
* Advanced form processing
|
||||||
* Using the RSS framework
|
* Using the RSS framework
|
||||||
* Using the cache framework
|
* Using the cache framework
|
||||||
* Using the comments framework
|
* Using the comments framework
|
||||||
* Advanced admin features: Permissions
|
* Advanced admin features: Permissions
|
||||||
* Advanced admin features: Custom JavaScript
|
* Advanced admin features: Custom JavaScript
|
||||||
|
|
||||||
In the meantime, you might want to check out some pointers on :doc:`where to go
|
In the meantime, you might want to check out some pointers on :doc:`where to go
|
||||||
from here </intro/whatsnext>`
|
from here </intro/whatsnext>`
|
||||||
|
|
|
@ -35,12 +35,12 @@ How the documentation is organized
|
||||||
Django's main documentation is broken up into "chunks" designed to fill
|
Django's main documentation is broken up into "chunks" designed to fill
|
||||||
different needs:
|
different needs:
|
||||||
|
|
||||||
* The :doc:`introductory material </intro/index>` is designed for people new
|
* The :doc:`introductory material </intro/index>` is designed for people new
|
||||||
to Django -- or to Web development in general. It doesn't cover anything
|
to Django -- or to Web development in general. It doesn't cover anything
|
||||||
in depth, but instead gives a high-level overview of how developing in
|
in depth, but instead gives a high-level overview of how developing in
|
||||||
Django "feels".
|
Django "feels".
|
||||||
|
|
||||||
* The :doc:`topic guides </topics/index>`, on the other hand, dive deep into
|
* The :doc:`topic guides </topics/index>`, on the other hand, dive deep into
|
||||||
individual parts of Django. There are complete guides to Django's
|
individual parts of Django. There are complete guides to Django's
|
||||||
:doc:`model system </topics/db/index>`, :doc:`template engine
|
:doc:`model system </topics/db/index>`, :doc:`template engine
|
||||||
</topics/templates>`, :doc:`forms framework </topics/forms/index>`, and much
|
</topics/templates>`, :doc:`forms framework </topics/forms/index>`, and much
|
||||||
|
@ -50,7 +50,7 @@ different needs:
|
||||||
your way through these guides you should come out knowing pretty much
|
your way through these guides you should come out knowing pretty much
|
||||||
everything there is to know about Django.
|
everything there is to know about Django.
|
||||||
|
|
||||||
* Web development is often broad, not deep -- problems span many domains.
|
* Web development is often broad, not deep -- problems span many domains.
|
||||||
We've written a set of :doc:`how-to guides </howto/index>` that answer
|
We've written a set of :doc:`how-to guides </howto/index>` that answer
|
||||||
common "How do I ...?" questions. Here you'll find information about
|
common "How do I ...?" questions. Here you'll find information about
|
||||||
:doc:`generating PDFs with Django </howto/outputting-pdf>`, :doc:`writing
|
:doc:`generating PDFs with Django </howto/outputting-pdf>`, :doc:`writing
|
||||||
|
@ -59,14 +59,14 @@ different needs:
|
||||||
Answers to really common questions can also be found in the :doc:`FAQ
|
Answers to really common questions can also be found in the :doc:`FAQ
|
||||||
</faq/index>`.
|
</faq/index>`.
|
||||||
|
|
||||||
* The guides and how-to's don't cover every single class, function, and
|
* The guides and how-to's don't cover every single class, function, and
|
||||||
method available in Django -- that would be overwhelming when you're
|
method available in Django -- that would be overwhelming when you're
|
||||||
trying to learn. Instead, details about individual classes, functions,
|
trying to learn. Instead, details about individual classes, functions,
|
||||||
methods, and modules are kept in the :doc:`reference </ref/index>`. This is
|
methods, and modules are kept in the :doc:`reference </ref/index>`. This is
|
||||||
where you'll turn to find the details of a particular function or
|
where you'll turn to find the details of a particular function or
|
||||||
whathaveyou.
|
whathaveyou.
|
||||||
|
|
||||||
* Finally, there's some "specialized" documentation not usually relevant to
|
* Finally, there's some "specialized" documentation not usually relevant to
|
||||||
most developers. This includes the :doc:`release notes </releases/index>`,
|
most developers. This includes the :doc:`release notes </releases/index>`,
|
||||||
:doc:`documentation of obsolete features </obsolete/index>`,
|
:doc:`documentation of obsolete features </obsolete/index>`,
|
||||||
:doc:`internals documentation </internals/index>` for those who want to add
|
:doc:`internals documentation </internals/index>` for those who want to add
|
||||||
|
@ -81,15 +81,15 @@ Just as the Django code base is developed and improved on a daily basis, our
|
||||||
documentation is consistently improving. We improve documentation for several
|
documentation is consistently improving. We improve documentation for several
|
||||||
reasons:
|
reasons:
|
||||||
|
|
||||||
* To make content fixes, such as grammar/typo corrections.
|
* To make content fixes, such as grammar/typo corrections.
|
||||||
|
|
||||||
* To add information and/or examples to existing sections that need to be
|
* To add information and/or examples to existing sections that need to be
|
||||||
expanded.
|
expanded.
|
||||||
|
|
||||||
* To document Django features that aren't yet documented. (The list of
|
* To document Django features that aren't yet documented. (The list of
|
||||||
such features is shrinking but exists nonetheless.)
|
such features is shrinking but exists nonetheless.)
|
||||||
|
|
||||||
* To add documentation for new features as new features get added, or as
|
* To add documentation for new features as new features get added, or as
|
||||||
Django APIs or behaviors change.
|
Django APIs or behaviors change.
|
||||||
|
|
||||||
Django's documentation is kept in the same source control system as its code. It
|
Django's documentation is kept in the same source control system as its code. It
|
||||||
|
@ -164,7 +164,7 @@ As HTML, locally
|
||||||
|
|
||||||
You can get a local copy of the HTML documentation following a few easy steps:
|
You can get a local copy of the HTML documentation following a few easy steps:
|
||||||
|
|
||||||
* Django's documentation uses a system called Sphinx__ to convert from
|
* Django's documentation uses a system called Sphinx__ to convert from
|
||||||
plain text to HTML. You'll need to install Sphinx by either downloading
|
plain text to HTML. You'll need to install Sphinx by either downloading
|
||||||
and installing the package from the Sphinx Web site, or by Python's
|
and installing the package from the Sphinx Web site, or by Python's
|
||||||
``easy_install``:
|
``easy_install``:
|
||||||
|
@ -173,7 +173,7 @@ You can get a local copy of the HTML documentation following a few easy steps:
|
||||||
|
|
||||||
$ easy_install Sphinx
|
$ easy_install Sphinx
|
||||||
|
|
||||||
* Then, just use the included ``Makefile`` to turn the documentation into
|
* Then, just use the included ``Makefile`` to turn the documentation into
|
||||||
HTML:
|
HTML:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
@ -190,7 +190,7 @@ You can get a local copy of the HTML documentation following a few easy steps:
|
||||||
cd path\to\django\docs
|
cd path\to\django\docs
|
||||||
make.bat html
|
make.bat html
|
||||||
|
|
||||||
* The HTML documentation will be placed in ``docs/_build/html``.
|
* The HTML documentation will be placed in ``docs/_build/html``.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -212,19 +212,19 @@ versions of the framework.
|
||||||
|
|
||||||
We follow this policy:
|
We follow this policy:
|
||||||
|
|
||||||
* The primary documentation on djangoproject.com is an HTML version of the
|
* The primary documentation on djangoproject.com is an HTML version of the
|
||||||
latest docs in Subversion. These docs always correspond to the latest
|
latest docs in Subversion. These docs always correspond to the latest
|
||||||
official Django release, plus whatever features we've added/changed in
|
official Django release, plus whatever features we've added/changed in
|
||||||
the framework *since* the latest release.
|
the framework *since* the latest release.
|
||||||
|
|
||||||
* As we add features to Django's development version, we try to update the
|
* As we add features to Django's development version, we try to update the
|
||||||
documentation in the same Subversion commit transaction.
|
documentation in the same Subversion commit transaction.
|
||||||
|
|
||||||
* To distinguish feature changes/additions in the docs, we use the phrase:
|
* To distinguish feature changes/additions in the docs, we use the phrase:
|
||||||
"New in version X.Y", being X.Y the next release version (hence, the one
|
"New in version X.Y", being X.Y the next release version (hence, the one
|
||||||
being developed).
|
being developed).
|
||||||
|
|
||||||
* Documentation for a particular Django release is frozen once the version
|
* Documentation for a particular Django release is frozen once the version
|
||||||
has been released officially. It remains a snapshot of the docs as of the
|
has been released officially. It remains a snapshot of the docs as of the
|
||||||
moment of the release. We will make exceptions to this rule in
|
moment of the release. We will make exceptions to this rule in
|
||||||
the case of retroactive security updates or other such retroactive
|
the case of retroactive security updates or other such retroactive
|
||||||
|
@ -232,7 +232,7 @@ We follow this policy:
|
||||||
frozen document that says "These docs are frozen for Django version XXX"
|
frozen document that says "These docs are frozen for Django version XXX"
|
||||||
and links to the current version of that document.
|
and links to the current version of that document.
|
||||||
|
|
||||||
* The `main documentation Web page`_ includes links to documentation for
|
* The `main documentation Web page`_ includes links to documentation for
|
||||||
all previous versions.
|
all previous versions.
|
||||||
|
|
||||||
.. _main documentation Web page: http://docs.djangoproject.com/en/dev/
|
.. _main documentation Web page: http://docs.djangoproject.com/en/dev/
|
||||||
|
|
|
@ -12,15 +12,15 @@ What "stable" means
|
||||||
|
|
||||||
In this context, stable means:
|
In this context, stable means:
|
||||||
|
|
||||||
- All the public APIs -- everything documented in the linked documents below,
|
- All the public APIs -- everything documented in the linked documents below,
|
||||||
and all methods that don't begin with an underscore -- will not be moved or
|
and all methods that don't begin with an underscore -- will not be moved or
|
||||||
renamed without providing backwards-compatible aliases.
|
renamed without providing backwards-compatible aliases.
|
||||||
|
|
||||||
- If new features are added to these APIs -- which is quite possible --
|
- If new features are added to these APIs -- which is quite possible --
|
||||||
they will not break or change the meaning of existing methods. In other
|
they will not break or change the meaning of existing methods. In other
|
||||||
words, "stable" does not (necessarily) mean "complete."
|
words, "stable" does not (necessarily) mean "complete."
|
||||||
|
|
||||||
- If, for some reason, an API declared stable must be removed or replaced, it
|
- If, for some reason, an API declared stable must be removed or replaced, it
|
||||||
will be declared deprecated but will remain in the API for at least two
|
will be declared deprecated but will remain in the API for at least two
|
||||||
minor version releases. Warnings will be issued when the deprecated method
|
minor version releases. Warnings will be issued when the deprecated method
|
||||||
is called.
|
is called.
|
||||||
|
@ -28,7 +28,7 @@ In this context, stable means:
|
||||||
See :ref:`official-releases` for more details on how Django's version
|
See :ref:`official-releases` for more details on how Django's version
|
||||||
numbering scheme works, and how features will be deprecated.
|
numbering scheme works, and how features will be deprecated.
|
||||||
|
|
||||||
- We'll only break backwards compatibility of these APIs if a bug or
|
- We'll only break backwards compatibility of these APIs if a bug or
|
||||||
security hole makes it completely unavoidable.
|
security hole makes it completely unavoidable.
|
||||||
|
|
||||||
Stable APIs
|
Stable APIs
|
||||||
|
@ -38,58 +38,58 @@ In general, everything covered in the documentation -- with the exception of
|
||||||
anything in the :doc:`internals area </internals/index>` is considered stable as
|
anything in the :doc:`internals area </internals/index>` is considered stable as
|
||||||
of 1.0. This includes these APIs:
|
of 1.0. This includes these APIs:
|
||||||
|
|
||||||
- :doc:`Authorization </topics/auth>`
|
- :doc:`Authorization </topics/auth>`
|
||||||
|
|
||||||
- :doc:`Caching </topics/cache>`.
|
- :doc:`Caching </topics/cache>`.
|
||||||
|
|
||||||
- :doc:`Model definition, managers, querying and transactions
|
- :doc:`Model definition, managers, querying and transactions
|
||||||
</topics/db/index>`
|
</topics/db/index>`
|
||||||
|
|
||||||
- :doc:`Sending email </topics/email>`.
|
- :doc:`Sending email </topics/email>`.
|
||||||
|
|
||||||
- :doc:`File handling and storage </topics/files>`
|
- :doc:`File handling and storage </topics/files>`
|
||||||
|
|
||||||
- :doc:`Forms </topics/forms/index>`
|
- :doc:`Forms </topics/forms/index>`
|
||||||
|
|
||||||
- :doc:`HTTP request/response handling </topics/http/index>`, including file
|
- :doc:`HTTP request/response handling </topics/http/index>`, including file
|
||||||
uploads, middleware, sessions, URL resolution, view, and shortcut APIs.
|
uploads, middleware, sessions, URL resolution, view, and shortcut APIs.
|
||||||
|
|
||||||
- :doc:`Generic views </topics/http/generic-views>`.
|
- :doc:`Generic views </topics/http/generic-views>`.
|
||||||
|
|
||||||
- :doc:`Internationalization </topics/i18n/index>`.
|
- :doc:`Internationalization </topics/i18n/index>`.
|
||||||
|
|
||||||
- :doc:`Pagination </topics/pagination>`
|
- :doc:`Pagination </topics/pagination>`
|
||||||
|
|
||||||
- :doc:`Serialization </topics/serialization>`
|
- :doc:`Serialization </topics/serialization>`
|
||||||
|
|
||||||
- :doc:`Signals </topics/signals>`
|
- :doc:`Signals </topics/signals>`
|
||||||
|
|
||||||
- :doc:`Templates </topics/templates>`, including the language, Python-level
|
- :doc:`Templates </topics/templates>`, including the language, Python-level
|
||||||
:doc:`template APIs </ref/templates/index>`, and :doc:`custom template tags
|
:doc:`template APIs </ref/templates/index>`, and :doc:`custom template tags
|
||||||
and libraries </howto/custom-template-tags>`. We may add new template
|
and libraries </howto/custom-template-tags>`. We may add new template
|
||||||
tags in the future and the names may inadvertently clash with
|
tags in the future and the names may inadvertently clash with
|
||||||
external template tags. Before adding any such tags, we'll ensure that
|
external template tags. Before adding any such tags, we'll ensure that
|
||||||
Django raises an error if it tries to load tags with duplicate names.
|
Django raises an error if it tries to load tags with duplicate names.
|
||||||
|
|
||||||
- :doc:`Testing </topics/testing>`
|
- :doc:`Testing </topics/testing>`
|
||||||
|
|
||||||
- :doc:`django-admin utility </ref/django-admin>`.
|
- :doc:`django-admin utility </ref/django-admin>`.
|
||||||
|
|
||||||
- :doc:`Built-in middleware </ref/middleware>`
|
- :doc:`Built-in middleware </ref/middleware>`
|
||||||
|
|
||||||
- :doc:`Request/response objects </ref/request-response>`.
|
- :doc:`Request/response objects </ref/request-response>`.
|
||||||
|
|
||||||
- :doc:`Settings </ref/settings>`. Note, though that while the :doc:`list of
|
- :doc:`Settings </ref/settings>`. Note, though that while the :doc:`list of
|
||||||
built-in settings </ref/settings>` can be considered complete we may -- and
|
built-in settings </ref/settings>` can be considered complete we may -- and
|
||||||
probably will -- add new settings in future versions. This is one of those
|
probably will -- add new settings in future versions. This is one of those
|
||||||
places where "'stable' does not mean 'complete.'"
|
places where "'stable' does not mean 'complete.'"
|
||||||
|
|
||||||
- :doc:`Built-in signals </ref/signals>`. Like settings, we'll probably add
|
- :doc:`Built-in signals </ref/signals>`. Like settings, we'll probably add
|
||||||
new signals in the future, but the existing ones won't break.
|
new signals in the future, but the existing ones won't break.
|
||||||
|
|
||||||
- :doc:`Unicode handling </ref/unicode>`.
|
- :doc:`Unicode handling </ref/unicode>`.
|
||||||
|
|
||||||
- Everything covered by the :doc:`HOWTO guides </howto/index>`.
|
- Everything covered by the :doc:`HOWTO guides </howto/index>`.
|
||||||
|
|
||||||
``django.utils``
|
``django.utils``
|
||||||
----------------
|
----------------
|
||||||
|
@ -97,15 +97,15 @@ of 1.0. This includes these APIs:
|
||||||
Most of the modules in ``django.utils`` are designed for internal use. Only
|
Most of the modules in ``django.utils`` are designed for internal use. Only
|
||||||
the following parts of :doc:`django.utils </ref/utils>` can be considered stable:
|
the following parts of :doc:`django.utils </ref/utils>` can be considered stable:
|
||||||
|
|
||||||
- ``django.utils.cache``
|
- ``django.utils.cache``
|
||||||
- ``django.utils.datastructures.SortedDict`` -- only this single class; the
|
- ``django.utils.datastructures.SortedDict`` -- only this single class; the
|
||||||
rest of the module is for internal use.
|
rest of the module is for internal use.
|
||||||
- ``django.utils.encoding``
|
- ``django.utils.encoding``
|
||||||
- ``django.utils.feedgenerator``
|
- ``django.utils.feedgenerator``
|
||||||
- ``django.utils.http``
|
- ``django.utils.http``
|
||||||
- ``django.utils.safestring``
|
- ``django.utils.safestring``
|
||||||
- ``django.utils.translation``
|
- ``django.utils.translation``
|
||||||
- ``django.utils.tzinfo``
|
- ``django.utils.tzinfo``
|
||||||
|
|
||||||
Exceptions
|
Exceptions
|
||||||
==========
|
==========
|
||||||
|
@ -142,11 +142,11 @@ APIs marked as internal
|
||||||
|
|
||||||
Certain APIs are explicitly marked as "internal" in a couple of ways:
|
Certain APIs are explicitly marked as "internal" in a couple of ways:
|
||||||
|
|
||||||
- Some documentation refers to internals and mentions them as such. If the
|
- Some documentation refers to internals and mentions them as such. If the
|
||||||
documentation says that something is internal, we reserve the right to
|
documentation says that something is internal, we reserve the right to
|
||||||
change it.
|
change it.
|
||||||
|
|
||||||
- Functions, methods, and other objects prefixed by a leading underscore
|
- Functions, methods, and other objects prefixed by a leading underscore
|
||||||
(``_``). This is the standard Python way of indicating that something is
|
(``_``). This is the standard Python way of indicating that something is
|
||||||
private; if any method starts with a single ``_``, it's an internal API.
|
private; if any method starts with a single ``_``, it's an internal API.
|
||||||
|
|
||||||
|
@ -174,28 +174,28 @@ database -- including values that may no longer be valid.
|
||||||
Therefore, Django has the following policy with respect to changes in
|
Therefore, Django has the following policy with respect to changes in
|
||||||
local flavor:
|
local flavor:
|
||||||
|
|
||||||
* At the time of a Django release, the data and algorithms
|
* At the time of a Django release, the data and algorithms
|
||||||
contained in :mod:`django.contrib.localflavor` will, to the best
|
contained in :mod:`django.contrib.localflavor` will, to the best
|
||||||
of our ability, reflect the officially gazetted policies of the
|
of our ability, reflect the officially gazetted policies of the
|
||||||
appropriate local government authority. If a province has been
|
appropriate local government authority. If a province has been
|
||||||
added, altered, or removed, that change will be reflected in
|
added, altered, or removed, that change will be reflected in
|
||||||
Django's localflavor.
|
Django's localflavor.
|
||||||
|
|
||||||
* These changes will *not* be backported to the previous stable
|
* These changes will *not* be backported to the previous stable
|
||||||
release. Upgrading a minor version of Django should not require
|
release. Upgrading a minor version of Django should not require
|
||||||
any data migration or audits for UI changes; therefore, if you
|
any data migration or audits for UI changes; therefore, if you
|
||||||
want to get the latest province list, you will either need to
|
want to get the latest province list, you will either need to
|
||||||
upgrade your Django install, or backport the province list you
|
upgrade your Django install, or backport the province list you
|
||||||
need.
|
need.
|
||||||
|
|
||||||
* For one release, the affected localflavor module will raise a
|
* For one release, the affected localflavor module will raise a
|
||||||
``RuntimeWarning`` when it is imported.
|
``RuntimeWarning`` when it is imported.
|
||||||
|
|
||||||
* The change will be announced in the release notes as a backwards
|
* The change will be announced in the release notes as a backwards
|
||||||
incompatible change requiring attention. The change will also be
|
incompatible change requiring attention. The change will also be
|
||||||
annotated in the documentation for the localflavor module.
|
annotated in the documentation for the localflavor module.
|
||||||
|
|
||||||
* Where necessary and feasible, a migration script will be provided
|
* Where necessary and feasible, a migration script will be provided
|
||||||
to aid the migration process.
|
to aid the migration process.
|
||||||
|
|
||||||
For example, Django 1.2 contains an Indonesian localflavor. It has a
|
For example, Django 1.2 contains an Indonesian localflavor. It has a
|
||||||
|
|
|
@ -254,8 +254,8 @@ Don't invent a programming language
|
||||||
|
|
||||||
The template system intentionally doesn't allow the following:
|
The template system intentionally doesn't allow the following:
|
||||||
|
|
||||||
* Assignment to variables
|
* Assignment to variables
|
||||||
* Advanced logic
|
* Advanced logic
|
||||||
|
|
||||||
The goal is not to invent a programming language. The goal is to offer just
|
The goal is not to invent a programming language. The goal is to offer just
|
||||||
enough programming-esque functionality, such as branching and looping, that is
|
enough programming-esque functionality, such as branching and looping, that is
|
||||||
|
|
|
@ -41,11 +41,11 @@ usable generic views.
|
||||||
For example, the :class:`~django.views.generic.base.detail.DetailView`
|
For example, the :class:`~django.views.generic.base.detail.DetailView`
|
||||||
is composed from:
|
is composed from:
|
||||||
|
|
||||||
* :class:`~django.db.views.generic.base.View`, which provides the
|
* :class:`~django.db.views.generic.base.View`, which provides the
|
||||||
basic class-based behavior
|
basic class-based behavior
|
||||||
* :class:`~django.db.views.generic.detail.SingleObjectMixin`, which
|
* :class:`~django.db.views.generic.detail.SingleObjectMixin`, which
|
||||||
provides the utilities for retrieving and displaying a single object
|
provides the utilities for retrieving and displaying a single object
|
||||||
* :class:`~django.db.views.generic.detail.SingleObjectTemplateResponseMixin`,
|
* :class:`~django.db.views.generic.detail.SingleObjectTemplateResponseMixin`,
|
||||||
which provides the tools for rendering a single object into a
|
which provides the tools for rendering a single object into a
|
||||||
template-based response.
|
template-based response.
|
||||||
|
|
||||||
|
|
|
@ -73,9 +73,9 @@ First, we'll need to write a function that gets called when the action is
|
||||||
trigged from the admin. Action functions are just regular functions that take
|
trigged from the admin. Action functions are just regular functions that take
|
||||||
three arguments:
|
three arguments:
|
||||||
|
|
||||||
* The current :class:`ModelAdmin`
|
* The current :class:`ModelAdmin`
|
||||||
* An :class:`~django.http.HttpRequest` representing the current request,
|
* An :class:`~django.http.HttpRequest` representing the current request,
|
||||||
* A :class:`~django.db.models.query.QuerySet` containing the set of
|
* A :class:`~django.db.models.query.QuerySet` containing the set of
|
||||||
objects selected by the user.
|
objects selected by the user.
|
||||||
|
|
||||||
Our publish-these-articles function won't need the :class:`ModelAdmin` or the
|
Our publish-these-articles function won't need the :class:`ModelAdmin` or the
|
||||||
|
|
|
@ -22,15 +22,15 @@ Overview
|
||||||
To activate the :mod:`~django.contrib.admindocs`, you will need to do
|
To activate the :mod:`~django.contrib.admindocs`, you will need to do
|
||||||
the following:
|
the following:
|
||||||
|
|
||||||
* Add :mod:`django.contrib.admindocs` to your :setting:`INSTALLED_APPS`.
|
* Add :mod:`django.contrib.admindocs` to your :setting:`INSTALLED_APPS`.
|
||||||
* Add ``(r'^admin/doc/', include('django.contrib.admindocs.urls'))`` to
|
* Add ``(r'^admin/doc/', include('django.contrib.admindocs.urls'))`` to
|
||||||
your :data:`urlpatterns`. Make sure it's included *before* the
|
your :data:`urlpatterns`. Make sure it's included *before* the
|
||||||
``r'^admin/'`` entry, so that requests to ``/admin/doc/`` don't get
|
``r'^admin/'`` entry, so that requests to ``/admin/doc/`` don't get
|
||||||
handled by the latter entry.
|
handled by the latter entry.
|
||||||
* Install the docutils Python module (http://docutils.sf.net/).
|
* Install the docutils Python module (http://docutils.sf.net/).
|
||||||
* **Optional:** Linking to templates requires the :setting:`ADMIN_FOR`
|
* **Optional:** Linking to templates requires the :setting:`ADMIN_FOR`
|
||||||
setting to be configured.
|
setting to be configured.
|
||||||
* **Optional:** Using the admindocs bookmarklets requires the
|
* **Optional:** Using the admindocs bookmarklets requires the
|
||||||
:mod:`XViewMiddleware<django.middleware.doc>` to be installed.
|
:mod:`XViewMiddleware<django.middleware.doc>` to be installed.
|
||||||
|
|
||||||
Once those steps are complete, you can start browsing the documentation by
|
Once those steps are complete, you can start browsing the documentation by
|
||||||
|
@ -85,9 +85,9 @@ Each URL in your site has a separate entry in the ``admindocs`` page, and
|
||||||
clicking on a given URL will show you the corresponding view. Helpful things
|
clicking on a given URL will show you the corresponding view. Helpful things
|
||||||
you can document in your view function docstrings include:
|
you can document in your view function docstrings include:
|
||||||
|
|
||||||
* A short description of what the view does.
|
* A short description of what the view does.
|
||||||
* The **context**, or a list of variables available in the view's template.
|
* The **context**, or a list of variables available in the view's template.
|
||||||
* The name of the template or templates that are used for that view.
|
* The name of the template or templates that are used for that view.
|
||||||
|
|
||||||
For example::
|
For example::
|
||||||
|
|
||||||
|
@ -141,15 +141,15 @@ Included Bookmarklets
|
||||||
|
|
||||||
Several useful bookmarklets are available from the ``admindocs`` page:
|
Several useful bookmarklets are available from the ``admindocs`` page:
|
||||||
|
|
||||||
Documentation for this page
|
Documentation for this page
|
||||||
Jumps you from any page to the documentation for the view that generates
|
Jumps you from any page to the documentation for the view that generates
|
||||||
that page.
|
that page.
|
||||||
|
|
||||||
Show object ID
|
Show object ID
|
||||||
Shows the content-type and unique ID for pages that represent a single
|
Shows the content-type and unique ID for pages that represent a single
|
||||||
object.
|
object.
|
||||||
|
|
||||||
Edit this object
|
Edit this object
|
||||||
Jumps to the admin page for pages that represent a single object.
|
Jumps to the admin page for pages that represent a single object.
|
||||||
|
|
||||||
Using these bookmarklets requires that you are either logged into the
|
Using these bookmarklets requires that you are either logged into the
|
||||||
|
|
|
@ -41,13 +41,13 @@ comment model has no field for that title.
|
||||||
|
|
||||||
To make this kind of customization, we'll need to do three things:
|
To make this kind of customization, we'll need to do three things:
|
||||||
|
|
||||||
#. Create a custom comment :class:`~django.db.models.Model` that adds on the
|
#. Create a custom comment :class:`~django.db.models.Model` that adds on the
|
||||||
"title" field.
|
"title" field.
|
||||||
|
|
||||||
#. Create a custom comment :class:`~django.forms.Form` that also adds this
|
#. Create a custom comment :class:`~django.forms.Form` that also adds this
|
||||||
"title" field.
|
"title" field.
|
||||||
|
|
||||||
#. Inform Django of these objects by defining a few functions in a
|
#. Inform Django of these objects by defining a few functions in a
|
||||||
custom :setting:`COMMENTS_APP`.
|
custom :setting:`COMMENTS_APP`.
|
||||||
|
|
||||||
So, carrying on the example above, we're dealing with a typical app structure in
|
So, carrying on the example above, we're dealing with a typical app structure in
|
||||||
|
|
|
@ -22,12 +22,12 @@ Quick start guide
|
||||||
|
|
||||||
To get started using the ``comments`` app, follow these steps:
|
To get started using the ``comments`` app, follow these steps:
|
||||||
|
|
||||||
#. Install the comments framework by adding ``'django.contrib.comments'`` to
|
#. Install the comments framework by adding ``'django.contrib.comments'`` to
|
||||||
:setting:`INSTALLED_APPS`.
|
:setting:`INSTALLED_APPS`.
|
||||||
|
|
||||||
#. Run ``manage.py syncdb`` so that Django will create the comment tables.
|
#. Run ``manage.py syncdb`` so that Django will create the comment tables.
|
||||||
|
|
||||||
#. Add the comment app's URLs to your project's ``urls.py``:
|
#. Add the comment app's URLs to your project's ``urls.py``:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ To get started using the ``comments`` app, follow these steps:
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
|
|
||||||
#. Use the `comment template tags`_ below to embed comments in your
|
#. Use the `comment template tags`_ below to embed comments in your
|
||||||
templates.
|
templates.
|
||||||
|
|
||||||
You might also want to examine :doc:`/ref/contrib/comments/settings`.
|
You might also want to examine :doc:`/ref/contrib/comments/settings`.
|
||||||
|
@ -62,7 +62,7 @@ Django's comments are all "attached" to some parent object. This can be any
|
||||||
instance of a Django model. Each of the tags below gives you a couple of
|
instance of a Django model. Each of the tags below gives you a couple of
|
||||||
different ways you can specify which object to attach to:
|
different ways you can specify which object to attach to:
|
||||||
|
|
||||||
#. Refer to the object directly -- the more common method. Most of the
|
#. Refer to the object directly -- the more common method. Most of the
|
||||||
time, you'll have some object in the template's context you want
|
time, you'll have some object in the template's context you want
|
||||||
to attach the comment to; you can simply use that object.
|
to attach the comment to; you can simply use that object.
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ different ways you can specify which object to attach to:
|
||||||
|
|
||||||
{% get_comment_count for entry as comment_count %}.
|
{% get_comment_count for entry as comment_count %}.
|
||||||
|
|
||||||
#. Refer to the object by content-type and object id. You'd use this method
|
#. Refer to the object by content-type and object id. You'd use this method
|
||||||
if you, for some reason, don't actually have direct access to the object.
|
if you, for some reason, don't actually have direct access to the object.
|
||||||
|
|
||||||
Following the above example, if you knew the object ID was ``14`` but
|
Following the above example, if you knew the object ID was ``14`` but
|
||||||
|
@ -262,7 +262,7 @@ Notes on the comment form
|
||||||
The form used by the comment system has a few important anti-spam attributes you
|
The form used by the comment system has a few important anti-spam attributes you
|
||||||
should know about:
|
should know about:
|
||||||
|
|
||||||
* It contains a number of hidden fields that contain timestamps, information
|
* It contains a number of hidden fields that contain timestamps, information
|
||||||
about the object the comment should be attached to, and a "security hash"
|
about the object the comment should be attached to, and a "security hash"
|
||||||
used to validate this information. If someone tampers with this data --
|
used to validate this information. If someone tampers with this data --
|
||||||
something comment spammers will try -- the comment submission will fail.
|
something comment spammers will try -- the comment submission will fail.
|
||||||
|
@ -270,11 +270,11 @@ should know about:
|
||||||
If you're rendering a custom comment form, you'll need to make sure to
|
If you're rendering a custom comment form, you'll need to make sure to
|
||||||
pass these values through unchanged.
|
pass these values through unchanged.
|
||||||
|
|
||||||
* The timestamp is used to ensure that "reply attacks" can't continue very
|
* The timestamp is used to ensure that "reply attacks" can't continue very
|
||||||
long. Users who wait too long between requesting the form and posting a
|
long. Users who wait too long between requesting the form and posting a
|
||||||
comment will have their submissions refused.
|
comment will have their submissions refused.
|
||||||
|
|
||||||
* The comment form includes a "honeypot_" field. It's a trap: if any data is
|
* The comment form includes a "honeypot_" field. It's a trap: if any data is
|
||||||
entered in that field, the comment will be considered spam (spammers often
|
entered in that field, the comment will be considered spam (spammers often
|
||||||
automatically fill in all fields in an attempt to make valid submissions).
|
automatically fill in all fields in an attempt to make valid submissions).
|
||||||
|
|
||||||
|
|
|
@ -28,15 +28,15 @@ This signal is sent at more or less the same time (just before, actually) as the
|
||||||
|
|
||||||
Arguments sent with this signal:
|
Arguments sent with this signal:
|
||||||
|
|
||||||
``sender``
|
``sender``
|
||||||
The comment model.
|
The comment model.
|
||||||
|
|
||||||
``comment``
|
``comment``
|
||||||
The comment instance about to be posted. Note that it won't have been
|
The comment instance about to be posted. Note that it won't have been
|
||||||
saved into the database yet, so it won't have a primary key, and any
|
saved into the database yet, so it won't have a primary key, and any
|
||||||
relations might not work correctly yet.
|
relations might not work correctly yet.
|
||||||
|
|
||||||
``request``
|
``request``
|
||||||
The :class:`~django.http.HttpRequest` that posted the comment.
|
The :class:`~django.http.HttpRequest` that posted the comment.
|
||||||
|
|
||||||
comment_was_posted
|
comment_was_posted
|
||||||
|
@ -49,15 +49,15 @@ Sent just after the comment is saved.
|
||||||
|
|
||||||
Arguments sent with this signal:
|
Arguments sent with this signal:
|
||||||
|
|
||||||
``sender``
|
``sender``
|
||||||
The comment model.
|
The comment model.
|
||||||
|
|
||||||
``comment``
|
``comment``
|
||||||
The comment instance that was posted. Note that it will have already
|
The comment instance that was posted. Note that it will have already
|
||||||
been saved, so if you modify it you'll need to call
|
been saved, so if you modify it you'll need to call
|
||||||
:meth:`~django.db.models.Model.save` again.
|
:meth:`~django.db.models.Model.save` again.
|
||||||
|
|
||||||
``request``
|
``request``
|
||||||
The :class:`~django.http.HttpRequest` that posted the comment.
|
The :class:`~django.http.HttpRequest` that posted the comment.
|
||||||
|
|
||||||
comment_was_flagged
|
comment_was_flagged
|
||||||
|
@ -72,20 +72,20 @@ comment, or some other custom user flag.
|
||||||
|
|
||||||
Arguments sent with this signal:
|
Arguments sent with this signal:
|
||||||
|
|
||||||
``sender``
|
``sender``
|
||||||
The comment model.
|
The comment model.
|
||||||
|
|
||||||
``comment``
|
``comment``
|
||||||
The comment instance that was posted. Note that it will have already
|
The comment instance that was posted. Note that it will have already
|
||||||
been saved, so if you modify it you'll need to call
|
been saved, so if you modify it you'll need to call
|
||||||
:meth:`~django.db.models.Model.save` again.
|
:meth:`~django.db.models.Model.save` again.
|
||||||
|
|
||||||
``flag``
|
``flag``
|
||||||
The :class:`~django.contrib.comments.models.CommentFlag` that's been
|
The :class:`~django.contrib.comments.models.CommentFlag` that's been
|
||||||
attached to the comment.
|
attached to the comment.
|
||||||
|
|
||||||
``created``
|
``created``
|
||||||
``True`` if this is a new flag; ``False`` if it's a duplicate flag.
|
``True`` if this is a new flag; ``False`` if it's a duplicate flag.
|
||||||
|
|
||||||
``request``
|
``request``
|
||||||
The :class:`~django.http.HttpRequest` that posted the comment.
|
The :class:`~django.http.HttpRequest` that posted the comment.
|
||||||
|
|
|
@ -7,24 +7,24 @@ new comment system; this guide explains how.
|
||||||
|
|
||||||
The main changes from the old system are:
|
The main changes from the old system are:
|
||||||
|
|
||||||
* This new system is documented.
|
* This new system is documented.
|
||||||
|
|
||||||
* It uses modern Django features like :doc:`forms </topics/forms/index>` and
|
* It uses modern Django features like :doc:`forms </topics/forms/index>` and
|
||||||
:doc:`modelforms </topics/forms/modelforms>`.
|
:doc:`modelforms </topics/forms/modelforms>`.
|
||||||
|
|
||||||
* It has a single ``Comment`` model instead of separate ``FreeComment`` and
|
* It has a single ``Comment`` model instead of separate ``FreeComment`` and
|
||||||
``Comment`` models.
|
``Comment`` models.
|
||||||
|
|
||||||
* Comments have "email" and "URL" fields.
|
* Comments have "email" and "URL" fields.
|
||||||
|
|
||||||
* No ratings, photos and karma. This should only effect World Online.
|
* No ratings, photos and karma. This should only effect World Online.
|
||||||
|
|
||||||
* The ``{% comment_form %}`` tag no longer exists. Instead, there's now two
|
* The ``{% comment_form %}`` tag no longer exists. Instead, there's now two
|
||||||
functions: ``{% get_comment_form %}``, which returns a form for posting a
|
functions: ``{% get_comment_form %}``, which returns a form for posting a
|
||||||
new comment, and ``{% render_comment_form %}``, which renders said form
|
new comment, and ``{% render_comment_form %}``, which renders said form
|
||||||
using the ``comments/form.html`` template.
|
using the ``comments/form.html`` template.
|
||||||
|
|
||||||
* The way comments are include in your URLconf have changed; you'll need to
|
* The way comments are include in your URLconf have changed; you'll need to
|
||||||
replace::
|
replace::
|
||||||
|
|
||||||
(r'^comments/', include('django.contrib.comments.urls.comments')),
|
(r'^comments/', include('django.contrib.comments.urls.comments')),
|
||||||
|
|
|
@ -45,13 +45,13 @@ but if you've removed it or if you manually set up your
|
||||||
It's generally a good idea to have the contenttypes framework
|
It's generally a good idea to have the contenttypes framework
|
||||||
installed; several of Django's other bundled applications require it:
|
installed; several of Django's other bundled applications require it:
|
||||||
|
|
||||||
* The admin application uses it to log the history of each object
|
* The admin application uses it to log the history of each object
|
||||||
added or changed through the admin interface.
|
added or changed through the admin interface.
|
||||||
|
|
||||||
* Django's :mod:`authentication framework <django.contrib.auth>` uses it
|
* Django's :mod:`authentication framework <django.contrib.auth>` uses it
|
||||||
to tie user permissions to specific models.
|
to tie user permissions to specific models.
|
||||||
|
|
||||||
* Django's comments system (:mod:`django.contrib.comments`) uses it to
|
* Django's comments system (:mod:`django.contrib.comments`) uses it to
|
||||||
"attach" comments to any installed model.
|
"attach" comments to any installed model.
|
||||||
|
|
||||||
.. currentmodule:: django.contrib.contenttypes.models
|
.. currentmodule:: django.contrib.contenttypes.models
|
||||||
|
@ -92,14 +92,14 @@ your database. Along with it a new instance of
|
||||||
:class:`~django.contrib.contenttypes.models.ContentType` will be
|
:class:`~django.contrib.contenttypes.models.ContentType` will be
|
||||||
created with the following values:
|
created with the following values:
|
||||||
|
|
||||||
* :attr:`~django.contrib.contenttypes.models.ContentType.app_label`
|
* :attr:`~django.contrib.contenttypes.models.ContentType.app_label`
|
||||||
will be set to ``'sites'`` (the last part of the Python
|
will be set to ``'sites'`` (the last part of the Python
|
||||||
path "django.contrib.sites").
|
path "django.contrib.sites").
|
||||||
|
|
||||||
* :attr:`~django.contrib.contenttypes.models.ContentType.model`
|
* :attr:`~django.contrib.contenttypes.models.ContentType.model`
|
||||||
will be set to ``'site'``.
|
will be set to ``'site'``.
|
||||||
|
|
||||||
* :attr:`~django.contrib.contenttypes.models.ContentType.name`
|
* :attr:`~django.contrib.contenttypes.models.ContentType.name`
|
||||||
will be set to ``'site'``.
|
will be set to ``'site'``.
|
||||||
|
|
||||||
.. _the verbose_name attribute: ../model-api/#verbose_name
|
.. _the verbose_name attribute: ../model-api/#verbose_name
|
||||||
|
@ -148,14 +148,14 @@ Together,
|
||||||
and :meth:`~django.contrib.contenttypes.models.ContentType.model_class` enable
|
and :meth:`~django.contrib.contenttypes.models.ContentType.model_class` enable
|
||||||
two extremely important use cases:
|
two extremely important use cases:
|
||||||
|
|
||||||
1. Using these methods, you can write high-level generic code that
|
1. Using these methods, you can write high-level generic code that
|
||||||
performs queries on any installed model -- instead of importing and
|
performs queries on any installed model -- instead of importing and
|
||||||
using a single specific model class, you can pass an ``app_label`` and
|
using a single specific model class, you can pass an ``app_label`` and
|
||||||
``model`` into a
|
``model`` into a
|
||||||
:class:`~django.contrib.contenttypes.models.ContentType` lookup at
|
:class:`~django.contrib.contenttypes.models.ContentType` lookup at
|
||||||
runtime, and then work with the model class or retrieve objects from it.
|
runtime, and then work with the model class or retrieve objects from it.
|
||||||
|
|
||||||
2. You can relate another model to
|
2. You can relate another model to
|
||||||
:class:`~django.contrib.contenttypes.models.ContentType` as a way of
|
:class:`~django.contrib.contenttypes.models.ContentType` as a way of
|
||||||
tying instances of it to particular model classes, and use these methods
|
tying instances of it to particular model classes, and use these methods
|
||||||
to get access to those model classes.
|
to get access to those model classes.
|
||||||
|
|
|
@ -28,7 +28,7 @@ How to use it
|
||||||
|
|
||||||
To enable CSRF protection for your views, follow these steps:
|
To enable CSRF protection for your views, follow these steps:
|
||||||
|
|
||||||
1. Add the middleware
|
1. Add the middleware
|
||||||
``'django.middleware.csrf.CsrfViewMiddleware'`` to your list of
|
``'django.middleware.csrf.CsrfViewMiddleware'`` to your list of
|
||||||
middleware classes, :setting:`MIDDLEWARE_CLASSES`. (It should come
|
middleware classes, :setting:`MIDDLEWARE_CLASSES`. (It should come
|
||||||
before any view middleware that assume that CSRF attacks have
|
before any view middleware that assume that CSRF attacks have
|
||||||
|
@ -38,7 +38,7 @@ To enable CSRF protection for your views, follow these steps:
|
||||||
:func:`~django.views.decorators.csrf.csrf_protect` on particular views
|
:func:`~django.views.decorators.csrf.csrf_protect` on particular views
|
||||||
you want to protect (see below).
|
you want to protect (see below).
|
||||||
|
|
||||||
2. In any template that uses a POST form, use the :ttag:`csrf_token` tag inside
|
2. In any template that uses a POST form, use the :ttag:`csrf_token` tag inside
|
||||||
the ``<form>`` element if the form is for an internal URL, e.g.::
|
the ``<form>`` element if the form is for an internal URL, e.g.::
|
||||||
|
|
||||||
<form action="." method="post">{% csrf_token %}
|
<form action="." method="post">{% csrf_token %}
|
||||||
|
@ -46,7 +46,7 @@ To enable CSRF protection for your views, follow these steps:
|
||||||
This should not be done for POST forms that target external URLs, since
|
This should not be done for POST forms that target external URLs, since
|
||||||
that would cause the CSRF token to be leaked, leading to a vulnerability.
|
that would cause the CSRF token to be leaked, leading to a vulnerability.
|
||||||
|
|
||||||
3. In the corresponding view functions, ensure that the
|
3. In the corresponding view functions, ensure that the
|
||||||
``'django.core.context_processors.csrf'`` context processor is
|
``'django.core.context_processors.csrf'`` context processor is
|
||||||
being used. Usually, this can be done in one of two ways:
|
being used. Usually, this can be done in one of two ways:
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ introspecting your models.
|
||||||
How to use Databrowse
|
How to use Databrowse
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
1. Point Django at the default Databrowse templates. There are two ways to
|
1. Point Django at the default Databrowse templates. There are two ways to
|
||||||
do this:
|
do this:
|
||||||
|
|
||||||
* Add ``'django.contrib.databrowse'`` to your :setting:`INSTALLED_APPS`
|
* Add ``'django.contrib.databrowse'`` to your :setting:`INSTALLED_APPS`
|
||||||
|
@ -30,7 +30,7 @@ How to use Databrowse
|
||||||
:file:`django/contrib/databrowse/templates` directory, and add that
|
:file:`django/contrib/databrowse/templates` directory, and add that
|
||||||
directory to your :setting:`TEMPLATE_DIRS` setting.
|
directory to your :setting:`TEMPLATE_DIRS` setting.
|
||||||
|
|
||||||
2. Register a number of models with the Databrowse site::
|
2. Register a number of models with the Databrowse site::
|
||||||
|
|
||||||
from django.contrib import databrowse
|
from django.contrib import databrowse
|
||||||
from myapp.models import SomeModel, SomeOtherModel
|
from myapp.models import SomeModel, SomeOtherModel
|
||||||
|
@ -44,7 +44,7 @@ How to use Databrowse
|
||||||
point. A good place for it is in your :doc:`URLconf file
|
point. A good place for it is in your :doc:`URLconf file
|
||||||
</topics/http/urls>` (``urls.py``).
|
</topics/http/urls>` (``urls.py``).
|
||||||
|
|
||||||
3. Change your URLconf to import the :mod:`~django.contrib.databrowse` module::
|
3. Change your URLconf to import the :mod:`~django.contrib.databrowse` module::
|
||||||
|
|
||||||
from django.contrib import databrowse
|
from django.contrib import databrowse
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ How to use Databrowse
|
||||||
The prefix doesn't matter -- you can use ``databrowse/`` or ``db/`` or
|
The prefix doesn't matter -- you can use ``databrowse/`` or ``db/`` or
|
||||||
whatever you'd like.
|
whatever you'd like.
|
||||||
|
|
||||||
4. Run the Django server and visit ``/databrowse/`` in your browser.
|
4. Run the Django server and visit ``/databrowse/`` in your browser.
|
||||||
|
|
||||||
Requiring user login
|
Requiring user login
|
||||||
====================
|
====================
|
||||||
|
|
|
@ -22,15 +22,15 @@ content in a custom template.
|
||||||
|
|
||||||
Here are some examples of flatpages on Django-powered sites:
|
Here are some examples of flatpages on Django-powered sites:
|
||||||
|
|
||||||
* http://www.lawrence.com/about/contact/
|
* http://www.lawrence.com/about/contact/
|
||||||
* http://www2.ljworld.com/site/rules/
|
* http://www2.ljworld.com/site/rules/
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
============
|
============
|
||||||
|
|
||||||
To install the flatpages app, follow these steps:
|
To install the flatpages app, follow these steps:
|
||||||
|
|
||||||
1. Install the :mod:`sites framework <django.contrib.sites>` by adding
|
1. Install the :mod:`sites framework <django.contrib.sites>` by adding
|
||||||
``'django.contrib.sites'`` to your :setting:`INSTALLED_APPS` setting,
|
``'django.contrib.sites'`` to your :setting:`INSTALLED_APPS` setting,
|
||||||
if it's not already in there.
|
if it's not already in there.
|
||||||
|
|
||||||
|
@ -39,13 +39,13 @@ To install the flatpages app, follow these steps:
|
||||||
``SITE_ID = 1``, but if you're using the sites framework to manage
|
``SITE_ID = 1``, but if you're using the sites framework to manage
|
||||||
multiple sites, it could be the ID of a different site.
|
multiple sites, it could be the ID of a different site.
|
||||||
|
|
||||||
2. Add ``'django.contrib.flatpages'`` to your :setting:`INSTALLED_APPS`
|
2. Add ``'django.contrib.flatpages'`` to your :setting:`INSTALLED_APPS`
|
||||||
setting.
|
setting.
|
||||||
|
|
||||||
3. Add ``'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'``
|
3. Add ``'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'``
|
||||||
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
||||||
|
|
||||||
4. Run the command :djadmin:`manage.py syncdb <syncdb>`.
|
4. Run the command :djadmin:`manage.py syncdb <syncdb>`.
|
||||||
|
|
||||||
.. currentmodule:: django.contrib.flatpages.middleware
|
.. currentmodule:: django.contrib.flatpages.middleware
|
||||||
|
|
||||||
|
|
|
@ -20,11 +20,11 @@ Overview
|
||||||
Given a :class:`django.forms.Form` subclass that you define, this
|
Given a :class:`django.forms.Form` subclass that you define, this
|
||||||
application takes care of the following workflow:
|
application takes care of the following workflow:
|
||||||
|
|
||||||
1. Displays the form as HTML on a Web page.
|
1. Displays the form as HTML on a Web page.
|
||||||
2. Validates the form data when it's submitted via POST.
|
2. Validates the form data when it's submitted via POST.
|
||||||
a. If it's valid, displays a preview page.
|
a. If it's valid, displays a preview page.
|
||||||
b. If it's not valid, redisplays the form with error messages.
|
b. If it's not valid, redisplays the form with error messages.
|
||||||
3. When the "confirmation" form is submitted from the preview page, calls
|
3. When the "confirmation" form is submitted from the preview page, calls
|
||||||
a hook that you define -- a
|
a hook that you define -- a
|
||||||
:meth:`~django.contrib.formtools.preview.FormPreview.done()` method that gets
|
:meth:`~django.contrib.formtools.preview.FormPreview.done()` method that gets
|
||||||
passed the valid data.
|
passed the valid data.
|
||||||
|
@ -36,7 +36,7 @@ on the preview page, the form submission will fail the hash-comparison test.
|
||||||
How to use ``FormPreview``
|
How to use ``FormPreview``
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
1. Point Django at the default FormPreview templates. There are two ways to
|
1. Point Django at the default FormPreview templates. There are two ways to
|
||||||
do this:
|
do this:
|
||||||
|
|
||||||
* Add ``'django.contrib.formtools'`` to your
|
* Add ``'django.contrib.formtools'`` to your
|
||||||
|
@ -50,7 +50,7 @@ How to use ``FormPreview``
|
||||||
:file:`django/contrib/formtools/templates` directory, and add that
|
:file:`django/contrib/formtools/templates` directory, and add that
|
||||||
directory to your :setting:`TEMPLATE_DIRS` setting.
|
directory to your :setting:`TEMPLATE_DIRS` setting.
|
||||||
|
|
||||||
2. Create a :class:`~django.contrib.formtools.preview.FormPreview` subclass that
|
2. Create a :class:`~django.contrib.formtools.preview.FormPreview` subclass that
|
||||||
overrides the :meth:`~django.contrib.formtools.preview.FormPreview.done()`
|
overrides the :meth:`~django.contrib.formtools.preview.FormPreview.done()`
|
||||||
method::
|
method::
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ How to use ``FormPreview``
|
||||||
It should return an :class:`~django.http.HttpResponseRedirect` that
|
It should return an :class:`~django.http.HttpResponseRedirect` that
|
||||||
is the end result of the form being submitted.
|
is the end result of the form being submitted.
|
||||||
|
|
||||||
3. Change your URLconf to point to an instance of your
|
3. Change your URLconf to point to an instance of your
|
||||||
:class:`~django.contrib.formtools.preview.FormPreview` subclass::
|
:class:`~django.contrib.formtools.preview.FormPreview` subclass::
|
||||||
|
|
||||||
from myapp.preview import SomeModelFormPreview
|
from myapp.preview import SomeModelFormPreview
|
||||||
|
@ -82,7 +82,7 @@ How to use ``FormPreview``
|
||||||
|
|
||||||
where ``SomeModelForm`` is a Form or ModelForm class for the model.
|
where ``SomeModelForm`` is a Form or ModelForm class for the model.
|
||||||
|
|
||||||
4. Run the Django server and visit :file:`/post/` in your browser.
|
4. Run the Django server and visit :file:`/post/` in your browser.
|
||||||
|
|
||||||
``FormPreview`` classes
|
``FormPreview`` classes
|
||||||
=======================
|
=======================
|
||||||
|
|
|
@ -24,13 +24,13 @@ How it works
|
||||||
|
|
||||||
Here's the basic workflow for how a user would use a wizard:
|
Here's the basic workflow for how a user would use a wizard:
|
||||||
|
|
||||||
1. The user visits the first page of the wizard, fills in the form and
|
1. The user visits the first page of the wizard, fills in the form and
|
||||||
submits it.
|
submits it.
|
||||||
2. The server validates the data. If it's invalid, the form is displayed
|
2. The server validates the data. If it's invalid, the form is displayed
|
||||||
again, with error messages. If it's valid, the server saves the current
|
again, with error messages. If it's valid, the server saves the current
|
||||||
state of the wizard in the backend and redirects to the next step.
|
state of the wizard in the backend and redirects to the next step.
|
||||||
3. Step 1 and 2 repeat, for every subsequent form in the wizard.
|
3. Step 1 and 2 repeat, for every subsequent form in the wizard.
|
||||||
4. Once the user has submitted all the forms and all the data has been
|
4. Once the user has submitted all the forms and all the data has been
|
||||||
validated, the wizard processes the data -- saving it to the database,
|
validated, the wizard processes the data -- saving it to the database,
|
||||||
sending an email, or whatever the application needs to do.
|
sending an email, or whatever the application needs to do.
|
||||||
|
|
||||||
|
@ -40,21 +40,21 @@ Usage
|
||||||
This application handles as much machinery for you as possible. Generally,
|
This application handles as much machinery for you as possible. Generally,
|
||||||
you just have to do these things:
|
you just have to do these things:
|
||||||
|
|
||||||
1. Define a number of :class:`~django.forms.Form` classes -- one per
|
1. Define a number of :class:`~django.forms.Form` classes -- one per
|
||||||
wizard page.
|
wizard page.
|
||||||
|
|
||||||
2. Create a :class:`WizardView` subclass that specifies what to do once
|
2. Create a :class:`WizardView` subclass that specifies what to do once
|
||||||
all of your forms have been submitted and validated. This also lets
|
all of your forms have been submitted and validated. This also lets
|
||||||
you override some of the wizard's behavior.
|
you override some of the wizard's behavior.
|
||||||
|
|
||||||
3. Create some templates that render the forms. You can define a single,
|
3. Create some templates that render the forms. You can define a single,
|
||||||
generic template to handle every one of the forms, or you can define a
|
generic template to handle every one of the forms, or you can define a
|
||||||
specific template for each form.
|
specific template for each form.
|
||||||
|
|
||||||
4. Add ``django.contrib.formtools`` to your
|
4. Add ``django.contrib.formtools`` to your
|
||||||
:setting:`INSTALLED_APPS` list in your settings file.
|
:setting:`INSTALLED_APPS` list in your settings file.
|
||||||
|
|
||||||
5. Point your URLconf at your :class:`WizardView` :meth:`~WizardView.as_view` method.
|
5. Point your URLconf at your :class:`WizardView` :meth:`~WizardView.as_view` method.
|
||||||
|
|
||||||
Defining ``Form`` classes
|
Defining ``Form`` classes
|
||||||
-------------------------
|
-------------------------
|
||||||
|
@ -160,10 +160,10 @@ latter one allows you to use a different template for each form.
|
||||||
This template expects a ``wizard`` object that has various items attached to
|
This template expects a ``wizard`` object that has various items attached to
|
||||||
it:
|
it:
|
||||||
|
|
||||||
* ``form`` -- The :class:`~django.forms.Form` instance for the current
|
* ``form`` -- The :class:`~django.forms.Form` instance for the current
|
||||||
step (either empty or with errors).
|
step (either empty or with errors).
|
||||||
|
|
||||||
* ``steps`` -- A helper object to access the various steps related data:
|
* ``steps`` -- A helper object to access the various steps related data:
|
||||||
|
|
||||||
* ``step0`` -- The current step (zero-based).
|
* ``step0`` -- The current step (zero-based).
|
||||||
* ``step1`` -- The current step (one-based).
|
* ``step1`` -- The current step (one-based).
|
||||||
|
@ -582,8 +582,8 @@ Below you will see an example of a contact wizard with two steps, step 1 with
|
||||||
Additionally you have to pass two more arguments to the
|
Additionally you have to pass two more arguments to the
|
||||||
:meth:`~WizardView.as_view` method:
|
:meth:`~WizardView.as_view` method:
|
||||||
|
|
||||||
* ``url_name`` -- the name of the url (as provided in the urls.py)
|
* ``url_name`` -- the name of the url (as provided in the urls.py)
|
||||||
* ``done_step_name`` -- the name in the url for the done step
|
* ``done_step_name`` -- the name in the url for the done step
|
||||||
|
|
||||||
Example code for the changed ``urls.py`` file::
|
Example code for the changed ``urls.py`` file::
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,9 @@ number. This follows Associated Press style.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
* ``1`` becomes ``one``.
|
* ``1`` becomes ``one``.
|
||||||
* ``2`` becomes ``two``.
|
* ``2`` becomes ``two``.
|
||||||
* ``10`` becomes ``10``.
|
* ``10`` becomes ``10``.
|
||||||
|
|
||||||
You can pass in either an integer or a string representation of an integer.
|
You can pass in either an integer or a string representation of an integer.
|
||||||
|
|
||||||
|
@ -38,16 +38,16 @@ Converts an integer to a string containing commas every three digits.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
* ``4500`` becomes ``4,500``.
|
* ``4500`` becomes ``4,500``.
|
||||||
* ``45000`` becomes ``45,000``.
|
* ``45000`` becomes ``45,000``.
|
||||||
* ``450000`` becomes ``450,000``.
|
* ``450000`` becomes ``450,000``.
|
||||||
* ``4500000`` becomes ``4,500,000``.
|
* ``4500000`` becomes ``4,500,000``.
|
||||||
|
|
||||||
:ref:`Format localization <format-localization>` will be respected if enabled,
|
:ref:`Format localization <format-localization>` will be respected if enabled,
|
||||||
e.g. with the ``'de'`` language:
|
e.g. with the ``'de'`` language:
|
||||||
|
|
||||||
* ``45000`` becomes ``'45.000'``.
|
* ``45000`` becomes ``'45.000'``.
|
||||||
* ``450000`` becomes ``'450.000'``.
|
* ``450000`` becomes ``'450.000'``.
|
||||||
|
|
||||||
You can pass in either an integer or a string representation of an integer.
|
You can pass in either an integer or a string representation of an integer.
|
||||||
|
|
||||||
|
@ -61,18 +61,18 @@ numbers over 1 million.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
* ``1000000`` becomes ``1.0 million``.
|
* ``1000000`` becomes ``1.0 million``.
|
||||||
* ``1200000`` becomes ``1.2 million``.
|
* ``1200000`` becomes ``1.2 million``.
|
||||||
* ``1200000000`` becomes ``1.2 billion``.
|
* ``1200000000`` becomes ``1.2 billion``.
|
||||||
|
|
||||||
Values up to 10^100 (Googol) are supported.
|
Values up to 10^100 (Googol) are supported.
|
||||||
|
|
||||||
:ref:`Format localization <format-localization>` will be respected if enabled,
|
:ref:`Format localization <format-localization>` will be respected if enabled,
|
||||||
e.g. with the ``'de'`` language:
|
e.g. with the ``'de'`` language:
|
||||||
|
|
||||||
* ``1000000`` becomes ``'1,0 Million'``.
|
* ``1000000`` becomes ``'1,0 Million'``.
|
||||||
* ``1200000`` becomes ``'1,2 Million'``.
|
* ``1200000`` becomes ``'1,2 Million'``.
|
||||||
* ``1200000000`` becomes ``'1,2 Milliarden'``.
|
* ``1200000000`` becomes ``'1,2 Milliarden'``.
|
||||||
|
|
||||||
You can pass in either an integer or a string representation of an integer.
|
You can pass in either an integer or a string representation of an integer.
|
||||||
|
|
||||||
|
@ -89,10 +89,10 @@ the passed in format string.
|
||||||
|
|
||||||
Examples (when 'today' is 17 Feb 2007):
|
Examples (when 'today' is 17 Feb 2007):
|
||||||
|
|
||||||
* ``16 Feb 2007`` becomes ``yesterday``.
|
* ``16 Feb 2007`` becomes ``yesterday``.
|
||||||
* ``17 Feb 2007`` becomes ``today``.
|
* ``17 Feb 2007`` becomes ``today``.
|
||||||
* ``18 Feb 2007`` becomes ``tomorrow``.
|
* ``18 Feb 2007`` becomes ``tomorrow``.
|
||||||
* Any other day is formatted according to given argument or the
|
* Any other day is formatted according to given argument or the
|
||||||
:setting:`DATE_FORMAT` setting if no argument is given.
|
:setting:`DATE_FORMAT` setting if no argument is given.
|
||||||
|
|
||||||
.. templatefilter:: naturaltime
|
.. templatefilter:: naturaltime
|
||||||
|
@ -109,19 +109,19 @@ the return value will automatically use an appropriate phrase.
|
||||||
|
|
||||||
Examples (when 'now' is 17 Feb 2007 16:30:00):
|
Examples (when 'now' is 17 Feb 2007 16:30:00):
|
||||||
|
|
||||||
* ``17 Feb 2007 16:30:00`` becomes ``now``.
|
* ``17 Feb 2007 16:30:00`` becomes ``now``.
|
||||||
* ``17 Feb 2007 16:29:31`` becomes ``29 seconds ago``.
|
* ``17 Feb 2007 16:29:31`` becomes ``29 seconds ago``.
|
||||||
* ``17 Feb 2007 16:29:00`` becomes ``a minute ago``.
|
* ``17 Feb 2007 16:29:00`` becomes ``a minute ago``.
|
||||||
* ``17 Feb 2007 16:25:35`` becomes ``4 minutes ago``.
|
* ``17 Feb 2007 16:25:35`` becomes ``4 minutes ago``.
|
||||||
* ``17 Feb 2007 15:30:29`` becomes ``an hour ago``.
|
* ``17 Feb 2007 15:30:29`` becomes ``an hour ago``.
|
||||||
* ``17 Feb 2007 13:31:29`` becomes ``2 hours ago``.
|
* ``17 Feb 2007 13:31:29`` becomes ``2 hours ago``.
|
||||||
* ``16 Feb 2007 13:31:29`` becomes ``1 day ago``.
|
* ``16 Feb 2007 13:31:29`` becomes ``1 day ago``.
|
||||||
* ``17 Feb 2007 16:30:30`` becomes ``29 seconds from now``.
|
* ``17 Feb 2007 16:30:30`` becomes ``29 seconds from now``.
|
||||||
* ``17 Feb 2007 16:31:00`` becomes ``a minute from now``.
|
* ``17 Feb 2007 16:31:00`` becomes ``a minute from now``.
|
||||||
* ``17 Feb 2007 16:34:35`` becomes ``4 minutes from now``.
|
* ``17 Feb 2007 16:34:35`` becomes ``4 minutes from now``.
|
||||||
* ``17 Feb 2007 16:30:29`` becomes ``an hour from now``.
|
* ``17 Feb 2007 16:30:29`` becomes ``an hour from now``.
|
||||||
* ``17 Feb 2007 18:31:29`` becomes ``2 hours from now``.
|
* ``17 Feb 2007 18:31:29`` becomes ``2 hours from now``.
|
||||||
* ``18 Feb 2007 16:31:29`` becomes ``1 day from now``.
|
* ``18 Feb 2007 16:31:29`` becomes ``1 day from now``.
|
||||||
|
|
||||||
.. templatefilter:: ordinal
|
.. templatefilter:: ordinal
|
||||||
|
|
||||||
|
@ -132,8 +132,8 @@ Converts an integer to its ordinal as a string.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
* ``1`` becomes ``1st``.
|
* ``1`` becomes ``1st``.
|
||||||
* ``2`` becomes ``2nd``.
|
* ``2`` becomes ``2nd``.
|
||||||
* ``3`` becomes ``3rd``.
|
* ``3`` becomes ``3rd``.
|
||||||
|
|
||||||
You can pass in either an integer or a string representation of an integer.
|
You can pass in either an integer or a string representation of an integer.
|
||||||
|
|
|
@ -8,9 +8,9 @@ django.contrib.markup
|
||||||
Django provides template filters that implement the following markup
|
Django provides template filters that implement the following markup
|
||||||
languages:
|
languages:
|
||||||
|
|
||||||
* ``textile`` -- implements `Textile`_ -- requires `PyTextile`_
|
* ``textile`` -- implements `Textile`_ -- requires `PyTextile`_
|
||||||
* ``markdown`` -- implements `Markdown`_ -- requires `Python-markdown`_
|
* ``markdown`` -- implements `Markdown`_ -- requires `Python-markdown`_
|
||||||
* ``restructuredtext`` -- implements `reST (reStructured Text)`_
|
* ``restructuredtext`` -- implements `reST (reStructured Text)`_
|
||||||
-- requires `doc-utils`_
|
-- requires `doc-utils`_
|
||||||
|
|
||||||
In each case, the filter expects formatted markup as a string and
|
In each case, the filter expects formatted markup as a string and
|
||||||
|
|
|
@ -23,7 +23,7 @@ class and corresponding :doc:`context processor </ref/templates/api>`.
|
||||||
|
|
||||||
To enable message functionality, do the following:
|
To enable message functionality, do the following:
|
||||||
|
|
||||||
* Edit the :setting:`MIDDLEWARE_CLASSES` setting and make sure
|
* Edit the :setting:`MIDDLEWARE_CLASSES` setting and make sure
|
||||||
it contains ``'django.contrib.messages.middleware.MessageMiddleware'``.
|
it contains ``'django.contrib.messages.middleware.MessageMiddleware'``.
|
||||||
|
|
||||||
If you are using a :ref:`storage backend <message-storage-backends>` that
|
If you are using a :ref:`storage backend <message-storage-backends>` that
|
||||||
|
@ -32,10 +32,10 @@ To enable message functionality, do the following:
|
||||||
enabled and appear before ``MessageMiddleware`` in your
|
enabled and appear before ``MessageMiddleware`` in your
|
||||||
:setting:`MIDDLEWARE_CLASSES`.
|
:setting:`MIDDLEWARE_CLASSES`.
|
||||||
|
|
||||||
* Edit the :setting:`TEMPLATE_CONTEXT_PROCESSORS` setting and make sure
|
* Edit the :setting:`TEMPLATE_CONTEXT_PROCESSORS` setting and make sure
|
||||||
it contains ``'django.contrib.messages.context_processors.messages'``.
|
it contains ``'django.contrib.messages.context_processors.messages'``.
|
||||||
|
|
||||||
* Add ``'django.contrib.messages'`` to your :setting:`INSTALLED_APPS`
|
* Add ``'django.contrib.messages'`` to your :setting:`INSTALLED_APPS`
|
||||||
setting
|
setting
|
||||||
|
|
||||||
The default ``settings.py`` created by ``django-admin.py startproject`` has
|
The default ``settings.py`` created by ``django-admin.py startproject`` has
|
||||||
|
@ -349,9 +349,9 @@ Default: ``'django.contrib.messages.storage.user_messages.FallbackStorage'``
|
||||||
|
|
||||||
Controls where Django stores message data. Valid values are:
|
Controls where Django stores message data. Valid values are:
|
||||||
|
|
||||||
* ``'django.contrib.messages.storage.fallback.FallbackStorage'``
|
* ``'django.contrib.messages.storage.fallback.FallbackStorage'``
|
||||||
* ``'django.contrib.messages.storage.session.SessionStorage'``
|
* ``'django.contrib.messages.storage.session.SessionStorage'``
|
||||||
* ``'django.contrib.messages.storage.cookie.CookieStorage'``
|
* ``'django.contrib.messages.storage.cookie.CookieStorage'``
|
||||||
|
|
||||||
See `Storage backends`_ for more details.
|
See `Storage backends`_ for more details.
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,11 @@ Installation
|
||||||
|
|
||||||
To install the redirects app, follow these steps:
|
To install the redirects app, follow these steps:
|
||||||
|
|
||||||
1. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS`
|
1. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS`
|
||||||
setting.
|
setting.
|
||||||
2. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'``
|
2. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'``
|
||||||
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
||||||
3. Run the command :djadmin:`manage.py syncdb <syncdb>`.
|
3. Run the command :djadmin:`manage.py syncdb <syncdb>`.
|
||||||
|
|
||||||
How it works
|
How it works
|
||||||
============
|
============
|
||||||
|
@ -31,11 +31,11 @@ for the requested URL as a last resort. Specifically, it checks for a redirect
|
||||||
with the given ``old_path`` with a site ID that corresponds to the
|
with the given ``old_path`` with a site ID that corresponds to the
|
||||||
:setting:`SITE_ID` setting.
|
:setting:`SITE_ID` setting.
|
||||||
|
|
||||||
* If it finds a match, and ``new_path`` is not empty, it redirects to
|
* If it finds a match, and ``new_path`` is not empty, it redirects to
|
||||||
``new_path``.
|
``new_path``.
|
||||||
* If it finds a match, and ``new_path`` is empty, it sends a 410 ("Gone")
|
* If it finds a match, and ``new_path`` is empty, it sends a 410 ("Gone")
|
||||||
HTTP header and empty (content-less) response.
|
HTTP header and empty (content-less) response.
|
||||||
* If it doesn't find a match, the request continues to be processed as
|
* If it doesn't find a match, the request continues to be processed as
|
||||||
usual.
|
usual.
|
||||||
|
|
||||||
The middleware only gets activated for 404s -- not for 500s or responses of any
|
The middleware only gets activated for 404s -- not for 500s or responses of any
|
||||||
|
|
|
@ -31,14 +31,14 @@ Installation
|
||||||
|
|
||||||
To install the sitemap app, follow these steps:
|
To install the sitemap app, follow these steps:
|
||||||
|
|
||||||
1. Add ``'django.contrib.sitemaps'`` to your :setting:`INSTALLED_APPS`
|
1. Add ``'django.contrib.sitemaps'`` to your :setting:`INSTALLED_APPS`
|
||||||
setting.
|
setting.
|
||||||
|
|
||||||
2. Make sure ``'django.template.loaders.app_directories.Loader'``
|
2. Make sure ``'django.template.loaders.app_directories.Loader'``
|
||||||
is in your :setting:`TEMPLATE_LOADERS` setting. It's in there by default,
|
is in your :setting:`TEMPLATE_LOADERS` setting. It's in there by default,
|
||||||
so you'll only need to change this if you've changed that setting.
|
so you'll only need to change this if you've changed that setting.
|
||||||
|
|
||||||
3. Make sure you've installed the
|
3. Make sure you've installed the
|
||||||
:mod:`sites framework <django.contrib.sites>`.
|
:mod:`sites framework <django.contrib.sites>`.
|
||||||
|
|
||||||
(Note: The sitemap application doesn't install any database tables. The only
|
(Note: The sitemap application doesn't install any database tables. The only
|
||||||
|
@ -109,17 +109,17 @@ your sitemap class might look::
|
||||||
|
|
||||||
Note:
|
Note:
|
||||||
|
|
||||||
* :attr:`~Sitemap.changefreq` and :attr:`~Sitemap.priority` are class
|
* :attr:`~Sitemap.changefreq` and :attr:`~Sitemap.priority` are class
|
||||||
attributes corresponding to ``<changefreq>`` and ``<priority>`` elements,
|
attributes corresponding to ``<changefreq>`` and ``<priority>`` elements,
|
||||||
respectively. They can be made callable as functions, as
|
respectively. They can be made callable as functions, as
|
||||||
:attr:`~Sitemap.lastmod` was in the example.
|
:attr:`~Sitemap.lastmod` was in the example.
|
||||||
* :attr:`~Sitemap.items()` is simply a method that returns a list of
|
* :attr:`~Sitemap.items()` is simply a method that returns a list of
|
||||||
objects. The objects returned will get passed to any callable methods
|
objects. The objects returned will get passed to any callable methods
|
||||||
corresponding to a sitemap property (:attr:`~Sitemap.location`,
|
corresponding to a sitemap property (:attr:`~Sitemap.location`,
|
||||||
:attr:`~Sitemap.lastmod`, :attr:`~Sitemap.changefreq`, and
|
:attr:`~Sitemap.lastmod`, :attr:`~Sitemap.changefreq`, and
|
||||||
:attr:`~Sitemap.priority`).
|
:attr:`~Sitemap.priority`).
|
||||||
* :attr:`~Sitemap.lastmod` should return a Python ``datetime`` object.
|
* :attr:`~Sitemap.lastmod` should return a Python ``datetime`` object.
|
||||||
* There is no :attr:`~Sitemap.location` method in this example, but you
|
* There is no :attr:`~Sitemap.location` method in this example, but you
|
||||||
can provide it in order to specify the URL for your object. By default,
|
can provide it in order to specify the URL for your object. By default,
|
||||||
:attr:`~Sitemap.location()` calls ``get_absolute_url()`` on each object
|
:attr:`~Sitemap.location()` calls ``get_absolute_url()`` on each object
|
||||||
and returns the result.
|
and returns the result.
|
||||||
|
@ -272,9 +272,9 @@ The sitemap framework also has the ability to create a sitemap index that
|
||||||
references individual sitemap files, one per each section defined in your
|
references individual sitemap files, one per each section defined in your
|
||||||
:data:`sitemaps` dictionary. The only differences in usage are:
|
:data:`sitemaps` dictionary. The only differences in usage are:
|
||||||
|
|
||||||
* You use two views in your URLconf: :func:`django.contrib.sitemaps.views.index`
|
* You use two views in your URLconf: :func:`django.contrib.sitemaps.views.index`
|
||||||
and :func:`django.contrib.sitemaps.views.sitemap`.
|
and :func:`django.contrib.sitemaps.views.sitemap`.
|
||||||
* The :func:`django.contrib.sitemaps.views.sitemap` view should take a
|
* The :func:`django.contrib.sitemaps.views.sitemap` view should take a
|
||||||
:data:`section` keyword argument.
|
:data:`section` keyword argument.
|
||||||
|
|
||||||
Here's what the relevant URLconf lines would look like for the example above::
|
Here's what the relevant URLconf lines would look like for the example above::
|
||||||
|
@ -341,11 +341,11 @@ The variable :data:`urlset` is a list of URLs that should appear in the
|
||||||
sitemap. Each URL exposes attributes as defined in the
|
sitemap. Each URL exposes attributes as defined in the
|
||||||
:class:`~django.contrib.sitemaps.Sitemap` class:
|
:class:`~django.contrib.sitemaps.Sitemap` class:
|
||||||
|
|
||||||
- ``changefreq``
|
- ``changefreq``
|
||||||
- ``item``
|
- ``item``
|
||||||
- ``lastmod``
|
- ``lastmod``
|
||||||
- ``location``
|
- ``location``
|
||||||
- ``priority``
|
- ``priority``
|
||||||
|
|
||||||
.. versionadded:: 1.4
|
.. versionadded:: 1.4
|
||||||
|
|
||||||
|
|
|
@ -70,13 +70,13 @@ that's represented by a :class:`~django.db.models.ManyToManyField` in the
|
||||||
|
|
||||||
This accomplishes several things quite nicely:
|
This accomplishes several things quite nicely:
|
||||||
|
|
||||||
* It lets the site producers edit all content -- on both sites -- in a
|
* It lets the site producers edit all content -- on both sites -- in a
|
||||||
single interface (the Django admin).
|
single interface (the Django admin).
|
||||||
|
|
||||||
* It means the same story doesn't have to be published twice in the
|
* It means the same story doesn't have to be published twice in the
|
||||||
database; it only has a single record in the database.
|
database; it only has a single record in the database.
|
||||||
|
|
||||||
* It lets the site developers use the same Django view code for both sites.
|
* It lets the site developers use the same Django view code for both sites.
|
||||||
The view code that displays a given story just checks to make sure the
|
The view code that displays a given story just checks to make sure the
|
||||||
requested story is on the current site. It looks something like this::
|
requested story is on the current site. It looks something like this::
|
||||||
|
|
||||||
|
|
|
@ -385,18 +385,18 @@ There are a few other helpers outside of the
|
||||||
:mod:`staticfiles <django.contrib.staticfiles>` app to work with static
|
:mod:`staticfiles <django.contrib.staticfiles>` app to work with static
|
||||||
files:
|
files:
|
||||||
|
|
||||||
- The :func:`django.core.context_processors.static` context processor
|
- The :func:`django.core.context_processors.static` context processor
|
||||||
which adds :setting:`STATIC_URL` to every template context rendered
|
which adds :setting:`STATIC_URL` to every template context rendered
|
||||||
with :class:`~django.template.RequestContext` contexts.
|
with :class:`~django.template.RequestContext` contexts.
|
||||||
|
|
||||||
- The builtin template tag :ttag:`static` which takes a path and
|
- The builtin template tag :ttag:`static` which takes a path and
|
||||||
urljoins it with the static prefix :setting:`STATIC_URL`.
|
urljoins it with the static prefix :setting:`STATIC_URL`.
|
||||||
|
|
||||||
- The builtin template tag :ttag:`get_static_prefix` which populates a
|
- The builtin template tag :ttag:`get_static_prefix` which populates a
|
||||||
template variable with the static prefix :setting:`STATIC_URL` to be
|
template variable with the static prefix :setting:`STATIC_URL` to be
|
||||||
used as a variable or directly.
|
used as a variable or directly.
|
||||||
|
|
||||||
- The similar template tag :ttag:`get_media_prefix` which works like
|
- The similar template tag :ttag:`get_media_prefix` which works like
|
||||||
:ttag:`get_static_prefix` but uses :setting:`MEDIA_URL`.
|
:ttag:`get_static_prefix` but uses :setting:`MEDIA_URL`.
|
||||||
|
|
||||||
.. _staticfiles-development-view:
|
.. _staticfiles-development-view:
|
||||||
|
|
|
@ -113,7 +113,7 @@ One thing is left to do. In an RSS feed, each ``<item>`` has a ``<title>``,
|
||||||
``<link>`` and ``<description>``. We need to tell the framework what data to put
|
``<link>`` and ``<description>``. We need to tell the framework what data to put
|
||||||
into those elements.
|
into those elements.
|
||||||
|
|
||||||
* For the contents of ``<title>`` and ``<description>``, Django tries
|
* For the contents of ``<title>`` and ``<description>``, Django tries
|
||||||
calling the methods ``item_title()`` and ``item_description()`` on
|
calling the methods ``item_title()`` and ``item_description()`` on
|
||||||
the :class:`~django.contrib.syndication.views.Feed` class. They are passed
|
the :class:`~django.contrib.syndication.views.Feed` class. They are passed
|
||||||
a single parameter, ``item``, which is the object itself. These are
|
a single parameter, ``item``, which is the object itself. These are
|
||||||
|
@ -140,7 +140,7 @@ into those elements.
|
||||||
|
|
||||||
See `a complex example`_ below that uses a description template.
|
See `a complex example`_ below that uses a description template.
|
||||||
|
|
||||||
* To specify the contents of ``<link>``, you have two options. For each item
|
* To specify the contents of ``<link>``, you have two options. For each item
|
||||||
in ``items()``, Django first tries calling the
|
in ``items()``, Django first tries calling the
|
||||||
``item_link()`` method on the
|
``item_link()`` method on the
|
||||||
:class:`~django.contrib.syndication.views.Feed` class. In a similar way to
|
:class:`~django.contrib.syndication.views.Feed` class. In a similar way to
|
||||||
|
@ -170,8 +170,8 @@ items based on information in the feed's URL.
|
||||||
|
|
||||||
On chicagocrime.org, the police-beat feeds are accessible via URLs like this:
|
On chicagocrime.org, the police-beat feeds are accessible via URLs like this:
|
||||||
|
|
||||||
* :file:`/beats/613/rss/` -- Returns recent crimes for beat 613.
|
* :file:`/beats/613/rss/` -- Returns recent crimes for beat 613.
|
||||||
* :file:`/beats/1424/rss/` -- Returns recent crimes for beat 1424.
|
* :file:`/beats/1424/rss/` -- Returns recent crimes for beat 1424.
|
||||||
|
|
||||||
These can be matched with a :doc:`URLconf </topics/http/urls>` line such as::
|
These can be matched with a :doc:`URLconf </topics/http/urls>` line such as::
|
||||||
|
|
||||||
|
@ -213,12 +213,12 @@ illustrates that they can be either strings *or* methods. For each of
|
||||||
``title``, ``link`` and ``description``, Django follows this
|
``title``, ``link`` and ``description``, Django follows this
|
||||||
algorithm:
|
algorithm:
|
||||||
|
|
||||||
* First, it tries to call a method, passing the ``obj`` argument, where
|
* First, it tries to call a method, passing the ``obj`` argument, where
|
||||||
``obj`` is the object returned by ``get_object()``.
|
``obj`` is the object returned by ``get_object()``.
|
||||||
|
|
||||||
* Failing that, it tries to call a method with no arguments.
|
* Failing that, it tries to call a method with no arguments.
|
||||||
|
|
||||||
* Failing that, it uses the class attribute.
|
* Failing that, it uses the class attribute.
|
||||||
|
|
||||||
Also note that ``items()`` also follows the same algorithm -- first, it
|
Also note that ``items()`` also follows the same algorithm -- first, it
|
||||||
tries ``items(obj)``, then ``items()``, then finally an ``items``
|
tries ``items(obj)``, then ``items()``, then finally an ``items``
|
||||||
|
@ -252,9 +252,9 @@ Note that you set ``feed_type`` to a class object, not an instance.
|
||||||
|
|
||||||
Currently available feed types are:
|
Currently available feed types are:
|
||||||
|
|
||||||
* :class:`django.utils.feedgenerator.Rss201rev2Feed` (RSS 2.01. Default.)
|
* :class:`django.utils.feedgenerator.Rss201rev2Feed` (RSS 2.01. Default.)
|
||||||
* :class:`django.utils.feedgenerator.RssUserland091Feed` (RSS 0.91.)
|
* :class:`django.utils.feedgenerator.RssUserland091Feed` (RSS 0.91.)
|
||||||
* :class:`django.utils.feedgenerator.Atom1Feed` (Atom 1.0.)
|
* :class:`django.utils.feedgenerator.Atom1Feed` (Atom 1.0.)
|
||||||
|
|
||||||
Enclosures
|
Enclosures
|
||||||
----------
|
----------
|
||||||
|
@ -788,13 +788,13 @@ also create custom feed generator subclasses for use with the ``feed_type``
|
||||||
|
|
||||||
The :mod:`~django.utils.feedgenerator` module contains a base class:
|
The :mod:`~django.utils.feedgenerator` module contains a base class:
|
||||||
|
|
||||||
* :class:`django.utils.feedgenerator.SyndicationFeed`
|
* :class:`django.utils.feedgenerator.SyndicationFeed`
|
||||||
|
|
||||||
and several subclasses:
|
and several subclasses:
|
||||||
|
|
||||||
* :class:`django.utils.feedgenerator.RssUserland091Feed`
|
* :class:`django.utils.feedgenerator.RssUserland091Feed`
|
||||||
* :class:`django.utils.feedgenerator.Rss201rev2Feed`
|
* :class:`django.utils.feedgenerator.Rss201rev2Feed`
|
||||||
* :class:`django.utils.feedgenerator.Atom1Feed`
|
* :class:`django.utils.feedgenerator.Atom1Feed`
|
||||||
|
|
||||||
Each of these three classes knows how to render a certain type of feed as XML.
|
Each of these three classes knows how to render a certain type of feed as XML.
|
||||||
They share this interface:
|
They share this interface:
|
||||||
|
|
|
@ -36,21 +36,21 @@ Usage::
|
||||||
The ``{% lorem %}`` tag can be used with zero, one, two or three arguments.
|
The ``{% lorem %}`` tag can be used with zero, one, two or three arguments.
|
||||||
The arguments are:
|
The arguments are:
|
||||||
|
|
||||||
=========== =============================================================
|
=========== =============================================================
|
||||||
Argument Description
|
Argument Description
|
||||||
=========== =============================================================
|
=========== =============================================================
|
||||||
``count`` A number (or variable) containing the number of paragraphs or
|
``count`` A number (or variable) containing the number of paragraphs or
|
||||||
words to generate (default is 1).
|
words to generate (default is 1).
|
||||||
``method`` Either ``w`` for words, ``p`` for HTML paragraphs or ``b``
|
``method`` Either ``w`` for words, ``p`` for HTML paragraphs or ``b``
|
||||||
for plain-text paragraph blocks (default is ``b``).
|
for plain-text paragraph blocks (default is ``b``).
|
||||||
``random`` The word ``random``, which if given, does not use the common
|
``random`` The word ``random``, which if given, does not use the common
|
||||||
paragraph ("Lorem ipsum dolor sit amet...") when generating
|
paragraph ("Lorem ipsum dolor sit amet...") when generating
|
||||||
text.
|
text.
|
||||||
=========== =============================================================
|
=========== =============================================================
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
* ``{% lorem %}`` will output the common "lorem ipsum" paragraph.
|
* ``{% lorem %}`` will output the common "lorem ipsum" paragraph.
|
||||||
* ``{% lorem 3 p %}`` will output the common "lorem ipsum" paragraph
|
* ``{% lorem 3 p %}`` will output the common "lorem ipsum" paragraph
|
||||||
and two random paragraphs each wrapped in HTML ``<p>`` tags.
|
and two random paragraphs each wrapped in HTML ``<p>`` tags.
|
||||||
* ``{% lorem 2 w random %}`` will output two random Latin words.
|
* ``{% lorem 2 w random %}`` will output two random Latin words.
|
||||||
|
|
|
@ -257,10 +257,10 @@ Refer to the :doc:`settings documentation </ref/settings>`.
|
||||||
|
|
||||||
Connection settings are used in this order:
|
Connection settings are used in this order:
|
||||||
|
|
||||||
1. :setting:`OPTIONS`.
|
1. :setting:`OPTIONS`.
|
||||||
2. :setting:`NAME`, :setting:`USER`, :setting:`PASSWORD`,
|
2. :setting:`NAME`, :setting:`USER`, :setting:`PASSWORD`,
|
||||||
:setting:`HOST`, :setting:`PORT`
|
:setting:`HOST`, :setting:`PORT`
|
||||||
3. MySQL option files.
|
3. MySQL option files.
|
||||||
|
|
||||||
In other words, if you set the name of the database in :setting:`OPTIONS`,
|
In other words, if you set the name of the database in :setting:`OPTIONS`,
|
||||||
this will take precedence over :setting:`NAME`, which would override
|
this will take precedence over :setting:`NAME`, which would override
|
||||||
|
@ -304,14 +304,14 @@ default storage engine to the desired engine.
|
||||||
If you're using a hosting service and can't change your server's default
|
If you're using a hosting service and can't change your server's default
|
||||||
storage engine, you have a couple of options.
|
storage engine, you have a couple of options.
|
||||||
|
|
||||||
* After the tables are created, execute an ``ALTER TABLE`` statement to
|
* After the tables are created, execute an ``ALTER TABLE`` statement to
|
||||||
convert a table to a new storage engine (such as InnoDB)::
|
convert a table to a new storage engine (such as InnoDB)::
|
||||||
|
|
||||||
ALTER TABLE <tablename> ENGINE=INNODB;
|
ALTER TABLE <tablename> ENGINE=INNODB;
|
||||||
|
|
||||||
This can be tedious if you have a lot of tables.
|
This can be tedious if you have a lot of tables.
|
||||||
|
|
||||||
* Another option is to use the ``init_command`` option for MySQLdb prior to
|
* Another option is to use the ``init_command`` option for MySQLdb prior to
|
||||||
creating your tables::
|
creating your tables::
|
||||||
|
|
||||||
'OPTIONS': {
|
'OPTIONS': {
|
||||||
|
@ -321,7 +321,7 @@ storage engine, you have a couple of options.
|
||||||
This sets the default storage engine upon connecting to the database.
|
This sets the default storage engine upon connecting to the database.
|
||||||
After your tables have been created, you should remove this option.
|
After your tables have been created, you should remove this option.
|
||||||
|
|
||||||
* Another method for changing the storage engine is described in
|
* Another method for changing the storage engine is described in
|
||||||
AlterModelOnSyncDB_.
|
AlterModelOnSyncDB_.
|
||||||
|
|
||||||
.. _AlterModelOnSyncDB: http://code.djangoproject.com/wiki/AlterModelOnSyncDB
|
.. _AlterModelOnSyncDB: http://code.djangoproject.com/wiki/AlterModelOnSyncDB
|
||||||
|
@ -422,12 +422,12 @@ SQLite 3.3.6 or newer strongly recommended
|
||||||
|
|
||||||
Versions of SQLite 3.3.5 and older contains the following bugs:
|
Versions of SQLite 3.3.5 and older contains the following bugs:
|
||||||
|
|
||||||
* A bug when `handling`_ ``ORDER BY`` parameters. This can cause problems when
|
* A bug when `handling`_ ``ORDER BY`` parameters. This can cause problems when
|
||||||
you use the ``select`` parameter for the ``extra()`` QuerySet method. The bug
|
you use the ``select`` parameter for the ``extra()`` QuerySet method. The bug
|
||||||
can be identified by the error message ``OperationalError: ORDER BY terms
|
can be identified by the error message ``OperationalError: ORDER BY terms
|
||||||
must not be non-integer constants``.
|
must not be non-integer constants``.
|
||||||
|
|
||||||
* A bug when handling `aggregation`_ together with DateFields and
|
* A bug when handling `aggregation`_ together with DateFields and
|
||||||
DecimalFields.
|
DecimalFields.
|
||||||
|
|
||||||
.. _handling: http://www.sqlite.org/cvstrac/tktview?tn=1768
|
.. _handling: http://www.sqlite.org/cvstrac/tktview?tn=1768
|
||||||
|
@ -507,14 +507,14 @@ is locked`` error.
|
||||||
|
|
||||||
If you're getting this error, you can solve it by:
|
If you're getting this error, you can solve it by:
|
||||||
|
|
||||||
* Switching to another database backend. At a certain point SQLite becomes
|
* Switching to another database backend. At a certain point SQLite becomes
|
||||||
too "lite" for real-world applications, and these sorts of concurrency
|
too "lite" for real-world applications, and these sorts of concurrency
|
||||||
errors indicate you've reached that point.
|
errors indicate you've reached that point.
|
||||||
|
|
||||||
* Rewriting your code to reduce concurrency and ensure that database
|
* Rewriting your code to reduce concurrency and ensure that database
|
||||||
transactions are short-lived.
|
transactions are short-lived.
|
||||||
|
|
||||||
* Increase the default timeout value by setting the ``timeout`` database
|
* Increase the default timeout value by setting the ``timeout`` database
|
||||||
option option::
|
option option::
|
||||||
|
|
||||||
'OPTIONS': {
|
'OPTIONS': {
|
||||||
|
@ -567,19 +567,19 @@ required.
|
||||||
In order for the ``python manage.py syncdb`` command to work, your Oracle
|
In order for the ``python manage.py syncdb`` command to work, your Oracle
|
||||||
database user must have privileges to run the following commands:
|
database user must have privileges to run the following commands:
|
||||||
|
|
||||||
* CREATE TABLE
|
* CREATE TABLE
|
||||||
* CREATE SEQUENCE
|
* CREATE SEQUENCE
|
||||||
* CREATE PROCEDURE
|
* CREATE PROCEDURE
|
||||||
* CREATE TRIGGER
|
* CREATE TRIGGER
|
||||||
|
|
||||||
To run Django's test suite, the user needs these *additional* privileges:
|
To run Django's test suite, the user needs these *additional* privileges:
|
||||||
|
|
||||||
* CREATE USER
|
* CREATE USER
|
||||||
* DROP USER
|
* DROP USER
|
||||||
* CREATE TABLESPACE
|
* CREATE TABLESPACE
|
||||||
* DROP TABLESPACE
|
* DROP TABLESPACE
|
||||||
* CONNECT WITH ADMIN OPTION
|
* CONNECT WITH ADMIN OPTION
|
||||||
* RESOURCE WITH ADMIN OPTION
|
* RESOURCE WITH ADMIN OPTION
|
||||||
|
|
||||||
Connecting to the database
|
Connecting to the database
|
||||||
--------------------------
|
--------------------------
|
||||||
|
@ -721,16 +721,16 @@ assumption.
|
||||||
The Oracle backend stores ``TextFields`` as ``NCLOB`` columns. Oracle imposes
|
The Oracle backend stores ``TextFields`` as ``NCLOB`` columns. Oracle imposes
|
||||||
some limitations on the usage of such LOB columns in general:
|
some limitations on the usage of such LOB columns in general:
|
||||||
|
|
||||||
* LOB columns may not be used as primary keys.
|
* LOB columns may not be used as primary keys.
|
||||||
|
|
||||||
* LOB columns may not be used in indexes.
|
* LOB columns may not be used in indexes.
|
||||||
|
|
||||||
* LOB columns may not be used in a ``SELECT DISTINCT`` list. This means that
|
* LOB columns may not be used in a ``SELECT DISTINCT`` list. This means that
|
||||||
attempting to use the ``QuerySet.distinct`` method on a model that
|
attempting to use the ``QuerySet.distinct`` method on a model that
|
||||||
includes ``TextField`` columns will result in an error when run against
|
includes ``TextField`` columns will result in an error when run against
|
||||||
Oracle. As a workaround, use the ``QuerySet.defer`` method in conjunction
|
Oracle. As a workaround, use the ``QuerySet.defer`` method in conjunction
|
||||||
with ``distinct()`` to prevent ``TextField`` columns from being included in
|
with ``distinct()`` to prevent ``TextField`` columns from being included in
|
||||||
the ``SELECT DISTINCT`` list.
|
the ``SELECT DISTINCT`` list.
|
||||||
|
|
||||||
.. _third-party-notes:
|
.. _third-party-notes:
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,9 @@ In addition, ``manage.py`` is automatically created in each Django project.
|
||||||
``manage.py`` is a thin wrapper around ``django-admin.py`` that takes care of
|
``manage.py`` is a thin wrapper around ``django-admin.py`` that takes care of
|
||||||
two things for you before delegating to ``django-admin.py``:
|
two things for you before delegating to ``django-admin.py``:
|
||||||
|
|
||||||
* It puts your project's package on ``sys.path``.
|
* It puts your project's package on ``sys.path``.
|
||||||
|
|
||||||
* It sets the :envvar:`DJANGO_SETTINGS_MODULE` environment variable so that
|
* It sets the :envvar:`DJANGO_SETTINGS_MODULE` environment variable so that
|
||||||
it points to your project's ``settings.py`` file.
|
it points to your project's ``settings.py`` file.
|
||||||
|
|
||||||
The ``django-admin.py`` script should be on your system path if you installed
|
The ``django-admin.py`` script should be on your system path if you installed
|
||||||
|
@ -128,9 +128,9 @@ Runs the command-line client for the database engine specified in your
|
||||||
``ENGINE`` setting, with the connection parameters specified in your
|
``ENGINE`` setting, with the connection parameters specified in your
|
||||||
:setting:`USER`, :setting:`PASSWORD`, etc., settings.
|
:setting:`USER`, :setting:`PASSWORD`, etc., settings.
|
||||||
|
|
||||||
* For PostgreSQL, this runs the ``psql`` command-line client.
|
* For PostgreSQL, this runs the ``psql`` command-line client.
|
||||||
* For MySQL, this runs the ``mysql`` command-line client.
|
* For MySQL, this runs the ``mysql`` command-line client.
|
||||||
* For SQLite, this runs the ``sqlite3`` command-line client.
|
* For SQLite, this runs the ``sqlite3`` command-line client.
|
||||||
|
|
||||||
This command assumes the programs are on your ``PATH`` so that a simple call to
|
This command assumes the programs are on your ``PATH`` so that a simple call to
|
||||||
the program name (``psql``, ``mysql``, ``sqlite3``) will find the program in
|
the program name (``psql``, ``mysql``, ``sqlite3``) will find the program in
|
||||||
|
@ -257,12 +257,12 @@ As you might expect, the created models will have an attribute for every field
|
||||||
in the table. Note that ``inspectdb`` has a few special cases in its field-name
|
in the table. Note that ``inspectdb`` has a few special cases in its field-name
|
||||||
output:
|
output:
|
||||||
|
|
||||||
* If ``inspectdb`` cannot map a column's type to a model field type, it'll
|
* If ``inspectdb`` cannot map a column's type to a model field type, it'll
|
||||||
use ``TextField`` and will insert the Python comment
|
use ``TextField`` and will insert the Python comment
|
||||||
``'This field type is a guess.'`` next to the field in the generated
|
``'This field type is a guess.'`` next to the field in the generated
|
||||||
model.
|
model.
|
||||||
|
|
||||||
* If the database column name is a Python reserved word (such as
|
* If the database column name is a Python reserved word (such as
|
||||||
``'pass'``, ``'class'`` or ``'for'``), ``inspectdb`` will append
|
``'pass'``, ``'class'`` or ``'for'``), ``inspectdb`` will append
|
||||||
``'_field'`` to the attribute name. For example, if a table has a column
|
``'_field'`` to the attribute name. For example, if a table has a column
|
||||||
``'for'``, the generated model will have a field ``'for_field'``, with
|
``'for'``, the generated model will have a field ``'for_field'``, with
|
||||||
|
@ -309,9 +309,9 @@ fixture can be distributed over multiple directories, in multiple applications.
|
||||||
|
|
||||||
Django will search in three locations for fixtures:
|
Django will search in three locations for fixtures:
|
||||||
|
|
||||||
1. In the ``fixtures`` directory of every installed application
|
1. In the ``fixtures`` directory of every installed application
|
||||||
2. In any directory named in the :setting:`FIXTURE_DIRS` setting
|
2. In any directory named in the :setting:`FIXTURE_DIRS` setting
|
||||||
3. In the literal path named by the fixture
|
3. In the literal path named by the fixture
|
||||||
|
|
||||||
Django will load any and all fixtures it finds in these locations that match
|
Django will load any and all fixtures it finds in these locations that match
|
||||||
the provided fixture names.
|
the provided fixture names.
|
||||||
|
@ -438,8 +438,8 @@ Example usage::
|
||||||
Use the ``--domain`` or ``-d`` option to change the domain of the messages files.
|
Use the ``--domain`` or ``-d`` option to change the domain of the messages files.
|
||||||
Currently supported:
|
Currently supported:
|
||||||
|
|
||||||
* ``django`` for all ``*.py``, ``*.html`` and ``*.txt`` files (default)
|
* ``django`` for all ``*.py``, ``*.html`` and ``*.txt`` files (default)
|
||||||
* ``djangojs`` for ``*.js`` files
|
* ``djangojs`` for ``*.js`` files
|
||||||
|
|
||||||
.. django-admin-option:: --symlinks
|
.. django-admin-option:: --symlinks
|
||||||
|
|
||||||
|
@ -984,19 +984,19 @@ For example, this command::
|
||||||
|
|
||||||
...would perform the following steps:
|
...would perform the following steps:
|
||||||
|
|
||||||
1. Create a test database, as described in :doc:`/topics/testing`.
|
1. Create a test database, as described in :doc:`/topics/testing`.
|
||||||
2. Populate the test database with fixture data from the given fixtures.
|
2. Populate the test database with fixture data from the given fixtures.
|
||||||
(For more on fixtures, see the documentation for ``loaddata`` above.)
|
(For more on fixtures, see the documentation for ``loaddata`` above.)
|
||||||
3. Runs the Django development server (as in ``runserver``), pointed at
|
3. Runs the Django development server (as in ``runserver``), pointed at
|
||||||
this newly created test database instead of your production database.
|
this newly created test database instead of your production database.
|
||||||
|
|
||||||
This is useful in a number of ways:
|
This is useful in a number of ways:
|
||||||
|
|
||||||
* When you're writing :doc:`unit tests </topics/testing>` of how your views
|
* When you're writing :doc:`unit tests </topics/testing>` of how your views
|
||||||
act with certain fixture data, you can use ``testserver`` to interact with
|
act with certain fixture data, you can use ``testserver`` to interact with
|
||||||
the views in a Web browser, manually.
|
the views in a Web browser, manually.
|
||||||
|
|
||||||
* Let's say you're developing your Django application and have a "pristine"
|
* Let's say you're developing your Django application and have a "pristine"
|
||||||
copy of a database that you'd like to interact with. You can dump your
|
copy of a database that you'd like to interact with. You can dump your
|
||||||
database to a fixture (using the ``dumpdata`` command, explained above),
|
database to a fixture (using the ``dumpdata`` command, explained above),
|
||||||
then use ``testserver`` to run your Web application with that data. With
|
then use ``testserver`` to run your Web application with that data. With
|
||||||
|
@ -1197,10 +1197,10 @@ Example usage::
|
||||||
Use ``--verbosity`` to specify the amount of notification and debug information
|
Use ``--verbosity`` to specify the amount of notification and debug information
|
||||||
that ``django-admin.py`` should print to the console.
|
that ``django-admin.py`` should print to the console.
|
||||||
|
|
||||||
* ``0`` means no output.
|
* ``0`` means no output.
|
||||||
* ``1`` means normal output (default).
|
* ``1`` means normal output (default).
|
||||||
* ``2`` means verbose output.
|
* ``2`` means verbose output.
|
||||||
* ``3`` means *very* verbose output.
|
* ``3`` means *very* verbose output.
|
||||||
|
|
||||||
Common options
|
Common options
|
||||||
==============
|
==============
|
||||||
|
@ -1259,13 +1259,13 @@ another program.
|
||||||
The colors used for syntax highlighting can be customized. Django
|
The colors used for syntax highlighting can be customized. Django
|
||||||
ships with three color palettes:
|
ships with three color palettes:
|
||||||
|
|
||||||
* ``dark``, suited to terminals that show white text on a black
|
* ``dark``, suited to terminals that show white text on a black
|
||||||
background. This is the default palette.
|
background. This is the default palette.
|
||||||
|
|
||||||
* ``light``, suited to terminals that show black text on a white
|
* ``light``, suited to terminals that show black text on a white
|
||||||
background.
|
background.
|
||||||
|
|
||||||
* ``nocolor``, which disables syntax highlighting.
|
* ``nocolor``, which disables syntax highlighting.
|
||||||
|
|
||||||
You select a palette by setting a ``DJANGO_COLORS`` environment
|
You select a palette by setting a ``DJANGO_COLORS`` environment
|
||||||
variable to specify the palette you want to use. For example, to
|
variable to specify the palette you want to use. For example, to
|
||||||
|
@ -1277,47 +1277,47 @@ would run the following at a command prompt::
|
||||||
You can also customize the colors that are used. Django specifies a
|
You can also customize the colors that are used. Django specifies a
|
||||||
number of roles in which color is used:
|
number of roles in which color is used:
|
||||||
|
|
||||||
* ``error`` - A major error.
|
* ``error`` - A major error.
|
||||||
* ``notice`` - A minor error.
|
* ``notice`` - A minor error.
|
||||||
* ``sql_field`` - The name of a model field in SQL.
|
* ``sql_field`` - The name of a model field in SQL.
|
||||||
* ``sql_coltype`` - The type of a model field in SQL.
|
* ``sql_coltype`` - The type of a model field in SQL.
|
||||||
* ``sql_keyword`` - A SQL keyword.
|
* ``sql_keyword`` - A SQL keyword.
|
||||||
* ``sql_table`` - The name of a model in SQL.
|
* ``sql_table`` - The name of a model in SQL.
|
||||||
* ``http_info`` - A 1XX HTTP Informational server response.
|
* ``http_info`` - A 1XX HTTP Informational server response.
|
||||||
* ``http_success`` - A 2XX HTTP Success server response.
|
* ``http_success`` - A 2XX HTTP Success server response.
|
||||||
* ``http_not_modified`` - A 304 HTTP Not Modified server response.
|
* ``http_not_modified`` - A 304 HTTP Not Modified server response.
|
||||||
* ``http_redirect`` - A 3XX HTTP Redirect server response other than 304.
|
* ``http_redirect`` - A 3XX HTTP Redirect server response other than 304.
|
||||||
* ``http_not_found`` - A 404 HTTP Not Found server response.
|
* ``http_not_found`` - A 404 HTTP Not Found server response.
|
||||||
* ``http_bad_request`` - A 4XX HTTP Bad Request server response other than 404.
|
* ``http_bad_request`` - A 4XX HTTP Bad Request server response other than 404.
|
||||||
* ``http_server_error`` - A 5XX HTTP Server Error response.
|
* ``http_server_error`` - A 5XX HTTP Server Error response.
|
||||||
|
|
||||||
Each of these roles can be assigned a specific foreground and
|
Each of these roles can be assigned a specific foreground and
|
||||||
background color, from the following list:
|
background color, from the following list:
|
||||||
|
|
||||||
* ``black``
|
* ``black``
|
||||||
* ``red``
|
* ``red``
|
||||||
* ``green``
|
* ``green``
|
||||||
* ``yellow``
|
* ``yellow``
|
||||||
* ``blue``
|
* ``blue``
|
||||||
* ``magenta``
|
* ``magenta``
|
||||||
* ``cyan``
|
* ``cyan``
|
||||||
* ``white``
|
* ``white``
|
||||||
|
|
||||||
Each of these colors can then be modified by using the following
|
Each of these colors can then be modified by using the following
|
||||||
display options:
|
display options:
|
||||||
|
|
||||||
* ``bold``
|
* ``bold``
|
||||||
* ``underscore``
|
* ``underscore``
|
||||||
* ``blink``
|
* ``blink``
|
||||||
* ``reverse``
|
* ``reverse``
|
||||||
* ``conceal``
|
* ``conceal``
|
||||||
|
|
||||||
A color specification follows one of the following patterns:
|
A color specification follows one of the following patterns:
|
||||||
|
|
||||||
* ``role=fg``
|
* ``role=fg``
|
||||||
* ``role=fg/bg``
|
* ``role=fg/bg``
|
||||||
* ``role=fg,option,option``
|
* ``role=fg,option,option``
|
||||||
* ``role=fg/bg,option,option``
|
* ``role=fg/bg,option,option``
|
||||||
|
|
||||||
where ``role`` is the name of a valid color role, ``fg`` is the
|
where ``role`` is the name of a valid color role, ``fg`` is the
|
||||||
foreground color, ``bg`` is the background color and each ``option``
|
foreground color, ``bg`` is the background color and each ``option``
|
||||||
|
@ -1348,9 +1348,9 @@ script, which lives in ``extras/django_bash_completion`` in the Django
|
||||||
distribution. It enables tab-completion of ``django-admin.py`` and
|
distribution. It enables tab-completion of ``django-admin.py`` and
|
||||||
``manage.py`` commands, so you can, for instance...
|
``manage.py`` commands, so you can, for instance...
|
||||||
|
|
||||||
* Type ``django-admin.py``.
|
* Type ``django-admin.py``.
|
||||||
* Press [TAB] to see all available options.
|
* Press [TAB] to see all available options.
|
||||||
* Type ``sql``, then [TAB], to see all available options whose names start
|
* Type ``sql``, then [TAB], to see all available options whose names start
|
||||||
with ``sql``.
|
with ``sql``.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,10 +19,10 @@ Bound and unbound forms
|
||||||
|
|
||||||
A :class:`Form` instance is either **bound** to a set of data, or **unbound**.
|
A :class:`Form` instance is either **bound** to a set of data, or **unbound**.
|
||||||
|
|
||||||
* If it's **bound** to a set of data, it's capable of validating that data
|
* If it's **bound** to a set of data, it's capable of validating that data
|
||||||
and rendering the form as HTML with the data displayed in the HTML.
|
and rendering the form as HTML with the data displayed in the HTML.
|
||||||
|
|
||||||
* If it's **unbound**, it cannot do validation (because there's no data to
|
* If it's **unbound**, it cannot do validation (because there's no data to
|
||||||
validate!), but it can still render the blank form as HTML.
|
validate!), but it can still render the blank form as HTML.
|
||||||
|
|
||||||
.. class:: Form
|
.. class:: Form
|
||||||
|
@ -292,25 +292,25 @@ include ``checked="checked"`` if appropriate::
|
||||||
This default output is a two-column HTML table, with a ``<tr>`` for each field.
|
This default output is a two-column HTML table, with a ``<tr>`` for each field.
|
||||||
Notice the following:
|
Notice the following:
|
||||||
|
|
||||||
* For flexibility, the output does *not* include the ``<table>`` and
|
* For flexibility, the output does *not* include the ``<table>`` and
|
||||||
``</table>`` tags, nor does it include the ``<form>`` and ``</form>``
|
``</table>`` tags, nor does it include the ``<form>`` and ``</form>``
|
||||||
tags or an ``<input type="submit">`` tag. It's your job to do that.
|
tags or an ``<input type="submit">`` tag. It's your job to do that.
|
||||||
|
|
||||||
* Each field type has a default HTML representation. ``CharField`` and
|
* Each field type has a default HTML representation. ``CharField`` and
|
||||||
``EmailField`` are represented by an ``<input type="text">``.
|
``EmailField`` are represented by an ``<input type="text">``.
|
||||||
``BooleanField`` is represented by an ``<input type="checkbox">``. Note
|
``BooleanField`` is represented by an ``<input type="checkbox">``. Note
|
||||||
these are merely sensible defaults; you can specify which HTML to use for
|
these are merely sensible defaults; you can specify which HTML to use for
|
||||||
a given field by using widgets, which we'll explain shortly.
|
a given field by using widgets, which we'll explain shortly.
|
||||||
|
|
||||||
* The HTML ``name`` for each tag is taken directly from its attribute name
|
* The HTML ``name`` for each tag is taken directly from its attribute name
|
||||||
in the ``ContactForm`` class.
|
in the ``ContactForm`` class.
|
||||||
|
|
||||||
* The text label for each field -- e.g. ``'Subject:'``, ``'Message:'`` and
|
* The text label for each field -- e.g. ``'Subject:'``, ``'Message:'`` and
|
||||||
``'Cc myself:'`` is generated from the field name by converting all
|
``'Cc myself:'`` is generated from the field name by converting all
|
||||||
underscores to spaces and upper-casing the first letter. Again, note
|
underscores to spaces and upper-casing the first letter. Again, note
|
||||||
these are merely sensible defaults; you can also specify labels manually.
|
these are merely sensible defaults; you can also specify labels manually.
|
||||||
|
|
||||||
* Each text label is surrounded in an HTML ``<label>`` tag, which points
|
* Each text label is surrounded in an HTML ``<label>`` tag, which points
|
||||||
to the appropriate form field via its ``id``. Its ``id``, in turn, is
|
to the appropriate form field via its ``id``. Its ``id``, in turn, is
|
||||||
generated by prepending ``'id_'`` to the field name. The ``id``
|
generated by prepending ``'id_'`` to the field name. The ``id``
|
||||||
attributes and ``<label>`` tags are included in the output by default, to
|
attributes and ``<label>`` tags are included in the output by default, to
|
||||||
|
|
|
@ -302,7 +302,7 @@ For each field, we describe the default widget used if you don't specify
|
||||||
the field has ``required=True``.
|
the field has ``required=True``.
|
||||||
* Error message keys: ``required``
|
* Error message keys: ``required``
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
Since all ``Field`` subclasses have ``required=True`` by default, the
|
Since all ``Field`` subclasses have ``required=True`` by default, the
|
||||||
validation condition here is important. If you want to include a boolean
|
validation condition here is important. If you want to include a boolean
|
||||||
|
@ -322,10 +322,10 @@ For each field, we describe the default widget used if you don't specify
|
||||||
Otherwise, all inputs are valid.
|
Otherwise, all inputs are valid.
|
||||||
* Error message keys: ``required``, ``max_length``, ``min_length``
|
* Error message keys: ``required``, ``max_length``, ``min_length``
|
||||||
|
|
||||||
Has two optional arguments for validation:
|
Has two optional arguments for validation:
|
||||||
|
|
||||||
.. attribute:: CharField.max_length
|
.. attribute:: max_length
|
||||||
.. attribute:: CharField.min_length
|
.. attribute:: min_length
|
||||||
|
|
||||||
If provided, these arguments ensure that the string is at most or at least
|
If provided, these arguments ensure that the string is at most or at least
|
||||||
the given length.
|
the given length.
|
||||||
|
@ -341,12 +341,12 @@ Has two optional arguments for validation:
|
||||||
* Validates that the given value exists in the list of choices.
|
* Validates that the given value exists in the list of choices.
|
||||||
* Error message keys: ``required``, ``invalid_choice``
|
* Error message keys: ``required``, ``invalid_choice``
|
||||||
|
|
||||||
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
||||||
replaced with the selected choice.
|
replaced with the selected choice.
|
||||||
|
|
||||||
Takes one extra required argument:
|
Takes one extra required argument:
|
||||||
|
|
||||||
.. attribute:: ChoiceField.choices
|
.. attribute:: choices
|
||||||
|
|
||||||
An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this
|
An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this
|
||||||
field. This argument accepts the same formats as the ``choices`` argument
|
field. This argument accepts the same formats as the ``choices`` argument
|
||||||
|
@ -358,8 +358,8 @@ Takes one extra required argument:
|
||||||
|
|
||||||
.. class:: TypedChoiceField(**kwargs)
|
.. class:: TypedChoiceField(**kwargs)
|
||||||
|
|
||||||
Just like a :class:`ChoiceField`, except :class:`TypedChoiceField` takes two
|
Just like a :class:`ChoiceField`, except :class:`TypedChoiceField` takes two
|
||||||
extra arguments, ``coerce`` and ``empty_value``.
|
extra arguments, ``coerce`` and ``empty_value``.
|
||||||
|
|
||||||
* Default widget: ``Select``
|
* Default widget: ``Select``
|
||||||
* Empty value: Whatever you've given as ``empty_value``
|
* Empty value: Whatever you've given as ``empty_value``
|
||||||
|
@ -368,15 +368,15 @@ extra arguments, ``coerce`` and ``empty_value``.
|
||||||
coerced.
|
coerced.
|
||||||
* Error message keys: ``required``, ``invalid_choice``
|
* Error message keys: ``required``, ``invalid_choice``
|
||||||
|
|
||||||
Takes extra arguments:
|
Takes extra arguments:
|
||||||
|
|
||||||
.. attribute:: TypedChoiceField.coerce
|
.. attribute:: coerce
|
||||||
|
|
||||||
A function that takes one argument and returns a coerced value. Examples
|
A function that takes one argument and returns a coerced value. Examples
|
||||||
include the built-in ``int``, ``float``, ``bool`` and other types. Defaults
|
include the built-in ``int``, ``float``, ``bool`` and other types. Defaults
|
||||||
to an identity function.
|
to an identity function.
|
||||||
|
|
||||||
.. attribute:: TypedChoiceField.empty_value
|
.. attribute:: empty_value
|
||||||
|
|
||||||
The value to use to represent "empty." Defaults to the empty string;
|
The value to use to represent "empty." Defaults to the empty string;
|
||||||
``None`` is another common choice here. Note that this value will not be
|
``None`` is another common choice here. Note that this value will not be
|
||||||
|
@ -395,14 +395,14 @@ Takes extra arguments:
|
||||||
``datetime.datetime`` or string formatted in a particular date format.
|
``datetime.datetime`` or string formatted in a particular date format.
|
||||||
* Error message keys: ``required``, ``invalid``
|
* Error message keys: ``required``, ``invalid``
|
||||||
|
|
||||||
Takes one optional argument:
|
Takes one optional argument:
|
||||||
|
|
||||||
.. attribute:: DateField.input_formats
|
.. attribute:: input_formats
|
||||||
|
|
||||||
A list of formats used to attempt to convert a string to a valid
|
A list of formats used to attempt to convert a string to a valid
|
||||||
``datetime.date`` object.
|
``datetime.date`` object.
|
||||||
|
|
||||||
If no ``input_formats`` argument is provided, the default input formats are::
|
If no ``input_formats`` argument is provided, the default input formats are::
|
||||||
|
|
||||||
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
|
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
|
||||||
'%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
|
'%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
|
||||||
|
@ -422,14 +422,14 @@ If no ``input_formats`` argument is provided, the default input formats are::
|
||||||
``datetime.date`` or string formatted in a particular datetime format.
|
``datetime.date`` or string formatted in a particular datetime format.
|
||||||
* Error message keys: ``required``, ``invalid``
|
* Error message keys: ``required``, ``invalid``
|
||||||
|
|
||||||
Takes one optional argument:
|
Takes one optional argument:
|
||||||
|
|
||||||
.. attribute:: DateTimeField.input_formats
|
.. attribute:: input_formats
|
||||||
|
|
||||||
A list of formats used to attempt to convert a string to a valid
|
A list of formats used to attempt to convert a string to a valid
|
||||||
``datetime.datetime`` object.
|
``datetime.datetime`` object.
|
||||||
|
|
||||||
If no ``input_formats`` argument is provided, the default input formats are::
|
If no ``input_formats`` argument is provided, the default input formats are::
|
||||||
|
|
||||||
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
|
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
|
||||||
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
|
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
|
||||||
|
@ -455,24 +455,24 @@ If no ``input_formats`` argument is provided, the default input formats are::
|
||||||
``min_value``, ``max_digits``, ``max_decimal_places``,
|
``min_value``, ``max_digits``, ``max_decimal_places``,
|
||||||
``max_whole_digits``
|
``max_whole_digits``
|
||||||
|
|
||||||
The ``max_value`` and ``min_value`` error messages may contain
|
The ``max_value`` and ``min_value`` error messages may contain
|
||||||
``%(limit_value)s``, which will be substituted by the appropriate limit.
|
``%(limit_value)s``, which will be substituted by the appropriate limit.
|
||||||
|
|
||||||
Takes four optional arguments:
|
Takes four optional arguments:
|
||||||
|
|
||||||
.. attribute:: DecimalField.max_value
|
.. attribute:: max_value
|
||||||
.. attribute:: DecimalField.min_value
|
.. attribute:: min_value
|
||||||
|
|
||||||
These control the range of values permitted in the field, and should be
|
These control the range of values permitted in the field, and should be
|
||||||
given as ``decimal.Decimal`` values.
|
given as ``decimal.Decimal`` values.
|
||||||
|
|
||||||
.. attribute:: DecimalField.max_digits
|
.. attribute:: max_digits
|
||||||
|
|
||||||
The maximum number of digits (those before the decimal point plus those
|
The maximum number of digits (those before the decimal point plus those
|
||||||
after the decimal point, with leading zeros stripped) permitted in the
|
after the decimal point, with leading zeros stripped) permitted in the
|
||||||
value.
|
value.
|
||||||
|
|
||||||
.. attribute:: DecimalField.decimal_places
|
.. attribute:: decimal_places
|
||||||
|
|
||||||
The maximum number of decimal places permitted.
|
The maximum number of decimal places permitted.
|
||||||
|
|
||||||
|
@ -488,9 +488,9 @@ Takes four optional arguments:
|
||||||
moderately complex regular expression.
|
moderately complex regular expression.
|
||||||
* Error message keys: ``required``, ``invalid``
|
* Error message keys: ``required``, ``invalid``
|
||||||
|
|
||||||
Has two optional arguments for validation, ``max_length`` and ``min_length``.
|
Has two optional arguments for validation, ``max_length`` and ``min_length``.
|
||||||
If provided, these arguments ensure that the string is at most or at least the
|
If provided, these arguments ensure that the string is at most or at least the
|
||||||
given length.
|
given length.
|
||||||
|
|
||||||
.. versionchanged:: 1.2
|
.. versionchanged:: 1.2
|
||||||
The EmailField previously did not recognize email addresses as valid that
|
The EmailField previously did not recognize email addresses as valid that
|
||||||
|
@ -510,20 +510,20 @@ given length.
|
||||||
* Error message keys: ``required``, ``invalid``, ``missing``, ``empty``,
|
* Error message keys: ``required``, ``invalid``, ``missing``, ``empty``,
|
||||||
``max_length``
|
``max_length``
|
||||||
|
|
||||||
Has two optional arguments for validation, ``max_length`` and
|
Has two optional arguments for validation, ``max_length`` and
|
||||||
``allow_empty_file``. If provided, these ensure that the file name is at
|
``allow_empty_file``. If provided, these ensure that the file name is at
|
||||||
most the given length, and that validation will succeed even if the file
|
most the given length, and that validation will succeed even if the file
|
||||||
content is empty.
|
content is empty.
|
||||||
|
|
||||||
To learn more about the ``UploadedFile`` object, see the :doc:`file uploads
|
To learn more about the ``UploadedFile`` object, see the :doc:`file uploads
|
||||||
documentation </topics/http/file-uploads>`.
|
documentation </topics/http/file-uploads>`.
|
||||||
|
|
||||||
When you use a ``FileField`` in a form, you must also remember to
|
When you use a ``FileField`` in a form, you must also remember to
|
||||||
:ref:`bind the file data to the form <binding-uploaded-files>`.
|
:ref:`bind the file data to the form <binding-uploaded-files>`.
|
||||||
|
|
||||||
The ``max_length`` error refers to the length of the filename. In the error
|
The ``max_length`` error refers to the length of the filename. In the error
|
||||||
message for that key, ``%(max)d`` will be replaced with the maximum filename
|
message for that key, ``%(max)d`` will be replaced with the maximum filename
|
||||||
length and ``%(length)d`` will be replaced with the current filename length.
|
length and ``%(length)d`` will be replaced with the current filename length.
|
||||||
|
|
||||||
``FilePathField``
|
``FilePathField``
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
@ -536,21 +536,21 @@ length and ``%(length)d`` will be replaced with the current filename length.
|
||||||
* Validates that the selected choice exists in the list of choices.
|
* Validates that the selected choice exists in the list of choices.
|
||||||
* Error message keys: ``required``, ``invalid_choice``
|
* Error message keys: ``required``, ``invalid_choice``
|
||||||
|
|
||||||
The field allows choosing from files inside a certain directory. It takes three
|
The field allows choosing from files inside a certain directory. It takes three
|
||||||
extra arguments; only ``path`` is required:
|
extra arguments; only ``path`` is required:
|
||||||
|
|
||||||
.. attribute:: FilePathField.path
|
.. attribute:: path
|
||||||
|
|
||||||
The absolute path to the directory whose contents you want listed. This
|
The absolute path to the directory whose contents you want listed. This
|
||||||
directory must exist.
|
directory must exist.
|
||||||
|
|
||||||
.. attribute:: FilePathField.recursive
|
.. attribute:: recursive
|
||||||
|
|
||||||
If ``False`` (the default) only the direct contents of ``path`` will be
|
If ``False`` (the default) only the direct contents of ``path`` will be
|
||||||
offered as choices. If ``True``, the directory will be descended into
|
offered as choices. If ``True``, the directory will be descended into
|
||||||
recursively and all descendants will be listed as choices.
|
recursively and all descendants will be listed as choices.
|
||||||
|
|
||||||
.. attribute:: FilePathField.match
|
.. attribute:: match
|
||||||
|
|
||||||
A regular expression pattern; only files with names matching this expression
|
A regular expression pattern; only files with names matching this expression
|
||||||
will be allowed as choices.
|
will be allowed as choices.
|
||||||
|
@ -558,6 +558,8 @@ extra arguments; only ``path`` is required:
|
||||||
``FloatField``
|
``FloatField``
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. class:: FloatField(**kwargs)
|
||||||
|
|
||||||
* Default widget: ``TextInput``
|
* Default widget: ``TextInput``
|
||||||
* Empty value: ``None``
|
* Empty value: ``None``
|
||||||
* Normalizes to: A Python float.
|
* Normalizes to: A Python float.
|
||||||
|
@ -566,8 +568,8 @@ extra arguments; only ``path`` is required:
|
||||||
* Error message keys: ``required``, ``invalid``, ``max_value``,
|
* Error message keys: ``required``, ``invalid``, ``max_value``,
|
||||||
``min_value``
|
``min_value``
|
||||||
|
|
||||||
Takes two optional arguments for validation, ``max_value`` and ``min_value``.
|
Takes two optional arguments for validation, ``max_value`` and ``min_value``.
|
||||||
These control the range of values permitted in the field.
|
These control the range of values permitted in the field.
|
||||||
|
|
||||||
``ImageField``
|
``ImageField``
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
@ -583,10 +585,10 @@ These control the range of values permitted in the field.
|
||||||
* Error message keys: ``required``, ``invalid``, ``missing``, ``empty``,
|
* Error message keys: ``required``, ``invalid``, ``missing``, ``empty``,
|
||||||
``invalid_image``
|
``invalid_image``
|
||||||
|
|
||||||
Using an ImageField requires that the `Python Imaging Library`_ is installed.
|
Using an ImageField requires that the `Python Imaging Library`_ is installed.
|
||||||
|
|
||||||
When you use an ``ImageField`` on a form, you must also remember to
|
When you use an ``ImageField`` on a form, you must also remember to
|
||||||
:ref:`bind the file data to the form <binding-uploaded-files>`.
|
:ref:`bind the file data to the form <binding-uploaded-files>`.
|
||||||
|
|
||||||
.. _Python Imaging Library: http://www.pythonware.com/products/pil/
|
.. _Python Imaging Library: http://www.pythonware.com/products/pil/
|
||||||
|
|
||||||
|
@ -603,13 +605,13 @@ When you use an ``ImageField`` on a form, you must also remember to
|
||||||
* Error message keys: ``required``, ``invalid``, ``max_value``,
|
* Error message keys: ``required``, ``invalid``, ``max_value``,
|
||||||
``min_value``
|
``min_value``
|
||||||
|
|
||||||
The ``max_value`` and ``min_value`` error messages may contain
|
The ``max_value`` and ``min_value`` error messages may contain
|
||||||
``%(limit_value)s``, which will be substituted by the appropriate limit.
|
``%(limit_value)s``, which will be substituted by the appropriate limit.
|
||||||
|
|
||||||
Takes two optional arguments for validation:
|
Takes two optional arguments for validation:
|
||||||
|
|
||||||
.. attribute:: IntegerField.max_value
|
.. attribute:: max_value
|
||||||
.. attribute:: IntegerField.min_value
|
.. attribute:: min_value
|
||||||
|
|
||||||
These control the range of values permitted in the field.
|
These control the range of values permitted in the field.
|
||||||
|
|
||||||
|
@ -628,11 +630,11 @@ Takes two optional arguments for validation:
|
||||||
``GenericIPAddressField``
|
``GenericIPAddressField``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. class:: GenericIPAddressField(**kwargs)
|
|
||||||
|
|
||||||
.. versionadded:: 1.4
|
.. versionadded:: 1.4
|
||||||
|
|
||||||
A field containing either an IPv4 or an IPv6 address.
|
.. class:: GenericIPAddressField(**kwargs)
|
||||||
|
|
||||||
|
A field containing either an IPv4 or an IPv6 address.
|
||||||
|
|
||||||
* Default widget: ``TextInput``
|
* Default widget: ``TextInput``
|
||||||
* Empty value: ``''`` (an empty string)
|
* Empty value: ``''`` (an empty string)
|
||||||
|
@ -641,21 +643,21 @@ A field containing either an IPv4 or an IPv6 address.
|
||||||
* Validates that the given value is a valid IP address.
|
* Validates that the given value is a valid IP address.
|
||||||
* Error message keys: ``required``, ``invalid``
|
* Error message keys: ``required``, ``invalid``
|
||||||
|
|
||||||
The IPv6 address normalization follows :rfc:`4291#section-2.2` section 2.2,
|
The IPv6 address normalization follows :rfc:`4291#section-2.2` section 2.2,
|
||||||
including using the IPv4 format suggested in paragraph 3 of that section, like
|
including using the IPv4 format suggested in paragraph 3 of that section, like
|
||||||
``::ffff:192.0.2.0``. For example, ``2001:0::0:01`` would be normalized to
|
``::ffff:192.0.2.0``. For example, ``2001:0::0:01`` would be normalized to
|
||||||
``2001::1``, and ``::ffff:0a0a:0a0a`` to ``::ffff:10.10.10.10``. All characters
|
``2001::1``, and ``::ffff:0a0a:0a0a`` to ``::ffff:10.10.10.10``. All characters
|
||||||
are converted to lowercase.
|
are converted to lowercase.
|
||||||
|
|
||||||
Takes two optional arguments:
|
Takes two optional arguments:
|
||||||
|
|
||||||
.. attribute:: GenericIPAddressField.protocol
|
.. attribute:: protocol
|
||||||
|
|
||||||
Limits valid inputs to the specified protocol.
|
Limits valid inputs to the specified protocol.
|
||||||
Accepted values are ``both`` (default), ``IPv4``
|
Accepted values are ``both`` (default), ``IPv4``
|
||||||
or ``IPv6``. Matching is case insensitive.
|
or ``IPv6``. Matching is case insensitive.
|
||||||
|
|
||||||
.. attribute:: GenericIPAddressField.unpack_ipv4
|
.. attribute:: unpack_ipv4
|
||||||
|
|
||||||
Unpacks IPv4 mapped addresses like ``::ffff::192.0.2.1``.
|
Unpacks IPv4 mapped addresses like ``::ffff::192.0.2.1``.
|
||||||
If this option is enabled that address would be unpacked to
|
If this option is enabled that address would be unpacked to
|
||||||
|
@ -674,20 +676,20 @@ Takes two optional arguments:
|
||||||
of choices.
|
of choices.
|
||||||
* Error message keys: ``required``, ``invalid_choice``, ``invalid_list``
|
* Error message keys: ``required``, ``invalid_choice``, ``invalid_list``
|
||||||
|
|
||||||
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
||||||
replaced with the selected choice.
|
replaced with the selected choice.
|
||||||
|
|
||||||
Takes one extra required argument, ``choices``, as for ``ChoiceField``.
|
Takes one extra required argument, ``choices``, as for ``ChoiceField``.
|
||||||
|
|
||||||
``TypedMultipleChoiceField``
|
``TypedMultipleChoiceField``
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. class:: TypedMultipleChoiceField(**kwargs)
|
|
||||||
|
|
||||||
.. versionadded:: 1.3
|
.. versionadded:: 1.3
|
||||||
|
|
||||||
Just like a :class:`MultipleChoiceField`, except :class:`TypedMultipleChoiceField`
|
.. class:: TypedMultipleChoiceField(**kwargs)
|
||||||
takes two extra arguments, ``coerce`` and ``empty_value``.
|
|
||||||
|
Just like a :class:`MultipleChoiceField`, except :class:`TypedMultipleChoiceField`
|
||||||
|
takes two extra arguments, ``coerce`` and ``empty_value``.
|
||||||
|
|
||||||
* Default widget: ``SelectMultiple``
|
* Default widget: ``SelectMultiple``
|
||||||
* Empty value: Whatever you've given as ``empty_value``
|
* Empty value: Whatever you've given as ``empty_value``
|
||||||
|
@ -697,10 +699,10 @@ takes two extra arguments, ``coerce`` and ``empty_value``.
|
||||||
coerced.
|
coerced.
|
||||||
* Error message keys: ``required``, ``invalid_choice``
|
* Error message keys: ``required``, ``invalid_choice``
|
||||||
|
|
||||||
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
The ``invalid_choice`` error message may contain ``%(value)s``, which will be
|
||||||
replaced with the selected choice.
|
replaced with the selected choice.
|
||||||
|
|
||||||
Takes two extra arguments, ``coerce`` and ``empty_value``, as for ``TypedChoiceField``.
|
Takes two extra arguments, ``coerce`` and ``empty_value``, as for ``TypedChoiceField``.
|
||||||
|
|
||||||
``NullBooleanField``
|
``NullBooleanField``
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -724,20 +726,20 @@ Takes two extra arguments, ``coerce`` and ``empty_value``, as for ``TypedChoiceF
|
||||||
expression.
|
expression.
|
||||||
* Error message keys: ``required``, ``invalid``
|
* Error message keys: ``required``, ``invalid``
|
||||||
|
|
||||||
Takes one required argument:
|
Takes one required argument:
|
||||||
|
|
||||||
.. attribute:: RegexField.regex
|
.. attribute:: regex
|
||||||
|
|
||||||
A regular expression specified either as a string or a compiled regular
|
A regular expression specified either as a string or a compiled regular
|
||||||
expression object.
|
expression object.
|
||||||
|
|
||||||
Also takes ``max_length`` and ``min_length``, which work just as they do for
|
Also takes ``max_length`` and ``min_length``, which work just as they do for
|
||||||
``CharField``.
|
``CharField``.
|
||||||
|
|
||||||
The optional argument ``error_message`` is also accepted for backwards
|
The optional argument ``error_message`` is also accepted for backwards
|
||||||
compatibility. The preferred way to provide an error message is to use the
|
compatibility. The preferred way to provide an error message is to use the
|
||||||
``error_messages`` argument, passing a dictionary with ``'invalid'`` as a key
|
``error_messages`` argument, passing a dictionary with ``'invalid'`` as a key
|
||||||
and the error message as the value.
|
and the error message as the value.
|
||||||
|
|
||||||
``SlugField``
|
``SlugField``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
@ -751,8 +753,8 @@ and the error message as the value.
|
||||||
underscores, and hyphens.
|
underscores, and hyphens.
|
||||||
* Error messages: ``required``, ``invalid``
|
* Error messages: ``required``, ``invalid``
|
||||||
|
|
||||||
This field is intended for use in representing a model
|
This field is intended for use in representing a model
|
||||||
:class:`~django.db.models.SlugField` in forms.
|
:class:`~django.db.models.SlugField` in forms.
|
||||||
|
|
||||||
``TimeField``
|
``TimeField``
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
@ -766,14 +768,14 @@ This field is intended for use in representing a model
|
||||||
formatted in a particular time format.
|
formatted in a particular time format.
|
||||||
* Error message keys: ``required``, ``invalid``
|
* Error message keys: ``required``, ``invalid``
|
||||||
|
|
||||||
Takes one optional argument:
|
Takes one optional argument:
|
||||||
|
|
||||||
.. attribute:: TimeField.input_formats
|
.. attribute:: input_formats
|
||||||
|
|
||||||
A list of formats used to attempt to convert a string to a valid
|
A list of formats used to attempt to convert a string to a valid
|
||||||
``datetime.time`` object.
|
``datetime.time`` object.
|
||||||
|
|
||||||
If no ``input_formats`` argument is provided, the default input formats are::
|
If no ``input_formats`` argument is provided, the default input formats are::
|
||||||
|
|
||||||
'%H:%M:%S', # '14:30:59'
|
'%H:%M:%S', # '14:30:59'
|
||||||
'%H:%M', # '14:30'
|
'%H:%M', # '14:30'
|
||||||
|
@ -789,24 +791,23 @@ If no ``input_formats`` argument is provided, the default input formats are::
|
||||||
* Validates that the given value is a valid URL.
|
* Validates that the given value is a valid URL.
|
||||||
* Error message keys: ``required``, ``invalid``, ``invalid_link``
|
* Error message keys: ``required``, ``invalid``, ``invalid_link``
|
||||||
|
|
||||||
Takes the following optional arguments:
|
Takes the following optional arguments:
|
||||||
|
|
||||||
.. attribute:: URLField.max_length
|
.. attribute:: max_length
|
||||||
.. attribute:: URLField.min_length
|
.. attribute:: min_length
|
||||||
|
|
||||||
Same as ``CharField.max_length`` and ``CharField.min_length``.
|
These are the same as ``CharField.max_length`` and ``CharField.min_length``.
|
||||||
|
|
||||||
.. attribute:: URLField.verify_exists
|
.. attribute:: verify_exists
|
||||||
|
|
||||||
If ``True``, the validator will attempt to load the given URL, raising
|
If ``True``, the validator will attempt to load the given URL, raising
|
||||||
``ValidationError`` if the page gives a 404. Defaults to ``False``.
|
``ValidationError`` if the page gives a 404. Defaults to ``False``.
|
||||||
|
|
||||||
.. deprecated:: 1.4
|
.. deprecated:: 1.4
|
||||||
|
|
||||||
``verify_exists`` was deprecated for security reasons and will be removed in
|
``verify_exists`` was deprecated for security reasons and will be removed in
|
||||||
Django 1.5. This deprecation also removes ``validator_user_agent``.
|
Django 1.5. This deprecation also removes ``validator_user_agent``.
|
||||||
|
|
||||||
.. attribute:: URLField.validator_user_agent
|
.. attribute:: validator_user_agent
|
||||||
|
|
||||||
String used as the user-agent used when checking for a URL's existence.
|
String used as the user-agent used when checking for a URL's existence.
|
||||||
Defaults to the value of the :setting:`URL_VALIDATOR_USER_AGENT` setting.
|
Defaults to the value of the :setting:`URL_VALIDATOR_USER_AGENT` setting.
|
||||||
|
@ -832,9 +833,9 @@ Slightly complex built-in ``Field`` classes
|
||||||
as an argument to the ``ComboField``.
|
as an argument to the ``ComboField``.
|
||||||
* Error message keys: ``required``, ``invalid``
|
* Error message keys: ``required``, ``invalid``
|
||||||
|
|
||||||
Takes one extra required argument:
|
Takes one extra required argument:
|
||||||
|
|
||||||
.. attribute:: ComboField.fields
|
.. attribute:: fields
|
||||||
|
|
||||||
The list of fields that should be used to validate the field's value (in
|
The list of fields that should be used to validate the field's value (in
|
||||||
the order in which they are provided).
|
the order in which they are provided).
|
||||||
|
@ -866,9 +867,9 @@ Takes one extra required argument:
|
||||||
:class:`SplitDateTimeField` is a subclass which combines a time field and
|
:class:`SplitDateTimeField` is a subclass which combines a time field and
|
||||||
a date field into a datetime object.
|
a date field into a datetime object.
|
||||||
|
|
||||||
Takes one extra required argument:
|
Takes one extra required argument:
|
||||||
|
|
||||||
.. attribute:: MultiValueField.fields
|
.. attribute:: fields
|
||||||
|
|
||||||
A list of fields which are cleaned into a single field. Each value in
|
A list of fields which are cleaned into a single field. Each value in
|
||||||
``clean`` is cleaned by the corresponding field in ``fields`` -- the first
|
``clean`` is cleaned by the corresponding field in ``fields`` -- the first
|
||||||
|
@ -889,23 +890,23 @@ Takes one extra required argument:
|
||||||
* Error message keys: ``required``, ``invalid``, ``invalid_date``,
|
* Error message keys: ``required``, ``invalid``, ``invalid_date``,
|
||||||
``invalid_time``
|
``invalid_time``
|
||||||
|
|
||||||
Takes two optional arguments:
|
Takes two optional arguments:
|
||||||
|
|
||||||
.. attribute:: SplitDateTimeField.input_date_formats
|
.. attribute:: input_date_formats
|
||||||
|
|
||||||
A list of formats used to attempt to convert a string to a valid
|
A list of formats used to attempt to convert a string to a valid
|
||||||
``datetime.date`` object.
|
``datetime.date`` object.
|
||||||
|
|
||||||
If no ``input_date_formats`` argument is provided, the default input formats
|
If no ``input_date_formats`` argument is provided, the default input formats
|
||||||
for ``DateField`` are used.
|
for ``DateField`` are used.
|
||||||
|
|
||||||
.. attribute:: SplitDateTimeField.input_time_formats
|
.. attribute:: input_time_formats
|
||||||
|
|
||||||
A list of formats used to attempt to convert a string to a valid
|
A list of formats used to attempt to convert a string to a valid
|
||||||
``datetime.time`` object.
|
``datetime.time`` object.
|
||||||
|
|
||||||
If no ``input_time_formats`` argument is provided, the default input formats
|
If no ``input_time_formats`` argument is provided, the default input formats
|
||||||
for ``TimeField`` are used.
|
for ``TimeField`` are used.
|
||||||
|
|
||||||
Fields which handle relationships
|
Fields which handle relationships
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
@ -930,18 +931,18 @@ objects (in the case of ``ModelMultipleChoiceField``) into the
|
||||||
* Validates that the given id exists in the queryset.
|
* Validates that the given id exists in the queryset.
|
||||||
* Error message keys: ``required``, ``invalid_choice``
|
* Error message keys: ``required``, ``invalid_choice``
|
||||||
|
|
||||||
Allows the selection of a single model object, suitable for
|
Allows the selection of a single model object, suitable for
|
||||||
representing a foreign key. A single argument is required:
|
representing a foreign key. A single argument is required:
|
||||||
|
|
||||||
.. attribute:: ModelChoiceField.queryset
|
.. attribute:: queryset
|
||||||
|
|
||||||
A ``QuerySet`` of model objects from which the choices for the
|
A ``QuerySet`` of model objects from which the choices for the
|
||||||
field will be derived, and which will be used to validate the
|
field will be derived, and which will be used to validate the
|
||||||
user's selection.
|
user's selection.
|
||||||
|
|
||||||
``ModelChoiceField`` also takes one optional argument:
|
``ModelChoiceField`` also takes one optional argument:
|
||||||
|
|
||||||
.. attribute:: ModelChoiceField.empty_label
|
.. attribute:: empty_label
|
||||||
|
|
||||||
By default the ``<select>`` widget used by ``ModelChoiceField`` will have an
|
By default the ``<select>`` widget used by ``ModelChoiceField`` will have an
|
||||||
empty choice at the top of the list. You can change the text of this
|
empty choice at the top of the list. You can change the text of this
|
||||||
|
@ -959,12 +960,12 @@ representing a foreign key. A single argument is required:
|
||||||
initial value, no empty choice is created (regardless of the value
|
initial value, no empty choice is created (regardless of the value
|
||||||
of ``empty_label``).
|
of ``empty_label``).
|
||||||
|
|
||||||
The ``__unicode__`` method of the model will be called to generate
|
The ``__unicode__`` method of the model will be called to generate
|
||||||
string representations of the objects for use in the field's choices;
|
string representations of the objects for use in the field's choices;
|
||||||
to provide customized representations, subclass ``ModelChoiceField``
|
to provide customized representations, subclass ``ModelChoiceField``
|
||||||
and override ``label_from_instance``. This method will receive a model
|
and override ``label_from_instance``. This method will receive a model
|
||||||
object, and should return a string suitable for representing it. For
|
object, and should return a string suitable for representing it. For
|
||||||
example::
|
example::
|
||||||
|
|
||||||
class MyModelChoiceField(ModelChoiceField):
|
class MyModelChoiceField(ModelChoiceField):
|
||||||
def label_from_instance(self, obj):
|
def label_from_instance(self, obj):
|
||||||
|
@ -983,12 +984,12 @@ example::
|
||||||
* Error message keys: ``required``, ``list``, ``invalid_choice``,
|
* Error message keys: ``required``, ``list``, ``invalid_choice``,
|
||||||
``invalid_pk_value``
|
``invalid_pk_value``
|
||||||
|
|
||||||
Allows the selection of one or more model objects, suitable for
|
Allows the selection of one or more model objects, suitable for
|
||||||
representing a many-to-many relation. As with :class:`ModelChoiceField`,
|
representing a many-to-many relation. As with :class:`ModelChoiceField`,
|
||||||
you can use ``label_from_instance`` to customize the object
|
you can use ``label_from_instance`` to customize the object
|
||||||
representations, and ``queryset`` is a required parameter:
|
representations, and ``queryset`` is a required parameter:
|
||||||
|
|
||||||
.. attribute:: ModelMultipleChoiceField.queryset
|
.. attribute:: queryset
|
||||||
|
|
||||||
A ``QuerySet`` of model objects from which the choices for the
|
A ``QuerySet`` of model objects from which the choices for the
|
||||||
field will be derived, and which will be used to validate the
|
field will be derived, and which will be used to validate the
|
||||||
|
|
|
@ -28,32 +28,32 @@ after the field's ``to_python`` and ``validate`` methods have been called.
|
||||||
Validation of a Form is split into several steps, which can be customized or
|
Validation of a Form is split into several steps, which can be customized or
|
||||||
overridden:
|
overridden:
|
||||||
|
|
||||||
* The ``to_python()`` method on a Field is the first step in every
|
* The ``to_python()`` method on a Field is the first step in every
|
||||||
validation. It coerces the value to correct datatype and raises
|
validation. It coerces the value to correct datatype and raises
|
||||||
``ValidationError`` if that is not possible. This method accepts the raw
|
``ValidationError`` if that is not possible. This method accepts the raw
|
||||||
value from the widget and returns the converted value. For example, a
|
value from the widget and returns the converted value. For example, a
|
||||||
FloatField will turn the data into a Python ``float`` or raise a
|
FloatField will turn the data into a Python ``float`` or raise a
|
||||||
``ValidationError``.
|
``ValidationError``.
|
||||||
|
|
||||||
* The ``validate()`` method on a Field handles field-specific validation
|
* The ``validate()`` method on a Field handles field-specific validation
|
||||||
that is not suitable for a validator, It takes a value that has been
|
that is not suitable for a validator, It takes a value that has been
|
||||||
coerced to correct datatype and raises ``ValidationError`` on any error.
|
coerced to correct datatype and raises ``ValidationError`` on any error.
|
||||||
This method does not return anything and shouldn't alter the value. You
|
This method does not return anything and shouldn't alter the value. You
|
||||||
should override it to handle validation logic that you can't or don't
|
should override it to handle validation logic that you can't or don't
|
||||||
want to put in a validator.
|
want to put in a validator.
|
||||||
|
|
||||||
* The ``run_validators()`` method on a Field runs all of the field's
|
* The ``run_validators()`` method on a Field runs all of the field's
|
||||||
validators and aggregates all the errors into a single
|
validators and aggregates all the errors into a single
|
||||||
``ValidationError``. You shouldn't need to override this method.
|
``ValidationError``. You shouldn't need to override this method.
|
||||||
|
|
||||||
* The ``clean()`` method on a Field subclass. This is responsible for
|
* The ``clean()`` method on a Field subclass. This is responsible for
|
||||||
running ``to_python``, ``validate`` and ``run_validators`` in the correct
|
running ``to_python``, ``validate`` and ``run_validators`` in the correct
|
||||||
order and propagating their errors. If, at any time, any of the methods
|
order and propagating their errors. If, at any time, any of the methods
|
||||||
raise ``ValidationError``, the validation stops and that error is raised.
|
raise ``ValidationError``, the validation stops and that error is raised.
|
||||||
This method returns the clean data, which is then inserted into the
|
This method returns the clean data, which is then inserted into the
|
||||||
``cleaned_data`` dictionary of the form.
|
``cleaned_data`` dictionary of the form.
|
||||||
|
|
||||||
* The ``clean_<fieldname>()`` method in a form subclass -- where
|
* The ``clean_<fieldname>()`` method in a form subclass -- where
|
||||||
``<fieldname>`` is replaced with the name of the form field attribute.
|
``<fieldname>`` is replaced with the name of the form field attribute.
|
||||||
This method does any cleaning that is specific to that particular
|
This method does any cleaning that is specific to that particular
|
||||||
attribute, unrelated to the type of field that it is. This method is not
|
attribute, unrelated to the type of field that it is. This method is not
|
||||||
|
@ -74,7 +74,7 @@ overridden:
|
||||||
should return the cleaned data, regardless of whether it changed
|
should return the cleaned data, regardless of whether it changed
|
||||||
anything or not.
|
anything or not.
|
||||||
|
|
||||||
* The Form subclass's ``clean()`` method. This method can perform
|
* The Form subclass's ``clean()`` method. This method can perform
|
||||||
any validation that requires access to multiple fields from the form at
|
any validation that requires access to multiple fields from the form at
|
||||||
once. This is where you might put in things to check that if field ``A``
|
once. This is where you might put in things to check that if field ``A``
|
||||||
is supplied, field ``B`` must contain a valid email address and the
|
is supplied, field ``B`` must contain a valid email address and the
|
||||||
|
|
|
@ -21,9 +21,7 @@ which widget is used on which field, see the documentation about
|
||||||
|
|
||||||
However, if you want to use a different widget for a field, you can
|
However, if you want to use a different widget for a field, you can
|
||||||
just use the :attr:`~Field.widget` argument on the field definition. For
|
just use the :attr:`~Field.widget` argument on the field definition. For
|
||||||
example:
|
example::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
|
@ -42,9 +40,7 @@ Setting arguments for widgets
|
||||||
Many widgets have optional extra arguments; they can be set when defining the
|
Many widgets have optional extra arguments; they can be set when defining the
|
||||||
widget on the field. In the following example, the
|
widget on the field. In the following example, the
|
||||||
:attr:`~SelectDateWidget.years` attribute is set for a
|
:attr:`~SelectDateWidget.years` attribute is set for a
|
||||||
:class:`~django.forms.extras.widgets.SelectDateWidget`:
|
:class:`~django.forms.extras.widgets.SelectDateWidget`::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
from django.forms.fields import DateField, ChoiceField, MultipleChoiceField
|
from django.forms.fields import DateField, ChoiceField, MultipleChoiceField
|
||||||
from django.forms.widgets import RadioSelect, CheckboxSelectMultiple
|
from django.forms.widgets import RadioSelect, CheckboxSelectMultiple
|
||||||
|
@ -78,9 +74,7 @@ buttons.
|
||||||
:class:`Select` widgets are used by default on :class:`ChoiceField` fields. The
|
:class:`Select` widgets are used by default on :class:`ChoiceField` fields. The
|
||||||
choices displayed on the widget are inherited from the :class:`ChoiceField` and
|
choices displayed on the widget are inherited from the :class:`ChoiceField` and
|
||||||
changing :attr:`ChoiceField.choices` will update :attr:`Select.choices`. For
|
changing :attr:`ChoiceField.choices` will update :attr:`Select.choices`. For
|
||||||
example:
|
example::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> from django import forms
|
>>> from django import forms
|
||||||
>>> CHOICES = (('1', 'First',), ('2', 'Second',)))
|
>>> CHOICES = (('1', 'First',), ('2', 'Second',)))
|
||||||
|
@ -113,9 +107,7 @@ specify additional attributes for each widget. When you specify a
|
||||||
widget, you can provide a list of attributes that will be added to the
|
widget, you can provide a list of attributes that will be added to the
|
||||||
rendered HTML for the widget.
|
rendered HTML for the widget.
|
||||||
|
|
||||||
For example, take the following simple form:
|
For example, take the following simple form::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
|
@ -126,9 +118,7 @@ For example, take the following simple form:
|
||||||
|
|
||||||
This form will include three default :class:`TextInput` widgets, with default
|
This form will include three default :class:`TextInput` widgets, with default
|
||||||
rendering -- no CSS class, no extra attributes. This means that the input boxes
|
rendering -- no CSS class, no extra attributes. This means that the input boxes
|
||||||
provided for each widget will be rendered exactly the same:
|
provided for each widget will be rendered exactly the same::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> f = CommentForm(auto_id=False)
|
>>> f = CommentForm(auto_id=False)
|
||||||
>>> f.as_table()
|
>>> f.as_table()
|
||||||
|
@ -136,15 +126,12 @@ provided for each widget will be rendered exactly the same:
|
||||||
<tr><th>Url:</th><td><input type="text" name="url"/></td></tr>
|
<tr><th>Url:</th><td><input type="text" name="url"/></td></tr>
|
||||||
<tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
|
<tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
|
||||||
|
|
||||||
|
|
||||||
On a real Web page, you probably don't want every widget to look the same. You
|
On a real Web page, you probably don't want every widget to look the same. You
|
||||||
might want a larger input element for the comment, and you might want the
|
might want a larger input element for the comment, and you might want the
|
||||||
'name' widget to have some special CSS class. To do this, you use the
|
'name' widget to have some special CSS class. To do this, you use the
|
||||||
:attr:`Widget.attrs` argument when creating the widget:
|
:attr:`Widget.attrs` argument when creating the widget:
|
||||||
|
|
||||||
For example:
|
For example::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
class CommentForm(forms.Form):
|
class CommentForm(forms.Form):
|
||||||
name = forms.CharField(
|
name = forms.CharField(
|
||||||
|
@ -155,8 +142,6 @@ For example:
|
||||||
|
|
||||||
Django will then include the extra attributes in the rendered output:
|
Django will then include the extra attributes in the rendered output:
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> f = CommentForm(auto_id=False)
|
>>> f = CommentForm(auto_id=False)
|
||||||
>>> f.as_table()
|
>>> f.as_table()
|
||||||
<tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr>
|
<tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr>
|
||||||
|
@ -411,9 +396,7 @@ commonly used groups of widgets:
|
||||||
:class:`MultiWidget`'s subclasses must implement. This method takes a
|
:class:`MultiWidget`'s subclasses must implement. This method takes a
|
||||||
single "compressed" value and returns a ``list``. An example of this is how
|
single "compressed" value and returns a ``list``. An example of this is how
|
||||||
:class:`SplitDateTimeWidget` turns a :class:`datetime` value into a list
|
:class:`SplitDateTimeWidget` turns a :class:`datetime` value into a list
|
||||||
with date and time split into two seperate values:
|
with date and time split into two seperate values::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
class SplitDateTimeWidget(MultiWidget):
|
class SplitDateTimeWidget(MultiWidget):
|
||||||
|
|
||||||
|
|
|
@ -48,16 +48,16 @@ which is a dictionary of the parameters captured in the URL.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``template``: The full name of a template to use.
|
* ``template``: The full name of a template to use.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
|
@ -92,17 +92,17 @@ If the given URL is ``None``, Django will return an ``HttpResponseGone`` (410).
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``url``: The URL to redirect to, as a string. Or ``None`` to raise a 410
|
* ``url``: The URL to redirect to, as a string. Or ``None`` to raise a 410
|
||||||
(Gone) HTTP error.
|
(Gone) HTTP error.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``permanent``: Whether the redirect should be permanent. The only
|
* ``permanent``: Whether the redirect should be permanent. The only
|
||||||
difference here is the HTTP status code returned. If ``True``, then the
|
difference here is the HTTP status code returned. If ``True``, then the
|
||||||
redirect will use status code 301. If ``False``, then the redirect will
|
redirect will use status code 301. If ``False``, then the redirect will
|
||||||
use status code 302. By default, ``permanent`` is ``True``.
|
use status code 302. By default, ``permanent`` is ``True``.
|
||||||
|
|
||||||
* ``query_string``: Whether to pass along the GET query string to
|
* ``query_string``: Whether to pass along the GET query string to
|
||||||
the new location. If ``True``, then the query string is appended
|
the new location. If ``True``, then the query string is appended
|
||||||
to the URL. If ``False``, then the query string is discarded. By
|
to the URL. If ``False``, then the query string is discarded. By
|
||||||
default, ``query_string`` is ``False``.
|
default, ``query_string`` is ``False``.
|
||||||
|
@ -167,45 +167,45 @@ a date in the *future* are not included unless you set ``allow_future`` to
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
||||||
|
|
||||||
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
||||||
the ``QuerySet``'s model that the date-based archive should use to
|
the ``QuerySet``'s model that the date-based archive should use to
|
||||||
determine the objects on the page.
|
determine the objects on the page.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``num_latest``: The number of latest objects to send to the template
|
* ``num_latest``: The number of latest objects to send to the template
|
||||||
context. By default, it's 15.
|
context. By default, it's 15.
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``allow_empty``: A boolean specifying whether to display the page if no
|
* ``allow_empty``: A boolean specifying whether to display the page if no
|
||||||
objects are available. If this is ``False`` and no objects are available,
|
objects are available. If this is ``False`` and no objects are available,
|
||||||
the view will raise a 404 instead of displaying an empty page. By
|
the view will raise a 404 instead of displaying an empty page. By
|
||||||
default, this is ``True``.
|
default, this is ``True``.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
* ``allow_future``: A boolean specifying whether to include "future"
|
* ``allow_future``: A boolean specifying whether to include "future"
|
||||||
objects on this page, where "future" means objects in which the field
|
objects on this page, where "future" means objects in which the field
|
||||||
specified in ``date_field`` is greater than the current date/time. By
|
specified in ``date_field`` is greater than the current date/time. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'latest'``.
|
to use in the template context. By default, this is ``'latest'``.
|
||||||
|
|
||||||
**Template name:**
|
**Template name:**
|
||||||
|
@ -213,10 +213,10 @@ a date in the *future* are not included unless you set ``allow_future`` to
|
||||||
If ``template_name`` isn't specified, this view will use the template
|
If ``template_name`` isn't specified, this view will use the template
|
||||||
``<app_label>/<model_name>_archive.html`` by default, where:
|
``<app_label>/<model_name>_archive.html`` by default, where:
|
||||||
|
|
||||||
* ``<model_name>`` is your model's name in all lowercase. For a model
|
* ``<model_name>`` is your model's name in all lowercase. For a model
|
||||||
``StaffMember``, that'd be ``staffmember``.
|
``StaffMember``, that'd be ``staffmember``.
|
||||||
|
|
||||||
* ``<app_label>`` is the right-most part of the full Python path to
|
* ``<app_label>`` is the right-most part of the full Python path to
|
||||||
your model's app. For example, if your model lives in
|
your model's app. For example, if your model lives in
|
||||||
``apps/blog/models.py``, that'd be ``blog``.
|
``apps/blog/models.py``, that'd be ``blog``.
|
||||||
|
|
||||||
|
@ -224,12 +224,12 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``date_list``: A ``DateQuerySet`` object containing all years that have
|
* ``date_list``: A ``DateQuerySet`` object containing all years that have
|
||||||
have objects available according to ``queryset``, represented as
|
have objects available according to ``queryset``, represented as
|
||||||
``datetime.datetime`` objects. These are ordered in reverse. This is
|
``datetime.datetime`` objects. These are ordered in reverse. This is
|
||||||
equivalent to ``queryset.dates(date_field, 'year')[::-1]``.
|
equivalent to ``queryset.dates(date_field, 'year')[::-1]``.
|
||||||
|
|
||||||
* ``latest``: The ``num_latest`` objects in the system, ordered descending
|
* ``latest``: The ``num_latest`` objects in the system, ordered descending
|
||||||
by ``date_field``. For example, if ``num_latest`` is ``10``, then
|
by ``date_field``. For example, if ``num_latest`` is ``10``, then
|
||||||
``latest`` will be a list of the latest 10 objects in ``queryset``.
|
``latest`` will be a list of the latest 10 objects in ``queryset``.
|
||||||
|
|
||||||
|
@ -248,51 +248,51 @@ to ``True``.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``year``: The four-digit year for which the archive serves.
|
* ``year``: The four-digit year for which the archive serves.
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
||||||
|
|
||||||
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
||||||
the ``QuerySet``'s model that the date-based archive should use to
|
the ``QuerySet``'s model that the date-based archive should use to
|
||||||
determine the objects on the page.
|
determine the objects on the page.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``allow_empty``: A boolean specifying whether to display the page if no
|
* ``allow_empty``: A boolean specifying whether to display the page if no
|
||||||
objects are available. If this is ``False`` and no objects are available,
|
objects are available. If this is ``False`` and no objects are available,
|
||||||
the view will raise a 404 instead of displaying an empty page. By
|
the view will raise a 404 instead of displaying an empty page. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``. The
|
to use in the template context. By default, this is ``'object'``. The
|
||||||
view will append ``'_list'`` to the value of this parameter in
|
view will append ``'_list'`` to the value of this parameter in
|
||||||
determining the variable's name.
|
determining the variable's name.
|
||||||
|
|
||||||
* ``make_object_list``: A boolean specifying whether to retrieve the full
|
* ``make_object_list``: A boolean specifying whether to retrieve the full
|
||||||
list of objects for this year and pass those to the template. If ``True``,
|
list of objects for this year and pass those to the template. If ``True``,
|
||||||
this list of objects will be made available to the template as
|
this list of objects will be made available to the template as
|
||||||
``object_list``. (The name ``object_list`` may be different; see the docs
|
``object_list``. (The name ``object_list`` may be different; see the docs
|
||||||
for ``object_list`` in the "Template context" section below.) By default,
|
for ``object_list`` in the "Template context" section below.) By default,
|
||||||
this is ``False``.
|
this is ``False``.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
* ``allow_future``: A boolean specifying whether to include "future"
|
* ``allow_future``: A boolean specifying whether to include "future"
|
||||||
objects on this page, where "future" means objects in which the field
|
objects on this page, where "future" means objects in which the field
|
||||||
specified in ``date_field`` is greater than the current date/time. By
|
specified in ``date_field`` is greater than the current date/time. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
@ -306,13 +306,13 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``date_list``: A ``DateQuerySet`` object containing all months that have
|
* ``date_list``: A ``DateQuerySet`` object containing all months that have
|
||||||
have objects available according to ``queryset``, represented as
|
have objects available according to ``queryset``, represented as
|
||||||
``datetime.datetime`` objects, in ascending order.
|
``datetime.datetime`` objects, in ascending order.
|
||||||
|
|
||||||
* ``year``: The given year, as a four-character string.
|
* ``year``: The given year, as a four-character string.
|
||||||
|
|
||||||
* ``object_list``: If the ``make_object_list`` parameter is ``True``, this
|
* ``object_list``: If the ``make_object_list`` parameter is ``True``, this
|
||||||
will be set to a list of objects available for the given year, ordered by
|
will be set to a list of objects available for the given year, ordered by
|
||||||
the date field. This variable's name depends on the
|
the date field. This variable's name depends on the
|
||||||
``template_object_name`` parameter, which is ``'object'`` by default. If
|
``template_object_name`` parameter, which is ``'object'`` by default. If
|
||||||
|
@ -333,53 +333,53 @@ date in the *future* are not displayed unless you set ``allow_future`` to
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``year``: The four-digit year for which the archive serves (a string).
|
* ``year``: The four-digit year for which the archive serves (a string).
|
||||||
|
|
||||||
* ``month``: The month for which the archive serves, formatted according to
|
* ``month``: The month for which the archive serves, formatted according to
|
||||||
the ``month_format`` argument.
|
the ``month_format`` argument.
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
||||||
|
|
||||||
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
||||||
the ``QuerySet``'s model that the date-based archive should use to
|
the ``QuerySet``'s model that the date-based archive should use to
|
||||||
determine the objects on the page.
|
determine the objects on the page.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``month_format``: A format string that regulates what format the ``month``
|
* ``month_format``: A format string that regulates what format the ``month``
|
||||||
parameter uses. This should be in the syntax accepted by Python's
|
parameter uses. This should be in the syntax accepted by Python's
|
||||||
:func:`~time.strftime`. It's set to ``"%b"`` by default, which is a
|
:func:`~time.strftime`. It's set to ``"%b"`` by default, which is a
|
||||||
three-letter month abbreviation. To change it to use numbers, use
|
three-letter month abbreviation. To change it to use numbers, use
|
||||||
``"%m"``.
|
``"%m"``.
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``allow_empty``: A boolean specifying whether to display the page if no
|
* ``allow_empty``: A boolean specifying whether to display the page if no
|
||||||
objects are available. If this is ``False`` and no objects are available,
|
objects are available. If this is ``False`` and no objects are available,
|
||||||
the view will raise a 404 instead of displaying an empty page. By
|
the view will raise a 404 instead of displaying an empty page. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``. The
|
to use in the template context. By default, this is ``'object'``. The
|
||||||
view will append ``'_list'`` to the value of this parameter in
|
view will append ``'_list'`` to the value of this parameter in
|
||||||
determining the variable's name.
|
determining the variable's name.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
* ``allow_future``: A boolean specifying whether to include "future"
|
* ``allow_future``: A boolean specifying whether to include "future"
|
||||||
objects on this page, where "future" means objects in which the field
|
objects on this page, where "future" means objects in which the field
|
||||||
specified in ``date_field`` is greater than the current date/time. By
|
specified in ``date_field`` is greater than the current date/time. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
@ -396,21 +396,21 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``date_list``: A ``DateQuerySet`` object containing all days that have
|
* ``date_list``: A ``DateQuerySet`` object containing all days that have
|
||||||
have objects available in the given month, according to ``queryset``,
|
have objects available in the given month, according to ``queryset``,
|
||||||
represented as ``datetime.datetime`` objects, in ascending order.
|
represented as ``datetime.datetime`` objects, in ascending order.
|
||||||
|
|
||||||
* ``month``: A ``datetime.date`` object representing the given month.
|
* ``month``: A ``datetime.date`` object representing the given month.
|
||||||
|
|
||||||
* ``next_month``: A ``datetime.date`` object representing the first day of
|
* ``next_month``: A ``datetime.date`` object representing the first day of
|
||||||
the next month. If the next month is in the future, this will be
|
the next month. If the next month is in the future, this will be
|
||||||
``None``.
|
``None``.
|
||||||
|
|
||||||
* ``previous_month``: A ``datetime.date`` object representing the first day
|
* ``previous_month``: A ``datetime.date`` object representing the first day
|
||||||
of the previous month. Unlike ``next_month``, this will never be
|
of the previous month. Unlike ``next_month``, this will never be
|
||||||
``None``.
|
``None``.
|
||||||
|
|
||||||
* ``object_list``: A list of objects available for the given month. This
|
* ``object_list``: A list of objects available for the given month. This
|
||||||
variable's name depends on the ``template_object_name`` parameter, which
|
variable's name depends on the ``template_object_name`` parameter, which
|
||||||
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
||||||
this variable's name will be ``foo_list``.
|
this variable's name will be ``foo_list``.
|
||||||
|
@ -425,47 +425,47 @@ in the *future* are not displayed unless you set ``allow_future`` to ``True``.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``year``: The four-digit year for which the archive serves (a string).
|
* ``year``: The four-digit year for which the archive serves (a string).
|
||||||
|
|
||||||
* ``week``: The week of the year for which the archive serves (a string).
|
* ``week``: The week of the year for which the archive serves (a string).
|
||||||
Weeks start with Sunday.
|
Weeks start with Sunday.
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
||||||
|
|
||||||
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
||||||
the ``QuerySet``'s model that the date-based archive should use to
|
the ``QuerySet``'s model that the date-based archive should use to
|
||||||
determine the objects on the page.
|
determine the objects on the page.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``allow_empty``: A boolean specifying whether to display the page if no
|
* ``allow_empty``: A boolean specifying whether to display the page if no
|
||||||
objects are available. If this is ``False`` and no objects are available,
|
objects are available. If this is ``False`` and no objects are available,
|
||||||
the view will raise a 404 instead of displaying an empty page. By
|
the view will raise a 404 instead of displaying an empty page. By
|
||||||
default, this is ``True``.
|
default, this is ``True``.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``. The
|
to use in the template context. By default, this is ``'object'``. The
|
||||||
view will append ``'_list'`` to the value of this parameter in
|
view will append ``'_list'`` to the value of this parameter in
|
||||||
determining the variable's name.
|
determining the variable's name.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
* ``allow_future``: A boolean specifying whether to include "future"
|
* ``allow_future``: A boolean specifying whether to include "future"
|
||||||
objects on this page, where "future" means objects in which the field
|
objects on this page, where "future" means objects in which the field
|
||||||
specified in ``date_field`` is greater than the current date/time. By
|
specified in ``date_field`` is greater than the current date/time. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
@ -479,10 +479,10 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``week``: A ``datetime.date`` object representing the first day of the
|
* ``week``: A ``datetime.date`` object representing the first day of the
|
||||||
given week.
|
given week.
|
||||||
|
|
||||||
* ``object_list``: A list of objects available for the given week. This
|
* ``object_list``: A list of objects available for the given week. This
|
||||||
variable's name depends on the ``template_object_name`` parameter, which
|
variable's name depends on the ``template_object_name`` parameter, which
|
||||||
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
||||||
this variable's name will be ``foo_list``.
|
this variable's name will be ``foo_list``.
|
||||||
|
@ -498,59 +498,59 @@ you set ``allow_future`` to ``True``.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``year``: The four-digit year for which the archive serves (a string).
|
* ``year``: The four-digit year for which the archive serves (a string).
|
||||||
|
|
||||||
* ``month``: The month for which the archive serves, formatted according to
|
* ``month``: The month for which the archive serves, formatted according to
|
||||||
the ``month_format`` argument.
|
the ``month_format`` argument.
|
||||||
|
|
||||||
* ``day``: The day for which the archive serves, formatted according to the
|
* ``day``: The day for which the archive serves, formatted according to the
|
||||||
``day_format`` argument.
|
``day_format`` argument.
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
* ``queryset``: A ``QuerySet`` of objects for which the archive serves.
|
||||||
|
|
||||||
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
||||||
the ``QuerySet``'s model that the date-based archive should use to
|
the ``QuerySet``'s model that the date-based archive should use to
|
||||||
determine the objects on the page.
|
determine the objects on the page.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``month_format``: A format string that regulates what format the ``month``
|
* ``month_format``: A format string that regulates what format the ``month``
|
||||||
parameter uses. This should be in the syntax accepted by Python's
|
parameter uses. This should be in the syntax accepted by Python's
|
||||||
:func:`~time.strftime`. It's set to ``"%b"`` by default, which is a
|
:func:`~time.strftime`. It's set to ``"%b"`` by default, which is a
|
||||||
three-letter month abbreviation. To change it to use numbers, use
|
three-letter month abbreviation. To change it to use numbers, use
|
||||||
``"%m"``.
|
``"%m"``.
|
||||||
|
|
||||||
* ``day_format``: Like ``month_format``, but for the ``day`` parameter.
|
* ``day_format``: Like ``month_format``, but for the ``day`` parameter.
|
||||||
It defaults to ``"%d"`` (day of the month as a decimal number, 01-31).
|
It defaults to ``"%d"`` (day of the month as a decimal number, 01-31).
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``allow_empty``: A boolean specifying whether to display the page if no
|
* ``allow_empty``: A boolean specifying whether to display the page if no
|
||||||
objects are available. If this is ``False`` and no objects are available,
|
objects are available. If this is ``False`` and no objects are available,
|
||||||
the view will raise a 404 instead of displaying an empty page. By
|
the view will raise a 404 instead of displaying an empty page. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``. The
|
to use in the template context. By default, this is ``'object'``. The
|
||||||
view will append ``'_list'`` to the value of this parameter in
|
view will append ``'_list'`` to the value of this parameter in
|
||||||
determining the variable's name.
|
determining the variable's name.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
* ``allow_future``: A boolean specifying whether to include "future"
|
* ``allow_future``: A boolean specifying whether to include "future"
|
||||||
objects on this page, where "future" means objects in which the field
|
objects on this page, where "future" means objects in which the field
|
||||||
specified in ``date_field`` is greater than the current date/time. By
|
specified in ``date_field`` is greater than the current date/time. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
@ -564,15 +564,15 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``day``: A ``datetime.date`` object representing the given day.
|
* ``day``: A ``datetime.date`` object representing the given day.
|
||||||
|
|
||||||
* ``next_day``: A ``datetime.date`` object representing the next day. If
|
* ``next_day``: A ``datetime.date`` object representing the next day. If
|
||||||
the next day is in the future, this will be ``None``.
|
the next day is in the future, this will be ``None``.
|
||||||
|
|
||||||
* ``previous_day``: A ``datetime.date`` object representing the previous day.
|
* ``previous_day``: A ``datetime.date`` object representing the previous day.
|
||||||
Unlike ``next_day``, this will never be ``None``.
|
Unlike ``next_day``, this will never be ``None``.
|
||||||
|
|
||||||
* ``object_list``: A list of objects available for the given day. This
|
* ``object_list``: A list of objects available for the given day. This
|
||||||
variable's name depends on the ``template_object_name`` parameter, which
|
variable's name depends on the ``template_object_name`` parameter, which
|
||||||
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
||||||
this variable's name will be ``foo_list``.
|
this variable's name will be ``foo_list``.
|
||||||
|
@ -597,21 +597,21 @@ future, the view will throw a 404 error by default, unless you set
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``year``: The object's four-digit year (a string).
|
* ``year``: The object's four-digit year (a string).
|
||||||
|
|
||||||
* ``month``: The object's month , formatted according to the
|
* ``month``: The object's month , formatted according to the
|
||||||
``month_format`` argument.
|
``month_format`` argument.
|
||||||
|
|
||||||
* ``day``: The object's day , formatted according to the ``day_format``
|
* ``day``: The object's day , formatted according to the ``day_format``
|
||||||
argument.
|
argument.
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` that contains the object.
|
* ``queryset``: A ``QuerySet`` that contains the object.
|
||||||
|
|
||||||
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
* ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
|
||||||
the ``QuerySet``'s model that the generic view should use to look up the
|
the ``QuerySet``'s model that the generic view should use to look up the
|
||||||
object according to ``year``, ``month`` and ``day``.
|
object according to ``year``, ``month`` and ``day``.
|
||||||
|
|
||||||
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
||||||
|
|
||||||
If you provide ``object_id``, it should be the value of the primary-key
|
If you provide ``object_id``, it should be the value of the primary-key
|
||||||
field for the object being displayed on this page.
|
field for the object being displayed on this page.
|
||||||
|
@ -622,19 +622,19 @@ future, the view will throw a 404 error by default, unless you set
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``month_format``: A format string that regulates what format the ``month``
|
* ``month_format``: A format string that regulates what format the ``month``
|
||||||
parameter uses. This should be in the syntax accepted by Python's
|
parameter uses. This should be in the syntax accepted by Python's
|
||||||
:func:`~time.strftime`. It's set to ``"%b"`` by default, which is a
|
:func:`~time.strftime`. It's set to ``"%b"`` by default, which is a
|
||||||
three-letter month abbreviation. To change it to use numbers, use
|
three-letter month abbreviation. To change it to use numbers, use
|
||||||
``"%m"``.
|
``"%m"``.
|
||||||
|
|
||||||
* ``day_format``: Like ``month_format``, but for the ``day`` parameter.
|
* ``day_format``: Like ``month_format``, but for the ``day`` parameter.
|
||||||
It defaults to ``"%d"`` (day of the month as a decimal number, 01-31).
|
It defaults to ``"%d"`` (day of the month as a decimal number, 01-31).
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_name_field``: The name of a field on the object whose value is
|
* ``template_name_field``: The name of a field on the object whose value is
|
||||||
the template name to use. This lets you store template names in the data.
|
the template name to use. This lets you store template names in the data.
|
||||||
In other words, if your object has a field ``'the_template'`` that
|
In other words, if your object has a field ``'the_template'`` that
|
||||||
contains a string ``'foo.html'``, and you set ``template_name_field`` to
|
contains a string ``'foo.html'``, and you set ``template_name_field`` to
|
||||||
|
@ -643,24 +643,24 @@ future, the view will throw a 404 error by default, unless you set
|
||||||
|
|
||||||
It's a bit of a brain-bender, but it's useful in some cases.
|
It's a bit of a brain-bender, but it's useful in some cases.
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``.
|
to use in the template context. By default, this is ``'object'``.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
* ``allow_future``: A boolean specifying whether to include "future"
|
* ``allow_future``: A boolean specifying whether to include "future"
|
||||||
objects on this page, where "future" means objects in which the field
|
objects on this page, where "future" means objects in which the field
|
||||||
specified in ``date_field`` is greater than the current date/time. By
|
specified in ``date_field`` is greater than the current date/time. By
|
||||||
default, this is ``False``.
|
default, this is ``False``.
|
||||||
|
@ -674,7 +674,7 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``object``: The object. This variable's name depends on the
|
* ``object``: The object. This variable's name depends on the
|
||||||
``template_object_name`` parameter, which is ``'object'`` by default. If
|
``template_object_name`` parameter, which is ``'object'`` by default. If
|
||||||
``template_object_name`` is ``'foo'``, this variable's name will be
|
``template_object_name`` is ``'foo'``, this variable's name will be
|
||||||
``foo``.
|
``foo``.
|
||||||
|
@ -698,44 +698,44 @@ A page representing a list of objects.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` that represents the objects.
|
* ``queryset``: A ``QuerySet`` that represents the objects.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``paginate_by``: An integer specifying how many objects should be
|
* ``paginate_by``: An integer specifying how many objects should be
|
||||||
displayed per page. If this is given, the view will paginate objects with
|
displayed per page. If this is given, the view will paginate objects with
|
||||||
``paginate_by`` objects per page. The view will expect either a ``page``
|
``paginate_by`` objects per page. The view will expect either a ``page``
|
||||||
query string parameter (via ``GET``) or a ``page`` variable specified in
|
query string parameter (via ``GET``) or a ``page`` variable specified in
|
||||||
the URLconf. See `Notes on pagination`_ below.
|
the URLconf. See `Notes on pagination`_ below.
|
||||||
|
|
||||||
* ``page``: The current page number, as an integer, or the string
|
* ``page``: The current page number, as an integer, or the string
|
||||||
``'last'``. This is 1-based. See `Notes on pagination`_ below.
|
``'last'``. This is 1-based. See `Notes on pagination`_ below.
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``allow_empty``: A boolean specifying whether to display the page if no
|
* ``allow_empty``: A boolean specifying whether to display the page if no
|
||||||
objects are available. If this is ``False`` and no objects are available,
|
objects are available. If this is ``False`` and no objects are available,
|
||||||
the view will raise a 404 instead of displaying an empty page. By
|
the view will raise a 404 instead of displaying an empty page. By
|
||||||
default, this is ``True``.
|
default, this is ``True``.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``. The
|
to use in the template context. By default, this is ``'object'``. The
|
||||||
view will append ``'_list'`` to the value of this parameter in
|
view will append ``'_list'`` to the value of this parameter in
|
||||||
determining the variable's name.
|
determining the variable's name.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
**Template name:**
|
**Template name:**
|
||||||
|
@ -747,20 +747,20 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``object_list``: The list of objects. This variable's name depends on the
|
* ``object_list``: The list of objects. This variable's name depends on the
|
||||||
``template_object_name`` parameter, which is ``'object'`` by default. If
|
``template_object_name`` parameter, which is ``'object'`` by default. If
|
||||||
``template_object_name`` is ``'foo'``, this variable's name will be
|
``template_object_name`` is ``'foo'``, this variable's name will be
|
||||||
``foo_list``.
|
``foo_list``.
|
||||||
|
|
||||||
* ``is_paginated``: A boolean representing whether the results are
|
* ``is_paginated``: A boolean representing whether the results are
|
||||||
paginated. Specifically, this is set to ``False`` if the number of
|
paginated. Specifically, this is set to ``False`` if the number of
|
||||||
available objects is less than or equal to ``paginate_by``.
|
available objects is less than or equal to ``paginate_by``.
|
||||||
|
|
||||||
If the results are paginated, the context will contain these extra variables:
|
If the results are paginated, the context will contain these extra variables:
|
||||||
|
|
||||||
* ``paginator``: An instance of ``django.core.paginator.Paginator``.
|
* ``paginator``: An instance of ``django.core.paginator.Paginator``.
|
||||||
|
|
||||||
* ``page_obj``: An instance of ``django.core.paginator.Page``.
|
* ``page_obj``: An instance of ``django.core.paginator.Page``.
|
||||||
|
|
||||||
Notes on pagination
|
Notes on pagination
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -768,17 +768,17 @@ Notes on pagination
|
||||||
If ``paginate_by`` is specified, Django will paginate the results. You can
|
If ``paginate_by`` is specified, Django will paginate the results. You can
|
||||||
specify the page number in the URL in one of two ways:
|
specify the page number in the URL in one of two ways:
|
||||||
|
|
||||||
* Use the ``page`` parameter in the URLconf. For example, this is what
|
* Use the ``page`` parameter in the URLconf. For example, this is what
|
||||||
your URLconf might look like::
|
your URLconf might look like::
|
||||||
|
|
||||||
(r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict))
|
(r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict))
|
||||||
|
|
||||||
* Pass the page number via the ``page`` query-string parameter. For
|
* Pass the page number via the ``page`` query-string parameter. For
|
||||||
example, a URL would look like this::
|
example, a URL would look like this::
|
||||||
|
|
||||||
/objects/?page=3
|
/objects/?page=3
|
||||||
|
|
||||||
* To loop over all the available page numbers, use the ``page_range``
|
* To loop over all the available page numbers, use the ``page_range``
|
||||||
variable. You can iterate over the list provided by ``page_range``
|
variable. You can iterate over the list provided by ``page_range``
|
||||||
to create a link to every page of results.
|
to create a link to every page of results.
|
||||||
|
|
||||||
|
@ -810,9 +810,9 @@ A page representing an individual object.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``queryset``: A ``QuerySet`` that contains the object.
|
* ``queryset``: A ``QuerySet`` that contains the object.
|
||||||
|
|
||||||
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
||||||
|
|
||||||
If you provide ``object_id``, it should be the value of the primary-key
|
If you provide ``object_id``, it should be the value of the primary-key
|
||||||
field for the object being displayed on this page.
|
field for the object being displayed on this page.
|
||||||
|
@ -823,10 +823,10 @@ A page representing an individual object.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_name_field``: The name of a field on the object whose value is
|
* ``template_name_field``: The name of a field on the object whose value is
|
||||||
the template name to use. This lets you store template names in the data.
|
the template name to use. This lets you store template names in the data.
|
||||||
In other words, if your object has a field ``'the_template'`` that
|
In other words, if your object has a field ``'the_template'`` that
|
||||||
contains a string ``'foo.html'``, and you set ``template_name_field`` to
|
contains a string ``'foo.html'``, and you set ``template_name_field`` to
|
||||||
|
@ -835,21 +835,21 @@ A page representing an individual object.
|
||||||
|
|
||||||
It's a bit of a brain-bender, but it's useful in some cases.
|
It's a bit of a brain-bender, but it's useful in some cases.
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``.
|
to use in the template context. By default, this is ``'object'``.
|
||||||
|
|
||||||
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
* ``mimetype``: The MIME type to use for the resulting document. Defaults
|
||||||
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
to the value of the :setting:`DEFAULT_CONTENT_TYPE` setting.
|
||||||
|
|
||||||
**Template name:**
|
**Template name:**
|
||||||
|
@ -861,7 +861,7 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``object``: The object. This variable's name depends on the
|
* ``object``: The object. This variable's name depends on the
|
||||||
``template_object_name`` parameter, which is ``'object'`` by default. If
|
``template_object_name`` parameter, which is ``'object'`` by default. If
|
||||||
``template_object_name`` is ``'foo'``, this variable's name will be
|
``template_object_name`` is ``'foo'``, this variable's name will be
|
||||||
``foo``.
|
``foo``.
|
||||||
|
@ -884,7 +884,7 @@ validation errors (if there are any) and saving the object.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* Either ``form_class`` or ``model`` is required.
|
* Either ``form_class`` or ``model`` is required.
|
||||||
|
|
||||||
If you provide ``form_class``, it should be a ``django.forms.ModelForm``
|
If you provide ``form_class``, it should be a ``django.forms.ModelForm``
|
||||||
subclass. Use this argument when you need to customize the model's form.
|
subclass. Use this argument when you need to customize the model's form.
|
||||||
|
@ -896,14 +896,14 @@ validation errors (if there are any) and saving the object.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``post_save_redirect``: A URL to which the view will redirect after
|
* ``post_save_redirect``: A URL to which the view will redirect after
|
||||||
saving the object. By default, it's ``object.get_absolute_url()``.
|
saving the object. By default, it's ``object.get_absolute_url()``.
|
||||||
|
|
||||||
``post_save_redirect`` may contain dictionary string formatting, which
|
``post_save_redirect`` may contain dictionary string formatting, which
|
||||||
will be interpolated against the object's field attributes. For example,
|
will be interpolated against the object's field attributes. For example,
|
||||||
you could use ``post_save_redirect="/polls/%(slug)s/"``.
|
you could use ``post_save_redirect="/polls/%(slug)s/"``.
|
||||||
|
|
||||||
* ``login_required``: A boolean that designates whether a user must be
|
* ``login_required``: A boolean that designates whether a user must be
|
||||||
logged in, in order to see the page and save changes. This hooks into the
|
logged in, in order to see the page and save changes. This hooks into the
|
||||||
Django :doc:`authentication system </topics/auth>`. By default, this is
|
Django :doc:`authentication system </topics/auth>`. By default, this is
|
||||||
``False``.
|
``False``.
|
||||||
|
@ -911,18 +911,18 @@ validation errors (if there are any) and saving the object.
|
||||||
If this is ``True``, and a non-logged-in user attempts to visit this page
|
If this is ``True``, and a non-logged-in user attempts to visit this page
|
||||||
or save the form, Django will redirect the request to ``/accounts/login/``.
|
or save the form, Django will redirect the request to ``/accounts/login/``.
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
**Template name:**
|
**Template name:**
|
||||||
|
@ -934,7 +934,7 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``form``: A ``django.forms.ModelForm`` instance representing the form
|
* ``form``: A ``django.forms.ModelForm`` instance representing the form
|
||||||
for creating the object. This lets you refer to form fields easily in the
|
for creating the object. This lets you refer to form fields easily in the
|
||||||
template system.
|
template system.
|
||||||
|
|
||||||
|
@ -960,7 +960,7 @@ model class.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* Either ``form_class`` or ``model`` is required.
|
* Either ``form_class`` or ``model`` is required.
|
||||||
|
|
||||||
If you provide ``form_class``, it should be a ``django.forms.ModelForm``
|
If you provide ``form_class``, it should be a ``django.forms.ModelForm``
|
||||||
subclass. Use this argument when you need to customize the model's form.
|
subclass. Use this argument when you need to customize the model's form.
|
||||||
|
@ -970,7 +970,7 @@ model class.
|
||||||
Otherwise, ``model`` should be a Django model class and the form used
|
Otherwise, ``model`` should be a Django model class and the form used
|
||||||
will be a standard ``ModelForm`` for ``model``.
|
will be a standard ``ModelForm`` for ``model``.
|
||||||
|
|
||||||
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
||||||
|
|
||||||
If you provide ``object_id``, it should be the value of the primary-key
|
If you provide ``object_id``, it should be the value of the primary-key
|
||||||
field for the object being displayed on this page.
|
field for the object being displayed on this page.
|
||||||
|
@ -981,14 +981,14 @@ model class.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``post_save_redirect``: A URL to which the view will redirect after
|
* ``post_save_redirect``: A URL to which the view will redirect after
|
||||||
saving the object. By default, it's ``object.get_absolute_url()``.
|
saving the object. By default, it's ``object.get_absolute_url()``.
|
||||||
|
|
||||||
``post_save_redirect`` may contain dictionary string formatting, which
|
``post_save_redirect`` may contain dictionary string formatting, which
|
||||||
will be interpolated against the object's field attributes. For example,
|
will be interpolated against the object's field attributes. For example,
|
||||||
you could use ``post_save_redirect="/polls/%(slug)s/"``.
|
you could use ``post_save_redirect="/polls/%(slug)s/"``.
|
||||||
|
|
||||||
* ``login_required``: A boolean that designates whether a user must be
|
* ``login_required``: A boolean that designates whether a user must be
|
||||||
logged in, in order to see the page and save changes. This hooks into the
|
logged in, in order to see the page and save changes. This hooks into the
|
||||||
Django :doc:`authentication system </topics/auth>`. By default, this is
|
Django :doc:`authentication system </topics/auth>`. By default, this is
|
||||||
``False``.
|
``False``.
|
||||||
|
@ -997,21 +997,21 @@ model class.
|
||||||
or save the form, Django will redirect to :setting:`LOGIN_URL` (which
|
or save the form, Django will redirect to :setting:`LOGIN_URL` (which
|
||||||
defaults to ``/accounts/login/``).
|
defaults to ``/accounts/login/``).
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``.
|
to use in the template context. By default, this is ``'object'``.
|
||||||
|
|
||||||
**Template name:**
|
**Template name:**
|
||||||
|
@ -1023,7 +1023,7 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``form``: A ``django.forms.ModelForm`` instance representing the form
|
* ``form``: A ``django.forms.ModelForm`` instance representing the form
|
||||||
for editing the object. This lets you refer to form fields easily in the
|
for editing the object. This lets you refer to form fields easily in the
|
||||||
template system.
|
template system.
|
||||||
|
|
||||||
|
@ -1037,7 +1037,7 @@ In addition to ``extra_context``, the template's context will be:
|
||||||
See the :doc:`forms documentation </topics/forms/index>` for more
|
See the :doc:`forms documentation </topics/forms/index>` for more
|
||||||
information about using ``Form`` objects in templates.
|
information about using ``Form`` objects in templates.
|
||||||
|
|
||||||
* ``object``: The original object being edited. This variable's name
|
* ``object``: The original object being edited. This variable's name
|
||||||
depends on the ``template_object_name`` parameter, which is ``'object'``
|
depends on the ``template_object_name`` parameter, which is ``'object'``
|
||||||
by default. If ``template_object_name`` is ``'foo'``, this variable's
|
by default. If ``template_object_name`` is ``'foo'``, this variable's
|
||||||
name will be ``foo``.
|
name will be ``foo``.
|
||||||
|
@ -1054,10 +1054,10 @@ contain a form that POSTs to the same URL.
|
||||||
|
|
||||||
**Required arguments:**
|
**Required arguments:**
|
||||||
|
|
||||||
* ``model``: The Django model class of the object that the form will
|
* ``model``: The Django model class of the object that the form will
|
||||||
delete.
|
delete.
|
||||||
|
|
||||||
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
* Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
|
||||||
|
|
||||||
If you provide ``object_id``, it should be the value of the primary-key
|
If you provide ``object_id``, it should be the value of the primary-key
|
||||||
field for the object being displayed on this page.
|
field for the object being displayed on this page.
|
||||||
|
@ -1066,12 +1066,12 @@ contain a form that POSTs to the same URL.
|
||||||
``slug_field`` should be the name of the slug field in the ``QuerySet``'s
|
``slug_field`` should be the name of the slug field in the ``QuerySet``'s
|
||||||
model. By default, ``slug_field`` is ``'slug'``.
|
model. By default, ``slug_field`` is ``'slug'``.
|
||||||
|
|
||||||
* ``post_delete_redirect``: A URL to which the view will redirect after
|
* ``post_delete_redirect``: A URL to which the view will redirect after
|
||||||
deleting the object.
|
deleting the object.
|
||||||
|
|
||||||
**Optional arguments:**
|
**Optional arguments:**
|
||||||
|
|
||||||
* ``login_required``: A boolean that designates whether a user must be
|
* ``login_required``: A boolean that designates whether a user must be
|
||||||
logged in, in order to see the page and save changes. This hooks into the
|
logged in, in order to see the page and save changes. This hooks into the
|
||||||
Django :doc:`authentication system </topics/auth>`. By default, this is
|
Django :doc:`authentication system </topics/auth>`. By default, this is
|
||||||
``False``.
|
``False``.
|
||||||
|
@ -1080,21 +1080,21 @@ contain a form that POSTs to the same URL.
|
||||||
or save the form, Django will redirect to :setting:`LOGIN_URL` (which
|
or save the form, Django will redirect to :setting:`LOGIN_URL` (which
|
||||||
defaults to ``/accounts/login/``).
|
defaults to ``/accounts/login/``).
|
||||||
|
|
||||||
* ``template_name``: The full name of a template to use in rendering the
|
* ``template_name``: The full name of a template to use in rendering the
|
||||||
page. This lets you override the default template name (see below).
|
page. This lets you override the default template name (see below).
|
||||||
|
|
||||||
* ``template_loader``: The template loader to use when loading the
|
* ``template_loader``: The template loader to use when loading the
|
||||||
template. By default, it's ``django.template.loader``.
|
template. By default, it's ``django.template.loader``.
|
||||||
|
|
||||||
* ``extra_context``: A dictionary of values to add to the template
|
* ``extra_context``: A dictionary of values to add to the template
|
||||||
context. By default, this is an empty dictionary. If a value in the
|
context. By default, this is an empty dictionary. If a value in the
|
||||||
dictionary is callable, the generic view will call it
|
dictionary is callable, the generic view will call it
|
||||||
just before rendering the template.
|
just before rendering the template.
|
||||||
|
|
||||||
* ``context_processors``: A list of template-context processors to apply to
|
* ``context_processors``: A list of template-context processors to apply to
|
||||||
the view's template.
|
the view's template.
|
||||||
|
|
||||||
* ``template_object_name``: Designates the name of the template variable
|
* ``template_object_name``: Designates the name of the template variable
|
||||||
to use in the template context. By default, this is ``'object'``.
|
to use in the template context. By default, this is ``'object'``.
|
||||||
|
|
||||||
**Template name:**
|
**Template name:**
|
||||||
|
@ -1106,7 +1106,7 @@ If ``template_name`` isn't specified, this view will use the template
|
||||||
|
|
||||||
In addition to ``extra_context``, the template's context will be:
|
In addition to ``extra_context``, the template's context will be:
|
||||||
|
|
||||||
* ``object``: The original object that's about to be deleted. This
|
* ``object``: The original object that's about to be deleted. This
|
||||||
variable's name depends on the ``template_object_name`` parameter, which
|
variable's name depends on the ``template_object_name`` parameter, which
|
||||||
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
|
||||||
this variable's name will be ``foo``.
|
this variable's name will be ``foo``.
|
||||||
|
|
|
@ -36,10 +36,10 @@ defines. See the :doc:`cache documentation </topics/cache>`.
|
||||||
|
|
||||||
Adds a few conveniences for perfectionists:
|
Adds a few conveniences for perfectionists:
|
||||||
|
|
||||||
* Forbids access to user agents in the :setting:`DISALLOWED_USER_AGENTS`
|
* Forbids access to user agents in the :setting:`DISALLOWED_USER_AGENTS`
|
||||||
setting, which should be a list of strings.
|
setting, which should be a list of strings.
|
||||||
|
|
||||||
* Performs URL rewriting based on the :setting:`APPEND_SLASH` and
|
* Performs URL rewriting based on the :setting:`APPEND_SLASH` and
|
||||||
:setting:`PREPEND_WWW` settings.
|
:setting:`PREPEND_WWW` settings.
|
||||||
|
|
||||||
If :setting:`APPEND_SLASH` is ``True`` and the initial URL doesn't end
|
If :setting:`APPEND_SLASH` is ``True`` and the initial URL doesn't end
|
||||||
|
@ -61,10 +61,10 @@ Adds a few conveniences for perfectionists:
|
||||||
indexer would treat them as separate URLs -- so it's best practice to
|
indexer would treat them as separate URLs -- so it's best practice to
|
||||||
normalize URLs.
|
normalize URLs.
|
||||||
|
|
||||||
* Sends broken link notification emails to :setting:`MANAGERS` if
|
* Sends broken link notification emails to :setting:`MANAGERS` if
|
||||||
:setting:`SEND_BROKEN_LINK_EMAILS` is set to ``True``.
|
:setting:`SEND_BROKEN_LINK_EMAILS` is set to ``True``.
|
||||||
|
|
||||||
* Handles ETags based on the :setting:`USE_ETAGS` setting. If
|
* Handles ETags based on the :setting:`USE_ETAGS` setting. If
|
||||||
:setting:`USE_ETAGS` is set to ``True``, Django will calculate an ETag
|
:setting:`USE_ETAGS` is set to ``True``, Django will calculate an ETag
|
||||||
for each request by MD5-hashing the page content, and it'll take care of
|
for each request by MD5-hashing the page content, and it'll take care of
|
||||||
sending ``Not Modified`` responses, if appropriate.
|
sending ``Not Modified`` responses, if appropriate.
|
||||||
|
|
|
@ -541,17 +541,17 @@ widget).
|
||||||
Using a :class:`FileField` or an :class:`ImageField` (see below) in a model
|
Using a :class:`FileField` or an :class:`ImageField` (see below) in a model
|
||||||
takes a few steps:
|
takes a few steps:
|
||||||
|
|
||||||
1. In your settings file, you'll need to define :setting:`MEDIA_ROOT` as the
|
1. In your settings file, you'll need to define :setting:`MEDIA_ROOT` as the
|
||||||
full path to a directory where you'd like Django to store uploaded files.
|
full path to a directory where you'd like Django to store uploaded files.
|
||||||
(For performance, these files are not stored in the database.) Define
|
(For performance, these files are not stored in the database.) Define
|
||||||
:setting:`MEDIA_URL` as the base public URL of that directory. Make sure
|
:setting:`MEDIA_URL` as the base public URL of that directory. Make sure
|
||||||
that this directory is writable by the Web server's user account.
|
that this directory is writable by the Web server's user account.
|
||||||
|
|
||||||
2. Add the :class:`FileField` or :class:`ImageField` to your model, making
|
2. Add the :class:`FileField` or :class:`ImageField` to your model, making
|
||||||
sure to define the :attr:`~FileField.upload_to` option to tell Django
|
sure to define the :attr:`~FileField.upload_to` option to tell Django
|
||||||
to which subdirectory of :setting:`MEDIA_ROOT` it should upload files.
|
to which subdirectory of :setting:`MEDIA_ROOT` it should upload files.
|
||||||
|
|
||||||
3. All that will be stored in your database is a path to the file
|
3. All that will be stored in your database is a path to the file
|
||||||
(relative to :setting:`MEDIA_ROOT`). You'll most likely want to use the
|
(relative to :setting:`MEDIA_ROOT`). You'll most likely want to use the
|
||||||
convenience :attr:`~django.core.files.File.url` function provided by
|
convenience :attr:`~django.core.files.File.url` function provided by
|
||||||
Django. For example, if your :class:`ImageField` is called ``mug_shot``,
|
Django. For example, if your :class:`ImageField` is called ``mug_shot``,
|
||||||
|
|
|
@ -34,9 +34,9 @@ Validating objects
|
||||||
|
|
||||||
There are three steps involved in validating a model:
|
There are three steps involved in validating a model:
|
||||||
|
|
||||||
1. Validate the model fields
|
1. Validate the model fields
|
||||||
2. Validate the model as a whole
|
2. Validate the model as a whole
|
||||||
3. Validate the field uniqueness
|
3. Validate the field uniqueness
|
||||||
|
|
||||||
All three steps are performed when you call a model's
|
All three steps are performed when you call a model's
|
||||||
:meth:`~Model.full_clean()` method.
|
:meth:`~Model.full_clean()` method.
|
||||||
|
@ -211,12 +211,12 @@ What happens when you save?
|
||||||
|
|
||||||
When you save an object, Django performs the following steps:
|
When you save an object, Django performs the following steps:
|
||||||
|
|
||||||
1. **Emit a pre-save signal.** The :doc:`signal </ref/signals>`
|
1. **Emit a pre-save signal.** The :doc:`signal </ref/signals>`
|
||||||
:attr:`django.db.models.signals.pre_save` is sent, allowing any
|
:attr:`django.db.models.signals.pre_save` is sent, allowing any
|
||||||
functions listening for that signal to take some customized
|
functions listening for that signal to take some customized
|
||||||
action.
|
action.
|
||||||
|
|
||||||
2. **Pre-process the data.** Each field on the object is asked to
|
2. **Pre-process the data.** Each field on the object is asked to
|
||||||
perform any automated data modification that the field may need
|
perform any automated data modification that the field may need
|
||||||
to perform.
|
to perform.
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ When you save an object, Django performs the following steps:
|
||||||
documentation doesn't yet include a list of all the fields with this
|
documentation doesn't yet include a list of all the fields with this
|
||||||
"special behavior.")
|
"special behavior.")
|
||||||
|
|
||||||
3. **Prepare the data for the database.** Each field is asked to provide
|
3. **Prepare the data for the database.** Each field is asked to provide
|
||||||
its current value in a data type that can be written to the database.
|
its current value in a data type that can be written to the database.
|
||||||
|
|
||||||
Most fields require *no* data preparation. Simple data types, such as
|
Most fields require *no* data preparation. Simple data types, such as
|
||||||
|
@ -240,11 +240,11 @@ When you save an object, Django performs the following steps:
|
||||||
objects, so the field value must be converted into an ISO-compliant date
|
objects, so the field value must be converted into an ISO-compliant date
|
||||||
string for insertion into the database.
|
string for insertion into the database.
|
||||||
|
|
||||||
4. **Insert the data into the database.** The pre-processed, prepared
|
4. **Insert the data into the database.** The pre-processed, prepared
|
||||||
data is then composed into an SQL statement for insertion into the
|
data is then composed into an SQL statement for insertion into the
|
||||||
database.
|
database.
|
||||||
|
|
||||||
5. **Emit a post-save signal.** The signal
|
5. **Emit a post-save signal.** The signal
|
||||||
:attr:`django.db.models.signals.post_save` is sent, allowing
|
:attr:`django.db.models.signals.post_save` is sent, allowing
|
||||||
any functions listening for that signal to take some customized
|
any functions listening for that signal to take some customized
|
||||||
action.
|
action.
|
||||||
|
@ -257,13 +257,13 @@ for creating and changing objects. Django abstracts the need to use ``INSERT``
|
||||||
or ``UPDATE`` SQL statements. Specifically, when you call ``save()``, Django
|
or ``UPDATE`` SQL statements. Specifically, when you call ``save()``, Django
|
||||||
follows this algorithm:
|
follows this algorithm:
|
||||||
|
|
||||||
* If the object's primary key attribute is set to a value that evaluates to
|
* If the object's primary key attribute is set to a value that evaluates to
|
||||||
``True`` (i.e., a value other than ``None`` or the empty string), Django
|
``True`` (i.e., a value other than ``None`` or the empty string), Django
|
||||||
executes a ``SELECT`` query to determine whether a record with the given
|
executes a ``SELECT`` query to determine whether a record with the given
|
||||||
primary key already exists.
|
primary key already exists.
|
||||||
* If the record with the given primary key does already exist, Django
|
* If the record with the given primary key does already exist, Django
|
||||||
executes an ``UPDATE`` query.
|
executes an ``UPDATE`` query.
|
||||||
* If the object's primary key attribute is *not* set, or if it's set but a
|
* If the object's primary key attribute is *not* set, or if it's set but a
|
||||||
record doesn't exist, Django executes an ``INSERT``.
|
record doesn't exist, Django executes an ``INSERT``.
|
||||||
|
|
||||||
The one gotcha here is that you should be careful not to specify a primary-key
|
The one gotcha here is that you should be careful not to specify a primary-key
|
||||||
|
|
|
@ -549,8 +549,8 @@ Passing iterators
|
||||||
Finally, you can pass ``HttpResponse`` an iterator rather than passing it
|
Finally, you can pass ``HttpResponse`` an iterator rather than passing it
|
||||||
hard-coded strings. If you use this technique, follow these guidelines:
|
hard-coded strings. If you use this technique, follow these guidelines:
|
||||||
|
|
||||||
* The iterator should return strings.
|
* The iterator should return strings.
|
||||||
* If an :class:`HttpResponse` has been initialized with an iterator as its
|
* If an :class:`HttpResponse` has been initialized with an iterator as its
|
||||||
content, you can't use the :class:`HttpResponse` instance as a file-like
|
content, you can't use the :class:`HttpResponse` instance as a file-like
|
||||||
object. Doing so will raise ``Exception``.
|
object. Doing so will raise ``Exception``.
|
||||||
|
|
||||||
|
|
|
@ -147,12 +147,12 @@ Default: ``''`` (Empty string)
|
||||||
|
|
||||||
The cache backend to use. The built-in cache backends are:
|
The cache backend to use. The built-in cache backends are:
|
||||||
|
|
||||||
* ``'django.core.cache.backends.db.DatabaseCache'``
|
* ``'django.core.cache.backends.db.DatabaseCache'``
|
||||||
* ``'django.core.cache.backends.dummy.DummyCache'``
|
* ``'django.core.cache.backends.dummy.DummyCache'``
|
||||||
* ``'django.core.cache.backends.filebased.FileBasedCache'``
|
* ``'django.core.cache.backends.filebased.FileBasedCache'``
|
||||||
* ``'django.core.cache.backends.locmem.LocMemCache'``
|
* ``'django.core.cache.backends.locmem.LocMemCache'``
|
||||||
* ``'django.core.cache.backends.memcached.MemcachedCache'``
|
* ``'django.core.cache.backends.memcached.MemcachedCache'``
|
||||||
* ``'django.core.cache.backends.memcached.PyLibMCCache'``
|
* ``'django.core.cache.backends.memcached.PyLibMCCache'``
|
||||||
|
|
||||||
You can use a cache backend that doesn't ship with Django by setting
|
You can use a cache backend that doesn't ship with Django by setting
|
||||||
:setting:`BACKEND <CACHE-BACKEND>` to a fully-qualified path of a cache
|
:setting:`BACKEND <CACHE-BACKEND>` to a fully-qualified path of a cache
|
||||||
|
@ -412,10 +412,10 @@ Default: ``''`` (Empty string)
|
||||||
|
|
||||||
The database backend to use. The built-in database backends are:
|
The database backend to use. The built-in database backends are:
|
||||||
|
|
||||||
* ``'django.db.backends.postgresql_psycopg2'``
|
* ``'django.db.backends.postgresql_psycopg2'``
|
||||||
* ``'django.db.backends.mysql'``
|
* ``'django.db.backends.mysql'``
|
||||||
* ``'django.db.backends.sqlite3'``
|
* ``'django.db.backends.sqlite3'``
|
||||||
* ``'django.db.backends.oracle'``
|
* ``'django.db.backends.oracle'``
|
||||||
|
|
||||||
You can use a database backend that doesn't ship with Django by setting
|
You can use a database backend that doesn't ship with Django by setting
|
||||||
``ENGINE`` to a fully-qualified path (i.e.
|
``ENGINE`` to a fully-qualified path (i.e.
|
||||||
|
@ -1165,8 +1165,8 @@ Default: ``()`` (Empty tuple)
|
||||||
|
|
||||||
A tuple of IP addresses, as strings, that:
|
A tuple of IP addresses, as strings, that:
|
||||||
|
|
||||||
* See debug comments, when :setting:`DEBUG` is ``True``
|
* See debug comments, when :setting:`DEBUG` is ``True``
|
||||||
* Receive X headers if the ``XViewMiddleware`` is installed (see
|
* Receive X headers if the ``XViewMiddleware`` is installed (see
|
||||||
:doc:`/topics/http/middleware`)
|
:doc:`/topics/http/middleware`)
|
||||||
|
|
||||||
.. setting:: LANGUAGE_CODE
|
.. setting:: LANGUAGE_CODE
|
||||||
|
@ -1649,10 +1649,10 @@ Default: ``django.contrib.sessions.backends.db``
|
||||||
|
|
||||||
Controls where Django stores session data. Valid values are:
|
Controls where Django stores session data. Valid values are:
|
||||||
|
|
||||||
* ``'django.contrib.sessions.backends.db'``
|
* ``'django.contrib.sessions.backends.db'``
|
||||||
* ``'django.contrib.sessions.backends.file'``
|
* ``'django.contrib.sessions.backends.file'``
|
||||||
* ``'django.contrib.sessions.backends.cache'``
|
* ``'django.contrib.sessions.backends.cache'``
|
||||||
* ``'django.contrib.sessions.backends.cached_db'``
|
* ``'django.contrib.sessions.backends.cached_db'``
|
||||||
|
|
||||||
See :doc:`/topics/http/sessions`.
|
See :doc:`/topics/http/sessions`.
|
||||||
|
|
||||||
|
@ -1989,11 +1989,11 @@ and models will automatically operate in the correct time zone.
|
||||||
However, Django won't set the ``TZ`` environment variable under the
|
However, Django won't set the ``TZ`` environment variable under the
|
||||||
following conditions:
|
following conditions:
|
||||||
|
|
||||||
* If you're using the manual configuration option as described in
|
* If you're using the manual configuration option as described in
|
||||||
:ref:`manually configuring settings
|
:ref:`manually configuring settings
|
||||||
<settings-without-django-settings-module>`, or
|
<settings-without-django-settings-module>`, or
|
||||||
|
|
||||||
* If you specify ``TIME_ZONE = None``. This will cause Django to fall
|
* If you specify ``TIME_ZONE = None``. This will cause Django to fall
|
||||||
back to using the system timezone.
|
back to using the system timezone.
|
||||||
|
|
||||||
If Django doesn't set the ``TZ`` environment variable, it's up to you
|
If Django doesn't set the ``TZ`` environment variable, it's up to you
|
||||||
|
|
|
@ -62,24 +62,22 @@ Arguments sent with this signal:
|
||||||
A dictionary of keyword arguments passed to
|
A dictionary of keyword arguments passed to
|
||||||
:meth:`~django.db.models.Model.__init__`:.
|
:meth:`~django.db.models.Model.__init__`:.
|
||||||
|
|
||||||
For example, the :doc:`tutorial </intro/tutorial01>` has this line:
|
For example, the :doc:`tutorial </intro/tutorial01>` has this line::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
p = Poll(question="What's up?", pub_date=datetime.now())
|
p = Poll(question="What's up?", pub_date=datetime.now())
|
||||||
|
|
||||||
The arguments sent to a :data:`pre_init` handler would be:
|
The arguments sent to a :data:`pre_init` handler would be:
|
||||||
|
|
||||||
========== ===============================================================
|
========== ===============================================================
|
||||||
Argument Value
|
Argument Value
|
||||||
========== ===============================================================
|
========== ===============================================================
|
||||||
``sender`` ``Poll`` (the class itself)
|
``sender`` ``Poll`` (the class itself)
|
||||||
|
|
||||||
``args`` ``[]`` (an empty list because there were no positional
|
``args`` ``[]`` (an empty list because there were no positional
|
||||||
arguments passed to ``__init__``.)
|
arguments passed to ``__init__``.)
|
||||||
|
|
||||||
``kwargs`` ``{'question': "What's up?", 'pub_date': datetime.now()}``
|
``kwargs`` ``{'question': "What's up?", 'pub_date': datetime.now()}``
|
||||||
========== ===============================================================
|
========== ===============================================================
|
||||||
|
|
||||||
post_init
|
post_init
|
||||||
---------
|
---------
|
||||||
|
@ -269,12 +267,11 @@ Arguments sent with this signal:
|
||||||
The database alias being used.
|
The database alias being used.
|
||||||
|
|
||||||
For example, if a ``Pizza`` can have multiple ``Topping`` objects, modeled
|
For example, if a ``Pizza`` can have multiple ``Topping`` objects, modeled
|
||||||
like this:
|
like this::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
class Topping(models.Model):
|
class Topping(models.Model):
|
||||||
# ...
|
# ...
|
||||||
|
pass
|
||||||
|
|
||||||
class Pizza(models.Model):
|
class Pizza(models.Model):
|
||||||
# ...
|
# ...
|
||||||
|
@ -282,62 +279,58 @@ like this:
|
||||||
|
|
||||||
If we would do something like this:
|
If we would do something like this:
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> p = Pizza.object.create(...)
|
>>> p = Pizza.object.create(...)
|
||||||
>>> t = Topping.objects.create(...)
|
>>> t = Topping.objects.create(...)
|
||||||
>>> p.toppings.add(t)
|
>>> p.toppings.add(t)
|
||||||
|
|
||||||
the arguments sent to a :data:`m2m_changed` handler would be:
|
the arguments sent to a :data:`m2m_changed` handler would be:
|
||||||
|
|
||||||
============== ============================================================
|
============== ============================================================
|
||||||
Argument Value
|
Argument Value
|
||||||
============== ============================================================
|
============== ============================================================
|
||||||
``sender`` ``Pizza.toppings.through`` (the intermediate m2m class)
|
``sender`` ``Pizza.toppings.through`` (the intermediate m2m class)
|
||||||
|
|
||||||
``instance`` ``p`` (the ``Pizza`` instance being modified)
|
``instance`` ``p`` (the ``Pizza`` instance being modified)
|
||||||
|
|
||||||
``action`` ``"pre_add"`` (followed by a separate signal with ``"post_add"``)
|
``action`` ``"pre_add"`` (followed by a separate signal with ``"post_add"``)
|
||||||
|
|
||||||
``reverse`` ``False`` (``Pizza`` contains the :class:`ManyToManyField`,
|
``reverse`` ``False`` (``Pizza`` contains the :class:`ManyToManyField`,
|
||||||
so this call modifies the forward relation)
|
so this call modifies the forward relation)
|
||||||
|
|
||||||
``model`` ``Topping`` (the class of the objects added to the
|
``model`` ``Topping`` (the class of the objects added to the
|
||||||
``Pizza``)
|
``Pizza``)
|
||||||
|
|
||||||
``pk_set`` ``[t.id]`` (since only ``Topping t`` was added to the relation)
|
``pk_set`` ``[t.id]`` (since only ``Topping t`` was added to the relation)
|
||||||
|
|
||||||
``using`` ``"default"`` (since the default router sends writes here)
|
``using`` ``"default"`` (since the default router sends writes here)
|
||||||
============== ============================================================
|
============== ============================================================
|
||||||
|
|
||||||
And if we would then do something like this:
|
And if we would then do something like this::
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> t.pizza_set.remove(p)
|
>>> t.pizza_set.remove(p)
|
||||||
|
|
||||||
the arguments sent to a :data:`m2m_changed` handler would be:
|
the arguments sent to a :data:`m2m_changed` handler would be:
|
||||||
|
|
||||||
============== ============================================================
|
============== ============================================================
|
||||||
Argument Value
|
Argument Value
|
||||||
============== ============================================================
|
============== ============================================================
|
||||||
``sender`` ``Pizza.toppings.through`` (the intermediate m2m class)
|
``sender`` ``Pizza.toppings.through`` (the intermediate m2m class)
|
||||||
|
|
||||||
``instance`` ``t`` (the ``Topping`` instance being modified)
|
``instance`` ``t`` (the ``Topping`` instance being modified)
|
||||||
|
|
||||||
``action`` ``"pre_remove"`` (followed by a separate signal with ``"post_remove"``)
|
``action`` ``"pre_remove"`` (followed by a separate signal with ``"post_remove"``)
|
||||||
|
|
||||||
``reverse`` ``True`` (``Pizza`` contains the :class:`ManyToManyField`,
|
``reverse`` ``True`` (``Pizza`` contains the :class:`ManyToManyField`,
|
||||||
so this call modifies the reverse relation)
|
so this call modifies the reverse relation)
|
||||||
|
|
||||||
``model`` ``Pizza`` (the class of the objects removed from the
|
``model`` ``Pizza`` (the class of the objects removed from the
|
||||||
``Topping``)
|
``Topping``)
|
||||||
|
|
||||||
``pk_set`` ``[p.id]`` (since only ``Pizza p`` was removed from the
|
``pk_set`` ``[p.id]`` (since only ``Pizza p`` was removed from the
|
||||||
relation)
|
relation)
|
||||||
|
|
||||||
``using`` ``"default"`` (since the default router sends writes here)
|
``using`` ``"default"`` (since the default router sends writes here)
|
||||||
============== ============================================================
|
============== ============================================================
|
||||||
|
|
||||||
class_prepared
|
class_prepared
|
||||||
--------------
|
--------------
|
||||||
|
|
|
@ -193,13 +193,13 @@ final byte stream that can be served to the client.
|
||||||
There are three circumstances under which a TemplateResponse will be
|
There are three circumstances under which a TemplateResponse will be
|
||||||
rendered:
|
rendered:
|
||||||
|
|
||||||
* When the TemplateResponse instance is explicitly rendered, using
|
* When the TemplateResponse instance is explicitly rendered, using
|
||||||
the :meth:`SimpleTemplateResponse.render()` method.
|
the :meth:`SimpleTemplateResponse.render()` method.
|
||||||
|
|
||||||
* When the content of the response is explicitly set by assigning
|
* When the content of the response is explicitly set by assigning
|
||||||
:attr:`response.content`.
|
:attr:`response.content`.
|
||||||
|
|
||||||
* After passing through template response middleware, but before
|
* After passing through template response middleware, but before
|
||||||
passing through response middleware.
|
passing through response middleware.
|
||||||
|
|
||||||
A TemplateResponse can only be rendered once. The first call to
|
A TemplateResponse can only be rendered once. The first call to
|
||||||
|
|
|
@ -56,8 +56,8 @@ Using the template system
|
||||||
|
|
||||||
Using the template system in Python is a two-step process:
|
Using the template system in Python is a two-step process:
|
||||||
|
|
||||||
* First, you compile the raw template code into a ``Template`` object.
|
* First, you compile the raw template code into a ``Template`` object.
|
||||||
* Then, you call the ``render()`` method of the ``Template`` object with a
|
* Then, you call the ``render()`` method of the ``Template`` object with a
|
||||||
given context.
|
given context.
|
||||||
|
|
||||||
Compiling a string
|
Compiling a string
|
||||||
|
@ -91,9 +91,9 @@ multiple contexts -- with it. The ``Context`` class lives at
|
||||||
:class:`django.template.Context`, and the constructor takes two (optional)
|
:class:`django.template.Context`, and the constructor takes two (optional)
|
||||||
arguments:
|
arguments:
|
||||||
|
|
||||||
* A dictionary mapping variable names to variable values.
|
* A dictionary mapping variable names to variable values.
|
||||||
|
|
||||||
* The name of the current application. This application name is used
|
* The name of the current application. This application name is used
|
||||||
to help :ref:`resolve namespaced URLs<topics-http-reversing-url-namespaces>`.
|
to help :ref:`resolve namespaced URLs<topics-http-reversing-url-namespaces>`.
|
||||||
If you're not using namespaced URLs, you can ignore this argument.
|
If you're not using namespaced URLs, you can ignore this argument.
|
||||||
|
|
||||||
|
@ -118,9 +118,9 @@ Dots have a special meaning in template rendering. A dot in a variable name
|
||||||
signifies a **lookup**. Specifically, when the template system encounters a
|
signifies a **lookup**. Specifically, when the template system encounters a
|
||||||
dot in a variable name, it tries the following lookups, in this order:
|
dot in a variable name, it tries the following lookups, in this order:
|
||||||
|
|
||||||
* Dictionary lookup. Example: ``foo["bar"]``
|
* Dictionary lookup. Example: ``foo["bar"]``
|
||||||
* Attribute lookup. Example: ``foo.bar``
|
* Attribute lookup. Example: ``foo.bar``
|
||||||
* List-index lookup. Example: ``foo[bar]``
|
* List-index lookup. Example: ``foo[bar]``
|
||||||
|
|
||||||
The template system uses the first lookup type that works. It's short-circuit
|
The template system uses the first lookup type that works. It's short-circuit
|
||||||
logic. Here are a few examples::
|
logic. Here are a few examples::
|
||||||
|
@ -161,7 +161,7 @@ it. Example::
|
||||||
Callable variables are slightly more complex than variables which only require
|
Callable variables are slightly more complex than variables which only require
|
||||||
straight lookups. Here are some things to keep in mind:
|
straight lookups. Here are some things to keep in mind:
|
||||||
|
|
||||||
* If the variable raises an exception when called, the exception will be
|
* If the variable raises an exception when called, the exception will be
|
||||||
propagated, unless the exception has an attribute
|
propagated, unless the exception has an attribute
|
||||||
``silent_variable_failure`` whose value is ``True``. If the exception
|
``silent_variable_failure`` whose value is ``True``. If the exception
|
||||||
*does* have a ``silent_variable_failure`` attribute whose value is
|
*does* have a ``silent_variable_failure`` attribute whose value is
|
||||||
|
@ -192,10 +192,10 @@ straight lookups. Here are some things to keep in mind:
|
||||||
with Django model objects, any ``DoesNotExist`` exception will fail
|
with Django model objects, any ``DoesNotExist`` exception will fail
|
||||||
silently.
|
silently.
|
||||||
|
|
||||||
* A variable can only be called if it has no required arguments. Otherwise,
|
* A variable can only be called if it has no required arguments. Otherwise,
|
||||||
the system will return an empty string.
|
the system will return an empty string.
|
||||||
|
|
||||||
* Obviously, there can be side effects when calling some variables, and
|
* Obviously, there can be side effects when calling some variables, and
|
||||||
it'd be either foolish or a security hole to allow the template system
|
it'd be either foolish or a security hole to allow the template system
|
||||||
to access them.
|
to access them.
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ straight lookups. Here are some things to keep in mind:
|
||||||
self.database_record.delete()
|
self.database_record.delete()
|
||||||
sensitive_function.alters_data = True
|
sensitive_function.alters_data = True
|
||||||
|
|
||||||
* .. versionadded:: 1.4
|
* .. versionadded:: 1.4
|
||||||
Occasionally you may want to turn off this feature for other reasons,
|
Occasionally you may want to turn off this feature for other reasons,
|
||||||
and tell the template system to leave a variable un-called no matter
|
and tell the template system to leave a variable un-called no matter
|
||||||
what. To do so, set a ``do_not_call_in_templates`` attribute on the
|
what. To do so, set a ``do_not_call_in_templates`` attribute on the
|
||||||
|
@ -427,11 +427,11 @@ django.contrib.auth.context_processors.auth
|
||||||
If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every
|
If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every
|
||||||
``RequestContext`` will contain these three variables:
|
``RequestContext`` will contain these three variables:
|
||||||
|
|
||||||
* ``user`` -- An ``auth.User`` instance representing the currently
|
* ``user`` -- An ``auth.User`` instance representing the currently
|
||||||
logged-in user (or an ``AnonymousUser`` instance, if the client isn't
|
logged-in user (or an ``AnonymousUser`` instance, if the client isn't
|
||||||
logged in).
|
logged in).
|
||||||
|
|
||||||
* ``perms`` -- An instance of
|
* ``perms`` -- An instance of
|
||||||
``django.contrib.auth.context_processors.PermWrapper``, representing the
|
``django.contrib.auth.context_processors.PermWrapper``, representing the
|
||||||
permissions that the currently logged-in user has.
|
permissions that the currently logged-in user has.
|
||||||
|
|
||||||
|
@ -452,9 +452,9 @@ If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every
|
||||||
:setting:`DEBUG` setting is set to ``True`` and the request's IP address
|
:setting:`DEBUG` setting is set to ``True`` and the request's IP address
|
||||||
(``request.META['REMOTE_ADDR']``) is in the :setting:`INTERNAL_IPS` setting:
|
(``request.META['REMOTE_ADDR']``) is in the :setting:`INTERNAL_IPS` setting:
|
||||||
|
|
||||||
* ``debug`` -- ``True``. You can use this in templates to test whether
|
* ``debug`` -- ``True``. You can use this in templates to test whether
|
||||||
you're in :setting:`DEBUG` mode.
|
you're in :setting:`DEBUG` mode.
|
||||||
* ``sql_queries`` -- A list of ``{'sql': ..., 'time': ...}`` dictionaries,
|
* ``sql_queries`` -- A list of ``{'sql': ..., 'time': ...}`` dictionaries,
|
||||||
representing every SQL query that has happened so far during the request
|
representing every SQL query that has happened so far during the request
|
||||||
and how long it took. The list is in order by query.
|
and how long it took. The list is in order by query.
|
||||||
|
|
||||||
|
@ -464,8 +464,8 @@ django.core.context_processors.i18n
|
||||||
If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every
|
If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every
|
||||||
``RequestContext`` will contain these two variables:
|
``RequestContext`` will contain these two variables:
|
||||||
|
|
||||||
* ``LANGUAGES`` -- The value of the :setting:`LANGUAGES` setting.
|
* ``LANGUAGES`` -- The value of the :setting:`LANGUAGES` setting.
|
||||||
* ``LANGUAGE_CODE`` -- ``request.LANGUAGE_CODE``, if it exists. Otherwise,
|
* ``LANGUAGE_CODE`` -- ``request.LANGUAGE_CODE``, if it exists. Otherwise,
|
||||||
the value of the :setting:`LANGUAGE_CODE` setting.
|
the value of the :setting:`LANGUAGE_CODE` setting.
|
||||||
|
|
||||||
See :doc:`/topics/i18n/index` for more.
|
See :doc:`/topics/i18n/index` for more.
|
||||||
|
@ -511,7 +511,7 @@ django.contrib.messages.context_processors.messages
|
||||||
If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every
|
If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every
|
||||||
``RequestContext`` will contain a single additional variable:
|
``RequestContext`` will contain a single additional variable:
|
||||||
|
|
||||||
* ``messages`` -- A list of messages (as strings) that have been set
|
* ``messages`` -- A list of messages (as strings) that have been set
|
||||||
via the user model (using ``user.message_set.create``) or through
|
via the user model (using ``user.message_set.create``) or through
|
||||||
the :doc:`messages framework </ref/contrib/messages>`.
|
the :doc:`messages framework </ref/contrib/messages>`.
|
||||||
|
|
||||||
|
@ -589,16 +589,16 @@ For example, if you call ``get_template('story_detail.html')`` and have the
|
||||||
above :setting:`TEMPLATE_DIRS` setting, here are the files Django will look for,
|
above :setting:`TEMPLATE_DIRS` setting, here are the files Django will look for,
|
||||||
in order:
|
in order:
|
||||||
|
|
||||||
* ``/home/html/templates/lawrence.com/story_detail.html``
|
* ``/home/html/templates/lawrence.com/story_detail.html``
|
||||||
* ``/home/html/templates/default/story_detail.html``
|
* ``/home/html/templates/default/story_detail.html``
|
||||||
|
|
||||||
If you call ``select_template(['story_253_detail.html', 'story_detail.html'])``,
|
If you call ``select_template(['story_253_detail.html', 'story_detail.html'])``,
|
||||||
here's what Django will look for:
|
here's what Django will look for:
|
||||||
|
|
||||||
* ``/home/html/templates/lawrence.com/story_253_detail.html``
|
* ``/home/html/templates/lawrence.com/story_253_detail.html``
|
||||||
* ``/home/html/templates/default/story_253_detail.html``
|
* ``/home/html/templates/default/story_253_detail.html``
|
||||||
* ``/home/html/templates/lawrence.com/story_detail.html``
|
* ``/home/html/templates/lawrence.com/story_detail.html``
|
||||||
* ``/home/html/templates/default/story_detail.html``
|
* ``/home/html/templates/default/story_detail.html``
|
||||||
|
|
||||||
When Django finds a template that exists, it stops looking.
|
When Django finds a template that exists, it stops looking.
|
||||||
|
|
||||||
|
@ -628,8 +628,8 @@ To load a template that's within a subdirectory, just use a slash, like so::
|
||||||
Using the same :setting:`TEMPLATE_DIRS` setting from above, this example
|
Using the same :setting:`TEMPLATE_DIRS` setting from above, this example
|
||||||
``get_template()`` call will attempt to load the following templates:
|
``get_template()`` call will attempt to load the following templates:
|
||||||
|
|
||||||
* ``/home/html/templates/lawrence.com/news/story_detail.html``
|
* ``/home/html/templates/lawrence.com/news/story_detail.html``
|
||||||
* ``/home/html/templates/default/news/story_detail.html``
|
* ``/home/html/templates/default/news/story_detail.html``
|
||||||
|
|
||||||
.. _template-loaders:
|
.. _template-loaders:
|
||||||
|
|
||||||
|
@ -739,12 +739,12 @@ The ``render_to_string`` shortcut takes one required argument --
|
||||||
and render (or a list of template names, in which case Django will use
|
and render (or a list of template names, in which case Django will use
|
||||||
the first template in the list that exists) -- and two optional arguments:
|
the first template in the list that exists) -- and two optional arguments:
|
||||||
|
|
||||||
dictionary
|
dictionary
|
||||||
A dictionary to be used as variables and values for the
|
A dictionary to be used as variables and values for the
|
||||||
template's context. This can also be passed as the second
|
template's context. This can also be passed as the second
|
||||||
positional argument.
|
positional argument.
|
||||||
|
|
||||||
context_instance
|
context_instance
|
||||||
An instance of ``Context`` or a subclass (e.g., an instance of
|
An instance of ``Context`` or a subclass (e.g., an instance of
|
||||||
``RequestContext``) to use as the template's context. This can
|
``RequestContext``) to use as the template's context. This can
|
||||||
also be passed as the third positional argument.
|
also be passed as the third positional argument.
|
||||||
|
|
|
@ -201,10 +201,10 @@ Signals that this template extends a parent template.
|
||||||
|
|
||||||
This tag can be used in two ways:
|
This tag can be used in two ways:
|
||||||
|
|
||||||
* ``{% extends "base.html" %}`` (with quotes) uses the literal value
|
* ``{% extends "base.html" %}`` (with quotes) uses the literal value
|
||||||
``"base.html"`` as the name of the parent template to extend.
|
``"base.html"`` as the name of the parent template to extend.
|
||||||
|
|
||||||
* ``{% extends variable %}`` uses the value of ``variable``. If the variable
|
* ``{% extends variable %}`` uses the value of ``variable``. If the variable
|
||||||
evaluates to a string, Django will use that string as the name of the
|
evaluates to a string, Django will use that string as the name of the
|
||||||
parent template. If the variable evaluates to a ``Template`` object,
|
parent template. If the variable evaluates to a ``Template`` object,
|
||||||
Django will use that object as the parent template.
|
Django will use that object as the parent template.
|
||||||
|
@ -303,20 +303,20 @@ would display the keys and values of the dictionary::
|
||||||
|
|
||||||
The for loop sets a number of variables available within the loop:
|
The for loop sets a number of variables available within the loop:
|
||||||
|
|
||||||
========================== ===============================================
|
========================== ===============================================
|
||||||
Variable Description
|
Variable Description
|
||||||
========================== ===============================================
|
========================== ===============================================
|
||||||
``forloop.counter`` The current iteration of the loop (1-indexed)
|
``forloop.counter`` The current iteration of the loop (1-indexed)
|
||||||
``forloop.counter0`` The current iteration of the loop (0-indexed)
|
``forloop.counter0`` The current iteration of the loop (0-indexed)
|
||||||
``forloop.revcounter`` The number of iterations from the end of the
|
``forloop.revcounter`` The number of iterations from the end of the
|
||||||
loop (1-indexed)
|
loop (1-indexed)
|
||||||
``forloop.revcounter0`` The number of iterations from the end of the
|
``forloop.revcounter0`` The number of iterations from the end of the
|
||||||
loop (0-indexed)
|
loop (0-indexed)
|
||||||
``forloop.first`` True if this is the first time through the loop
|
``forloop.first`` True if this is the first time through the loop
|
||||||
``forloop.last`` True if this is the last time through the loop
|
``forloop.last`` True if this is the last time through the loop
|
||||||
``forloop.parentloop`` For nested loops, this is the loop "above" the
|
``forloop.parentloop`` For nested loops, this is the loop "above" the
|
||||||
current one
|
current one
|
||||||
========================== ===============================================
|
========================== ===============================================
|
||||||
|
|
||||||
for ... empty
|
for ... empty
|
||||||
^^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
@ -526,11 +526,11 @@ expressions, it can be important to know how the operators are grouped when the
|
||||||
expression is evaluated - that is, the precedence rules. The precedence of the
|
expression is evaluated - that is, the precedence rules. The precedence of the
|
||||||
operators, from lowest to highest, is as follows:
|
operators, from lowest to highest, is as follows:
|
||||||
|
|
||||||
* ``or``
|
* ``or``
|
||||||
* ``and``
|
* ``and``
|
||||||
* ``not``
|
* ``not``
|
||||||
* ``in``
|
* ``in``
|
||||||
* ``==``, ``!=``, ``<``, ``>``, ``<=``, ``>=``
|
* ``==``, ``!=``, ``<``, ``>``, ``<=``, ``>=``
|
||||||
|
|
||||||
(This follows Python exactly). So, for example, the following complex
|
(This follows Python exactly). So, for example, the following complex
|
||||||
:ttag:`if` tag:
|
:ttag:`if` tag:
|
||||||
|
@ -660,12 +660,12 @@ the variable ``template_name``::
|
||||||
An included template is rendered with the context of the template that's
|
An included template is rendered with the context of the template that's
|
||||||
including it. This example produces the output ``"Hello, John"``:
|
including it. This example produces the output ``"Hello, John"``:
|
||||||
|
|
||||||
* Context: variable ``person`` is set to ``"john"``.
|
* Context: variable ``person`` is set to ``"john"``.
|
||||||
* Template::
|
* Template::
|
||||||
|
|
||||||
{% include "name_snippet.html" %}
|
{% include "name_snippet.html" %}
|
||||||
|
|
||||||
* The ``name_snippet.html`` template::
|
* The ``name_snippet.html`` template::
|
||||||
|
|
||||||
{{ greeting }}, {{ person|default:"friend" }}!
|
{{ greeting }}, {{ person|default:"friend" }}!
|
||||||
|
|
||||||
|
@ -771,13 +771,13 @@ is a list of people represented by dictionaries with ``first_name``,
|
||||||
...and you'd like to display a hierarchical list that is ordered by gender,
|
...and you'd like to display a hierarchical list that is ordered by gender,
|
||||||
like this:
|
like this:
|
||||||
|
|
||||||
* Male:
|
* Male:
|
||||||
* George Bush
|
* George Bush
|
||||||
* Bill Clinton
|
* Bill Clinton
|
||||||
* Female:
|
* Female:
|
||||||
* Margaret Thatcher
|
* Margaret Thatcher
|
||||||
* Condoleezza Rice
|
* Condoleezza Rice
|
||||||
* Unknown:
|
* Unknown:
|
||||||
* Pat Smith
|
* Pat Smith
|
||||||
|
|
||||||
You can use the ``{% regroup %}`` tag to group the list of people by gender.
|
You can use the ``{% regroup %}`` tag to group the list of people by gender.
|
||||||
|
@ -805,9 +805,9 @@ attribute and calling the result ``gender_list``.
|
||||||
``{% regroup %}`` produces a list (in this case, ``gender_list``) of
|
``{% regroup %}`` produces a list (in this case, ``gender_list``) of
|
||||||
**group objects**. Each group object has two attributes:
|
**group objects**. Each group object has two attributes:
|
||||||
|
|
||||||
* ``grouper`` -- the item that was grouped by (e.g., the string "Male" or
|
* ``grouper`` -- the item that was grouped by (e.g., the string "Male" or
|
||||||
"Female").
|
"Female").
|
||||||
* ``list`` -- a list of all items in this group (e.g., a list of all people
|
* ``list`` -- a list of all items in this group (e.g., a list of all people
|
||||||
with gender='Male').
|
with gender='Male').
|
||||||
|
|
||||||
Note that ``{% regroup %}`` does not order its input! Our example relies on
|
Note that ``{% regroup %}`` does not order its input! Our example relies on
|
||||||
|
@ -830,15 +830,15 @@ grouped together):
|
||||||
With this input for ``people``, the example ``{% regroup %}`` template code
|
With this input for ``people``, the example ``{% regroup %}`` template code
|
||||||
above would result in the following output:
|
above would result in the following output:
|
||||||
|
|
||||||
* Male:
|
* Male:
|
||||||
* Bill Clinton
|
* Bill Clinton
|
||||||
* Unknown:
|
* Unknown:
|
||||||
* Pat Smith
|
* Pat Smith
|
||||||
* Female:
|
* Female:
|
||||||
* Margaret Thatcher
|
* Margaret Thatcher
|
||||||
* Male:
|
* Male:
|
||||||
* George Bush
|
* George Bush
|
||||||
* Female:
|
* Female:
|
||||||
* Condoleezza Rice
|
* Condoleezza Rice
|
||||||
|
|
||||||
The easiest solution to this gotcha is to make sure in your view code that the
|
The easiest solution to this gotcha is to make sure in your view code that the
|
||||||
|
@ -959,18 +959,18 @@ bits used in template tags, you must use the ``{% templatetag %}`` tag.
|
||||||
|
|
||||||
The argument tells which template bit to output:
|
The argument tells which template bit to output:
|
||||||
|
|
||||||
================== =======
|
================== =======
|
||||||
Argument Outputs
|
Argument Outputs
|
||||||
================== =======
|
================== =======
|
||||||
``openblock`` ``{%``
|
``openblock`` ``{%``
|
||||||
``closeblock`` ``%}``
|
``closeblock`` ``%}``
|
||||||
``openvariable`` ``{{``
|
``openvariable`` ``{{``
|
||||||
``closevariable`` ``}}``
|
``closevariable`` ``}}``
|
||||||
``openbrace`` ``{``
|
``openbrace`` ``{``
|
||||||
``closebrace`` ``}``
|
``closebrace`` ``}``
|
||||||
``opencomment`` ``{#``
|
``opencomment`` ``{#``
|
||||||
``closecomment`` ``#}``
|
``closecomment`` ``#}``
|
||||||
================== =======
|
================== =======
|
||||||
|
|
||||||
.. templatetag:: url
|
.. templatetag:: url
|
||||||
|
|
||||||
|
@ -1250,75 +1250,75 @@ with some custom extensions.
|
||||||
|
|
||||||
Available format strings:
|
Available format strings:
|
||||||
|
|
||||||
================ ======================================== =====================
|
================ ======================================== =====================
|
||||||
Format character Description Example output
|
Format character Description Example output
|
||||||
================ ======================================== =====================
|
================ ======================================== =====================
|
||||||
a ``'a.m.'`` or ``'p.m.'`` (Note that ``'a.m.'``
|
a ``'a.m.'`` or ``'p.m.'`` (Note that ``'a.m.'``
|
||||||
this is slightly different than PHP's
|
this is slightly different than PHP's
|
||||||
output, because this includes periods
|
output, because this includes periods
|
||||||
to match Associated Press style.)
|
to match Associated Press style.)
|
||||||
A ``'AM'`` or ``'PM'``. ``'AM'``
|
A ``'AM'`` or ``'PM'``. ``'AM'``
|
||||||
b Month, textual, 3 letters, lowercase. ``'jan'``
|
b Month, textual, 3 letters, lowercase. ``'jan'``
|
||||||
B Not implemented.
|
B Not implemented.
|
||||||
c ISO 8601 format. (Note: unlike others ``2008-01-02T10:30:00.000123+02:00``,
|
c ISO 8601 format. (Note: unlike others ``2008-01-02T10:30:00.000123+02:00``,
|
||||||
formatters, such as "Z", "O" or "r", or ``2008-01-02T10:30:00.000123`` if the datetime is naive
|
formatters, such as "Z", "O" or "r", or ``2008-01-02T10:30:00.000123`` if the datetime is naive
|
||||||
the "c" formatter will not add timezone
|
the "c" formatter will not add timezone
|
||||||
offset if value is a naive datetime
|
offset if value is a naive datetime
|
||||||
(see :class:`datetime.tzinfo`).
|
(see :class:`datetime.tzinfo`).
|
||||||
d Day of the month, 2 digits with ``'01'`` to ``'31'``
|
d Day of the month, 2 digits with ``'01'`` to ``'31'``
|
||||||
leading zeros.
|
leading zeros.
|
||||||
D Day of the week, textual, 3 letters. ``'Fri'``
|
D Day of the week, textual, 3 letters. ``'Fri'``
|
||||||
E Month, locale specific alternative
|
E Month, locale specific alternative
|
||||||
representation usually used for long
|
representation usually used for long
|
||||||
date representation. ``'listopada'`` (for Polish locale, as opposed to ``'Listopad'``)
|
date representation. ``'listopada'`` (for Polish locale, as opposed to ``'Listopad'``)
|
||||||
f Time, in 12-hour hours and minutes, ``'1'``, ``'1:30'``
|
f Time, in 12-hour hours and minutes, ``'1'``, ``'1:30'``
|
||||||
with minutes left off if they're zero.
|
with minutes left off if they're zero.
|
||||||
Proprietary extension.
|
Proprietary extension.
|
||||||
F Month, textual, long. ``'January'``
|
F Month, textual, long. ``'January'``
|
||||||
g Hour, 12-hour format without leading ``'1'`` to ``'12'``
|
g Hour, 12-hour format without leading ``'1'`` to ``'12'``
|
||||||
zeros.
|
zeros.
|
||||||
G Hour, 24-hour format without leading ``'0'`` to ``'23'``
|
G Hour, 24-hour format without leading ``'0'`` to ``'23'``
|
||||||
zeros.
|
zeros.
|
||||||
h Hour, 12-hour format. ``'01'`` to ``'12'``
|
h Hour, 12-hour format. ``'01'`` to ``'12'``
|
||||||
H Hour, 24-hour format. ``'00'`` to ``'23'``
|
H Hour, 24-hour format. ``'00'`` to ``'23'``
|
||||||
i Minutes. ``'00'`` to ``'59'``
|
i Minutes. ``'00'`` to ``'59'``
|
||||||
I Not implemented.
|
I Not implemented.
|
||||||
j Day of the month without leading ``'1'`` to ``'31'``
|
j Day of the month without leading ``'1'`` to ``'31'``
|
||||||
zeros.
|
zeros.
|
||||||
l Day of the week, textual, long. ``'Friday'``
|
l Day of the week, textual, long. ``'Friday'``
|
||||||
L Boolean for whether it's a leap year. ``True`` or ``False``
|
L Boolean for whether it's a leap year. ``True`` or ``False``
|
||||||
m Month, 2 digits with leading zeros. ``'01'`` to ``'12'``
|
m Month, 2 digits with leading zeros. ``'01'`` to ``'12'``
|
||||||
M Month, textual, 3 letters. ``'Jan'``
|
M Month, textual, 3 letters. ``'Jan'``
|
||||||
n Month without leading zeros. ``'1'`` to ``'12'``
|
n Month without leading zeros. ``'1'`` to ``'12'``
|
||||||
N Month abbreviation in Associated Press ``'Jan.'``, ``'Feb.'``, ``'March'``, ``'May'``
|
N Month abbreviation in Associated Press ``'Jan.'``, ``'Feb.'``, ``'March'``, ``'May'``
|
||||||
style. Proprietary extension.
|
style. Proprietary extension.
|
||||||
O Difference to Greenwich time in hours. ``'+0200'``
|
O Difference to Greenwich time in hours. ``'+0200'``
|
||||||
P Time, in 12-hour hours, minutes and ``'1 a.m.'``, ``'1:30 p.m.'``, ``'midnight'``, ``'noon'``, ``'12:30 p.m.'``
|
P Time, in 12-hour hours, minutes and ``'1 a.m.'``, ``'1:30 p.m.'``, ``'midnight'``, ``'noon'``, ``'12:30 p.m.'``
|
||||||
'a.m.'/'p.m.', with minutes left off
|
'a.m.'/'p.m.', with minutes left off
|
||||||
if they're zero and the special-case
|
if they're zero and the special-case
|
||||||
strings 'midnight' and 'noon' if
|
strings 'midnight' and 'noon' if
|
||||||
appropriate. Proprietary extension.
|
appropriate. Proprietary extension.
|
||||||
r :rfc:`2822` formatted date. ``'Thu, 21 Dec 2000 16:01:07 +0200'``
|
r :rfc:`2822` formatted date. ``'Thu, 21 Dec 2000 16:01:07 +0200'``
|
||||||
s Seconds, 2 digits with leading zeros. ``'00'`` to ``'59'``
|
s Seconds, 2 digits with leading zeros. ``'00'`` to ``'59'``
|
||||||
S English ordinal suffix for day of the ``'st'``, ``'nd'``, ``'rd'`` or ``'th'``
|
S English ordinal suffix for day of the ``'st'``, ``'nd'``, ``'rd'`` or ``'th'``
|
||||||
month, 2 characters.
|
month, 2 characters.
|
||||||
t Number of days in the given month. ``28`` to ``31``
|
t Number of days in the given month. ``28`` to ``31``
|
||||||
T Time zone of this machine. ``'EST'``, ``'MDT'``
|
T Time zone of this machine. ``'EST'``, ``'MDT'``
|
||||||
u Microseconds. ``0`` to ``999999``
|
u Microseconds. ``0`` to ``999999``
|
||||||
U Seconds since the Unix Epoch
|
U Seconds since the Unix Epoch
|
||||||
(January 1 1970 00:00:00 UTC).
|
(January 1 1970 00:00:00 UTC).
|
||||||
w Day of the week, digits without ``'0'`` (Sunday) to ``'6'`` (Saturday)
|
w Day of the week, digits without ``'0'`` (Sunday) to ``'6'`` (Saturday)
|
||||||
leading zeros.
|
leading zeros.
|
||||||
W ISO-8601 week number of year, with ``1``, ``53``
|
W ISO-8601 week number of year, with ``1``, ``53``
|
||||||
weeks starting on Monday.
|
weeks starting on Monday.
|
||||||
y Year, 2 digits. ``'99'``
|
y Year, 2 digits. ``'99'``
|
||||||
Y Year, 4 digits. ``'1999'``
|
Y Year, 4 digits. ``'1999'``
|
||||||
z Day of the year. ``0`` to ``365``
|
z Day of the year. ``0`` to ``365``
|
||||||
Z Time zone offset in seconds. The ``-43200`` to ``43200``
|
Z Time zone offset in seconds. The ``-43200`` to ``43200``
|
||||||
offset for timezones west of UTC is
|
offset for timezones west of UTC is
|
||||||
always negative, and for those east of
|
always negative, and for those east of
|
||||||
UTC is always positive.
|
UTC is always positive.
|
||||||
================ ======================================== =====================
|
================ ======================================== =====================
|
||||||
|
|
||||||
.. versionadded:: 1.2
|
.. versionadded:: 1.2
|
||||||
|
|
||||||
|
@ -1448,11 +1448,11 @@ escape
|
||||||
|
|
||||||
Escapes a string's HTML. Specifically, it makes these replacements:
|
Escapes a string's HTML. Specifically, it makes these replacements:
|
||||||
|
|
||||||
* ``<`` is converted to ``<``
|
* ``<`` is converted to ``<``
|
||||||
* ``>`` is converted to ``>``
|
* ``>`` is converted to ``>``
|
||||||
* ``'`` (single quote) is converted to ``'``
|
* ``'`` (single quote) is converted to ``'``
|
||||||
* ``"`` (double quote) is converted to ``"``
|
* ``"`` (double quote) is converted to ``"``
|
||||||
* ``&`` is converted to ``&``
|
* ``&`` is converted to ``&``
|
||||||
|
|
||||||
The escaping is only applied when the string is output, so it does not matter
|
The escaping is only applied when the string is output, so it does not matter
|
||||||
where in a chained sequence of filters you put ``escape``: it will always be
|
where in a chained sequence of filters you put ``escape``: it will always be
|
||||||
|
@ -2320,9 +2320,9 @@ django.contrib.markup
|
||||||
|
|
||||||
A collection of template filters that implement these common markup languages:
|
A collection of template filters that implement these common markup languages:
|
||||||
|
|
||||||
* Textile
|
* Textile
|
||||||
* Markdown
|
* Markdown
|
||||||
* reST (reStructuredText)
|
* reST (reStructuredText)
|
||||||
|
|
||||||
See the :doc:`markup documentation </ref/contrib/markup>`.
|
See the :doc:`markup documentation </ref/contrib/markup>`.
|
||||||
|
|
||||||
|
|
|
@ -17,13 +17,13 @@ data. Normally, this means giving it an encoding of UTF-8 or UTF-16. If you use
|
||||||
a more restrictive encoding -- for example, latin1 (iso8859-1) -- you won't be
|
a more restrictive encoding -- for example, latin1 (iso8859-1) -- you won't be
|
||||||
able to store certain characters in the database, and information will be lost.
|
able to store certain characters in the database, and information will be lost.
|
||||||
|
|
||||||
* MySQL users, refer to the `MySQL manual`_ (section 9.1.3.2 for MySQL 5.1)
|
* MySQL users, refer to the `MySQL manual`_ (section 9.1.3.2 for MySQL 5.1)
|
||||||
for details on how to set or alter the database character set encoding.
|
for details on how to set or alter the database character set encoding.
|
||||||
|
|
||||||
* PostgreSQL users, refer to the `PostgreSQL manual`_ (section 21.2.2 in
|
* PostgreSQL users, refer to the `PostgreSQL manual`_ (section 21.2.2 in
|
||||||
PostgreSQL 8) for details on creating databases with the correct encoding.
|
PostgreSQL 8) for details on creating databases with the correct encoding.
|
||||||
|
|
||||||
* SQLite users, there is nothing you need to do. SQLite always uses UTF-8
|
* SQLite users, there is nothing you need to do. SQLite always uses UTF-8
|
||||||
for internal encoding.
|
for internal encoding.
|
||||||
|
|
||||||
.. _MySQL manual: http://dev.mysql.com/doc/refman/5.1/en/charset-database.html
|
.. _MySQL manual: http://dev.mysql.com/doc/refman/5.1/en/charset-database.html
|
||||||
|
@ -106,7 +106,7 @@ Conversion functions
|
||||||
The ``django.utils.encoding`` module contains a few functions that are handy
|
The ``django.utils.encoding`` module contains a few functions that are handy
|
||||||
for converting back and forth between Unicode and bytestrings.
|
for converting back and forth between Unicode and bytestrings.
|
||||||
|
|
||||||
* ``smart_unicode(s, encoding='utf-8', strings_only=False, errors='strict')``
|
* ``smart_unicode(s, encoding='utf-8', strings_only=False, errors='strict')``
|
||||||
converts its input to a Unicode string. The ``encoding`` parameter
|
converts its input to a Unicode string. The ``encoding`` parameter
|
||||||
specifies the input encoding. (For example, Django uses this internally
|
specifies the input encoding. (For example, Django uses this internally
|
||||||
when processing form input data, which might not be UTF-8 encoded.) The
|
when processing form input data, which might not be UTF-8 encoded.) The
|
||||||
|
@ -119,7 +119,7 @@ for converting back and forth between Unicode and bytestrings.
|
||||||
If you pass ``smart_unicode()`` an object that has a ``__unicode__``
|
If you pass ``smart_unicode()`` an object that has a ``__unicode__``
|
||||||
method, it will use that method to do the conversion.
|
method, it will use that method to do the conversion.
|
||||||
|
|
||||||
* ``force_unicode(s, encoding='utf-8', strings_only=False,
|
* ``force_unicode(s, encoding='utf-8', strings_only=False,
|
||||||
errors='strict')`` is identical to ``smart_unicode()`` in almost all
|
errors='strict')`` is identical to ``smart_unicode()`` in almost all
|
||||||
cases. The difference is when the first argument is a :ref:`lazy
|
cases. The difference is when the first argument is a :ref:`lazy
|
||||||
translation <lazy-translations>` instance. While ``smart_unicode()``
|
translation <lazy-translations>` instance. While ``smart_unicode()``
|
||||||
|
@ -129,7 +129,7 @@ for converting back and forth between Unicode and bytestrings.
|
||||||
template tags and filters that absolutely *must* have a string to work
|
template tags and filters that absolutely *must* have a string to work
|
||||||
with, not just something that can be converted to a string.
|
with, not just something that can be converted to a string.
|
||||||
|
|
||||||
* ``smart_str(s, encoding='utf-8', strings_only=False, errors='strict')``
|
* ``smart_str(s, encoding='utf-8', strings_only=False, errors='strict')``
|
||||||
is essentially the opposite of ``smart_unicode()``. It forces the first
|
is essentially the opposite of ``smart_unicode()``. It forces the first
|
||||||
argument to a bytestring. The ``strings_only`` parameter has the same
|
argument to a bytestring. The ``strings_only`` parameter has the same
|
||||||
behavior as for ``smart_unicode()`` and ``force_unicode()``. This is
|
behavior as for ``smart_unicode()`` and ``force_unicode()``. This is
|
||||||
|
@ -152,10 +152,10 @@ URL from an IRI_ -- very loosely speaking, a URI_ that can contain Unicode
|
||||||
characters. Quoting and converting an IRI to URI can be a little tricky, so
|
characters. Quoting and converting an IRI to URI can be a little tricky, so
|
||||||
Django provides some assistance.
|
Django provides some assistance.
|
||||||
|
|
||||||
* The function ``django.utils.encoding.iri_to_uri()`` implements the
|
* The function ``django.utils.encoding.iri_to_uri()`` implements the
|
||||||
conversion from IRI to URI as required by the specification (:rfc:`3987`).
|
conversion from IRI to URI as required by the specification (:rfc:`3987`).
|
||||||
|
|
||||||
* The functions ``django.utils.http.urlquote()`` and
|
* The functions ``django.utils.http.urlquote()`` and
|
||||||
``django.utils.http.urlquote_plus()`` are versions of Python's standard
|
``django.utils.http.urlquote_plus()`` are versions of Python's standard
|
||||||
``urllib.quote()`` and ``urllib.quote_plus()`` that work with non-ASCII
|
``urllib.quote()`` and ``urllib.quote_plus()`` that work with non-ASCII
|
||||||
characters. (The data is converted to UTF-8 prior to encoding.)
|
characters. (The data is converted to UTF-8 prior to encoding.)
|
||||||
|
@ -295,10 +295,10 @@ Template tags and filters
|
||||||
|
|
||||||
A couple of tips to remember when writing your own template tags and filters:
|
A couple of tips to remember when writing your own template tags and filters:
|
||||||
|
|
||||||
* Always return Unicode strings from a template tag's ``render()`` method
|
* Always return Unicode strings from a template tag's ``render()`` method
|
||||||
and from template filters.
|
and from template filters.
|
||||||
|
|
||||||
* Use ``force_unicode()`` in preference to ``smart_unicode()`` in these
|
* Use ``force_unicode()`` in preference to ``smart_unicode()`` in these
|
||||||
places. Tag rendering and filter calls occur as the template is being
|
places. Tag rendering and filter calls occur as the template is being
|
||||||
rendered, so there is no advantage to postponing the conversion of lazy
|
rendered, so there is no advantage to postponing the conversion of lazy
|
||||||
translation objects into strings. It's easier to work solely with Unicode
|
translation objects into strings. It's easier to work solely with Unicode
|
||||||
|
|
|
@ -44,42 +44,42 @@ etc., to improve developers' quality of life.
|
||||||
|
|
||||||
The new features and changes introduced in 0.95 include:
|
The new features and changes introduced in 0.95 include:
|
||||||
|
|
||||||
* Django now uses a more consistent and natural filtering interface for
|
* Django now uses a more consistent and natural filtering interface for
|
||||||
retrieving objects from the database.
|
retrieving objects from the database.
|
||||||
|
|
||||||
* User-defined models, functions and constants now appear in the module
|
* User-defined models, functions and constants now appear in the module
|
||||||
namespace they were defined in. (Previously everything was magically
|
namespace they were defined in. (Previously everything was magically
|
||||||
transferred to the django.models.* namespace.)
|
transferred to the django.models.* namespace.)
|
||||||
|
|
||||||
* Some optional applications, such as the FlatPage, Sites and Redirects
|
* Some optional applications, such as the FlatPage, Sites and Redirects
|
||||||
apps, have been decoupled and moved into django.contrib. If you don't
|
apps, have been decoupled and moved into django.contrib. If you don't
|
||||||
want to use these applications, you no longer have to install their
|
want to use these applications, you no longer have to install their
|
||||||
database tables.
|
database tables.
|
||||||
|
|
||||||
* Django now has support for managing database transactions.
|
* Django now has support for managing database transactions.
|
||||||
|
|
||||||
* We've added the ability to write custom authentication and authorization
|
* We've added the ability to write custom authentication and authorization
|
||||||
backends for authenticating users against alternate systems, such as
|
backends for authenticating users against alternate systems, such as
|
||||||
LDAP.
|
LDAP.
|
||||||
|
|
||||||
* We've made it easier to add custom table-level functions to models,
|
* We've made it easier to add custom table-level functions to models,
|
||||||
through a new "Manager" API.
|
through a new "Manager" API.
|
||||||
|
|
||||||
* It's now possible to use Django without a database. This simply means
|
* It's now possible to use Django without a database. This simply means
|
||||||
that the framework no longer requires you to have a working database set
|
that the framework no longer requires you to have a working database set
|
||||||
up just to serve dynamic pages. In other words, you can just use
|
up just to serve dynamic pages. In other words, you can just use
|
||||||
URLconfs/views on their own. Previously, the framework required that a
|
URLconfs/views on their own. Previously, the framework required that a
|
||||||
database be configured, regardless of whether you actually used it.
|
database be configured, regardless of whether you actually used it.
|
||||||
|
|
||||||
* It's now more explicit and natural to override save() and delete()
|
* It's now more explicit and natural to override save() and delete()
|
||||||
methods on models, rather than needing to hook into the pre_save() and
|
methods on models, rather than needing to hook into the pre_save() and
|
||||||
post_save() method hooks.
|
post_save() method hooks.
|
||||||
|
|
||||||
* Individual pieces of the framework now can be configured without
|
* Individual pieces of the framework now can be configured without
|
||||||
requiring the setting of an environment variable. This permits use of,
|
requiring the setting of an environment variable. This permits use of,
|
||||||
for example, the Django templating system inside other applications.
|
for example, the Django templating system inside other applications.
|
||||||
|
|
||||||
* More and more parts of the framework have been internationalized, as
|
* More and more parts of the framework have been internationalized, as
|
||||||
we've expanded internationalization (i18n) support. The Django
|
we've expanded internationalization (i18n) support. The Django
|
||||||
codebase, including code and templates, has now been translated, at least
|
codebase, including code and templates, has now been translated, at least
|
||||||
in part, into 31 languages. From Arabic to Chinese to Hungarian to Welsh,
|
in part, into 31 languages. From Arabic to Chinese to Hungarian to Welsh,
|
||||||
|
|
|
@ -72,11 +72,11 @@ to raise an error message about modifying non-existent constraints.
|
||||||
|
|
||||||
If you need to work around this, there are two methods available:
|
If you need to work around this, there are two methods available:
|
||||||
|
|
||||||
1. Redirect the output of ``manage.py`` to a file, and edit the
|
1. Redirect the output of ``manage.py`` to a file, and edit the
|
||||||
generated SQL to use the correct constraint names before
|
generated SQL to use the correct constraint names before
|
||||||
executing it.
|
executing it.
|
||||||
|
|
||||||
2. Examine the output of ``manage.py sqlall`` to see the new-style
|
2. Examine the output of ``manage.py sqlall`` to see the new-style
|
||||||
constraint names, and use that as a guide to rename existing
|
constraint names, and use that as a guide to rename existing
|
||||||
constraints in your database.
|
constraints in your database.
|
||||||
|
|
||||||
|
@ -86,16 +86,16 @@ Name changes in ``manage.py``
|
||||||
A few of the options to ``manage.py`` have changed with the addition of fixture
|
A few of the options to ``manage.py`` have changed with the addition of fixture
|
||||||
support:
|
support:
|
||||||
|
|
||||||
* There are new ``dumpdata`` and ``loaddata`` commands which, as
|
* There are new ``dumpdata`` and ``loaddata`` commands which, as
|
||||||
you might expect, will dump and load data to/from the
|
you might expect, will dump and load data to/from the
|
||||||
database. These commands can operate against any of Django's
|
database. These commands can operate against any of Django's
|
||||||
supported serialization formats.
|
supported serialization formats.
|
||||||
|
|
||||||
* The ``sqlinitialdata`` command has been renamed to ``sqlcustom`` to
|
* The ``sqlinitialdata`` command has been renamed to ``sqlcustom`` to
|
||||||
emphasize that ``loaddata`` should be used for data (and ``sqlcustom`` for
|
emphasize that ``loaddata`` should be used for data (and ``sqlcustom`` for
|
||||||
other custom SQL -- views, stored procedures, etc.).
|
other custom SQL -- views, stored procedures, etc.).
|
||||||
|
|
||||||
* The vestigial ``install`` command has been removed. Use ``syncdb``.
|
* The vestigial ``install`` command has been removed. Use ``syncdb``.
|
||||||
|
|
||||||
Backslash escaping changed
|
Backslash escaping changed
|
||||||
--------------------------
|
--------------------------
|
||||||
|
@ -142,7 +142,7 @@ deprecate and remove the old system.
|
||||||
|
|
||||||
There are three elements to this transition:
|
There are three elements to this transition:
|
||||||
|
|
||||||
* We've copied the current ``django.forms`` to
|
* We've copied the current ``django.forms`` to
|
||||||
``django.oldforms``. This allows you to upgrade your code *now*
|
``django.oldforms``. This allows you to upgrade your code *now*
|
||||||
rather than waiting for the backwards-incompatible change and
|
rather than waiting for the backwards-incompatible change and
|
||||||
rushing to fix your code after the fact. Just change your
|
rushing to fix your code after the fact. Just change your
|
||||||
|
@ -151,13 +151,13 @@ There are three elements to this transition:
|
||||||
from django import forms # 0.95-style
|
from django import forms # 0.95-style
|
||||||
from django import oldforms as forms # 0.96-style
|
from django import oldforms as forms # 0.96-style
|
||||||
|
|
||||||
* The next official release of Django will move the current
|
* The next official release of Django will move the current
|
||||||
``django.newforms`` to ``django.forms``. This will be a
|
``django.newforms`` to ``django.forms``. This will be a
|
||||||
backwards-incompatible change, and anyone still using the old
|
backwards-incompatible change, and anyone still using the old
|
||||||
version of ``django.forms`` at that time will need to change
|
version of ``django.forms`` at that time will need to change
|
||||||
their import statements as described above.
|
their import statements as described above.
|
||||||
|
|
||||||
* The next release after that will completely remove
|
* The next release after that will completely remove
|
||||||
``django.oldforms``.
|
``django.oldforms``.
|
||||||
|
|
||||||
Although the ``newforms`` library will continue to evolve, it's ready for use
|
Although the ``newforms`` library will continue to evolve, it's ready for use
|
||||||
|
@ -242,19 +242,19 @@ Since 0.95, a number of people have stepped forward and taken a major
|
||||||
new role in Django's development. We'd like to thank these people for
|
new role in Django's development. We'd like to thank these people for
|
||||||
all their hard work:
|
all their hard work:
|
||||||
|
|
||||||
* Russell Keith-Magee and Malcolm Tredinnick for their major code
|
* Russell Keith-Magee and Malcolm Tredinnick for their major code
|
||||||
contributions. This release wouldn't have been possible without them.
|
contributions. This release wouldn't have been possible without them.
|
||||||
|
|
||||||
* Our new release manager, James Bennett, for his work in getting out
|
* Our new release manager, James Bennett, for his work in getting out
|
||||||
0.95.1, 0.96, and (hopefully) future release.
|
0.95.1, 0.96, and (hopefully) future release.
|
||||||
|
|
||||||
* Our ticket managers Chris Beaven (aka SmileyChris), Simon Greenhill,
|
* Our ticket managers Chris Beaven (aka SmileyChris), Simon Greenhill,
|
||||||
Michael Radziej, and Gary Wilson. They agreed to take on the monumental
|
Michael Radziej, and Gary Wilson. They agreed to take on the monumental
|
||||||
task of wrangling our tickets into nicely cataloged submission. Figuring
|
task of wrangling our tickets into nicely cataloged submission. Figuring
|
||||||
out what to work on is now about a million times easier; thanks again,
|
out what to work on is now about a million times easier; thanks again,
|
||||||
guys.
|
guys.
|
||||||
|
|
||||||
* Everyone who submitted a bug report, patch or ticket comment. We can't
|
* Everyone who submitted a bug report, patch or ticket comment. We can't
|
||||||
possibly thank everyone by name -- over 200 developers submitted patches
|
possibly thank everyone by name -- over 200 developers submitted patches
|
||||||
that went into 0.96 -- but everyone who's contributed to Django is listed
|
that went into 0.96 -- but everyone who's contributed to Django is listed
|
||||||
in AUTHORS_.
|
in AUTHORS_.
|
||||||
|
|
|
@ -562,15 +562,15 @@ following, replacing ``<app>`` in the code below with each app's name:
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
1. It's important that you remember to use XML format in the first step of
|
1. It's important that you remember to use XML format in the first step of
|
||||||
this process. We are exploiting a feature of the XML data dumps that makes
|
this process. We are exploiting a feature of the XML data dumps that makes
|
||||||
porting floats to decimals with SQLite possible.
|
porting floats to decimals with SQLite possible.
|
||||||
|
|
||||||
2. In the second step you will be asked to confirm that you are prepared to
|
2. In the second step you will be asked to confirm that you are prepared to
|
||||||
lose the data for the application(s) in question. Say yes; we'll restore
|
lose the data for the application(s) in question. Say yes; we'll restore
|
||||||
this data in the third step, of course.
|
this data in the third step, of course.
|
||||||
|
|
||||||
3. ``DecimalField`` is not used in any of the apps shipped with Django prior
|
3. ``DecimalField`` is not used in any of the apps shipped with Django prior
|
||||||
to this change being made, so you do not need to worry about performing
|
to this change being made, so you do not need to worry about performing
|
||||||
this procedure for any of the standard Django models.
|
this procedure for any of the standard Django models.
|
||||||
|
|
||||||
|
@ -717,10 +717,10 @@ a sequence of tuples.
|
||||||
|
|
||||||
To update your code:
|
To update your code:
|
||||||
|
|
||||||
1. Use :class:`django.utils.datastructures.SortedDict` wherever you were
|
1. Use :class:`django.utils.datastructures.SortedDict` wherever you were
|
||||||
using ``django.newforms.forms.SortedDictFromList``.
|
using ``django.newforms.forms.SortedDictFromList``.
|
||||||
|
|
||||||
2. Because :meth:`django.utils.datastructures.SortedDict.copy` doesn't
|
2. Because :meth:`django.utils.datastructures.SortedDict.copy` doesn't
|
||||||
return a deepcopy as ``SortedDictFromList.copy()`` did, you will need
|
return a deepcopy as ``SortedDictFromList.copy()`` did, you will need
|
||||||
to update your code if you were relying on a deepcopy. Do this by using
|
to update your code if you were relying on a deepcopy. Do this by using
|
||||||
``copy.deepcopy`` directly.
|
``copy.deepcopy`` directly.
|
||||||
|
|
|
@ -134,7 +134,7 @@ Django team by trying out the alpha codebase in a safe test environment and
|
||||||
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
||||||
central place to search for open issues:
|
central place to search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open new tickets if no existing ticket corresponds to a problem you're
|
Please open new tickets if no existing ticket corresponds to a problem you're
|
||||||
running into.
|
running into.
|
||||||
|
@ -142,7 +142,7 @@ running into.
|
||||||
Additionally, discussion of Django development, including progress toward the
|
Additionally, discussion of Django development, including progress toward the
|
||||||
1.1 release, takes place daily on the django-developers mailing list:
|
1.1 release, takes place daily on the django-developers mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -151,7 +151,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -104,11 +104,11 @@ Testing improvements
|
||||||
A couple of small but very useful improvements have been made to the
|
A couple of small but very useful improvements have been made to the
|
||||||
:doc:`testing framework </topics/testing>`:
|
:doc:`testing framework </topics/testing>`:
|
||||||
|
|
||||||
* The test :class:`Client` now can automatically follow redirects with the
|
* The test :class:`Client` now can automatically follow redirects with the
|
||||||
``follow`` argument to :meth:`Client.get` and :meth:`Client.post`. This
|
``follow`` argument to :meth:`Client.get` and :meth:`Client.post`. This
|
||||||
makes testing views that issue redirects simpler.
|
makes testing views that issue redirects simpler.
|
||||||
|
|
||||||
* It's now easier to get at the template context in the response returned
|
* It's now easier to get at the template context in the response returned
|
||||||
the test client: you'll simply access the context as
|
the test client: you'll simply access the context as
|
||||||
``request.context[key]``. The old way, which treats ``request.context``
|
``request.context[key]``. The old way, which treats ``request.context``
|
||||||
as a list of contexts, one for each rendered template, is still
|
as a list of contexts, one for each rendered template, is still
|
||||||
|
@ -129,27 +129,27 @@ Other improvements
|
||||||
Finally, a grab-bag of other neat features made their way into this beta
|
Finally, a grab-bag of other neat features made their way into this beta
|
||||||
release, including:
|
release, including:
|
||||||
|
|
||||||
* The :djadmin:`dumpdata` management command now accepts individual
|
* The :djadmin:`dumpdata` management command now accepts individual
|
||||||
model names as arguments, allowing you to export the data just from
|
model names as arguments, allowing you to export the data just from
|
||||||
particular models.
|
particular models.
|
||||||
|
|
||||||
* There's a new :tfilter:`safeseq` template filter which works just like
|
* There's a new :tfilter:`safeseq` template filter which works just like
|
||||||
:tfilter:`safe` for lists, marking each item in the list as safe.
|
:tfilter:`safe` for lists, marking each item in the list as safe.
|
||||||
|
|
||||||
* :doc:`Cache backends </topics/cache>` now support ``incr()`` and
|
* :doc:`Cache backends </topics/cache>` now support ``incr()`` and
|
||||||
``decr()`` commands to increment and decrement the value of a cache key.
|
``decr()`` commands to increment and decrement the value of a cache key.
|
||||||
On cache backends that support atomic increment/decrement -- most
|
On cache backends that support atomic increment/decrement -- most
|
||||||
notably, the memcached backend -- these operations will be atomic, and
|
notably, the memcached backend -- these operations will be atomic, and
|
||||||
quite fast.
|
quite fast.
|
||||||
|
|
||||||
* Django now can :doc:`easily delegate authentication to the Web server
|
* Django now can :doc:`easily delegate authentication to the Web server
|
||||||
</howto/auth-remote-user>` via a new authentication backend that supports
|
</howto/auth-remote-user>` via a new authentication backend that supports
|
||||||
the standard ``REMOTE_USER`` environment variable used for this purpose.
|
the standard ``REMOTE_USER`` environment variable used for this purpose.
|
||||||
|
|
||||||
* There's a new :func:`django.shortcuts.redirect` function that makes it
|
* There's a new :func:`django.shortcuts.redirect` function that makes it
|
||||||
easier to issue redirects given an object, a view name, or a URL.
|
easier to issue redirects given an object, a view name, or a URL.
|
||||||
|
|
||||||
* The ``postgresql_psycopg2`` backend now supports :ref:`native PostgreSQL
|
* The ``postgresql_psycopg2`` backend now supports :ref:`native PostgreSQL
|
||||||
autocommit <postgresql-notes>`. This is an advanced, PostgreSQL-specific
|
autocommit <postgresql-notes>`. This is an advanced, PostgreSQL-specific
|
||||||
feature, that can make certain read-heavy applications a good deal
|
feature, that can make certain read-heavy applications a good deal
|
||||||
faster.
|
faster.
|
||||||
|
@ -179,7 +179,7 @@ Django team by trying out the beta codebase in a safe test environment and
|
||||||
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
||||||
central place to search for open issues:
|
central place to search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open new tickets if no existing ticket corresponds to a problem you're
|
Please open new tickets if no existing ticket corresponds to a problem you're
|
||||||
running into.
|
running into.
|
||||||
|
@ -187,7 +187,7 @@ running into.
|
||||||
Additionally, discussion of Django development, including progress toward the
|
Additionally, discussion of Django development, including progress toward the
|
||||||
1.1 release, takes place daily on the django-developers mailing list:
|
1.1 release, takes place daily on the django-developers mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -196,7 +196,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -84,7 +84,7 @@ release candidate in a safe testing environment and reporting any bugs
|
||||||
or issues you encounter. The Django ticket tracker is the central
|
or issues you encounter. The Django ticket tracker is the central
|
||||||
place to search for open issues:
|
place to search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open a new ticket only if no existing ticket corresponds to a
|
Please open a new ticket only if no existing ticket corresponds to a
|
||||||
problem you're running into.
|
problem you're running into.
|
||||||
|
@ -93,7 +93,7 @@ Additionally, discussion of Django development, including progress
|
||||||
toward the 1.1 release, takes place daily on the django-developers
|
toward the 1.1 release, takes place daily on the django-developers
|
||||||
mailing list:
|
mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -102,7 +102,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -28,13 +28,13 @@ token's presence on form submission, and validates it.
|
||||||
Prior to Django 1.2.5, our CSRF protection made an exception for AJAX
|
Prior to Django 1.2.5, our CSRF protection made an exception for AJAX
|
||||||
requests, on the following basis:
|
requests, on the following basis:
|
||||||
|
|
||||||
* Many AJAX toolkits add an X-Requested-With header when using
|
* Many AJAX toolkits add an X-Requested-With header when using
|
||||||
XMLHttpRequest.
|
XMLHttpRequest.
|
||||||
|
|
||||||
* Browsers have strict same-origin policies regarding
|
* Browsers have strict same-origin policies regarding
|
||||||
XMLHttpRequest.
|
XMLHttpRequest.
|
||||||
|
|
||||||
* In the context of a browser, the only way that a custom header
|
* In the context of a browser, the only way that a custom header
|
||||||
of this nature can be added is with XMLHttpRequest.
|
of this nature can be added is with XMLHttpRequest.
|
||||||
|
|
||||||
Therefore, for ease of use, we did not apply CSRF checks to requests
|
Therefore, for ease of use, we did not apply CSRF checks to requests
|
||||||
|
|
|
@ -93,12 +93,12 @@ other than raise a ``DeprecationWarning``.
|
||||||
|
|
||||||
If you've been relying on this middleware, the easiest upgrade path is:
|
If you've been relying on this middleware, the easiest upgrade path is:
|
||||||
|
|
||||||
* Examine `the code as it existed before it was removed`__.
|
* Examine `the code as it existed before it was removed`__.
|
||||||
|
|
||||||
* Verify that it works correctly with your upstream proxy, modifying
|
* Verify that it works correctly with your upstream proxy, modifying
|
||||||
it to support your particular proxy (if necessary).
|
it to support your particular proxy (if necessary).
|
||||||
|
|
||||||
* Introduce your modified version of ``SetRemoteAddrFromForwardedFor`` as a
|
* Introduce your modified version of ``SetRemoteAddrFromForwardedFor`` as a
|
||||||
piece of middleware in your own project.
|
piece of middleware in your own project.
|
||||||
|
|
||||||
__ http://code.djangoproject.com/browser/django/trunk/django/middleware/http.py?rev=11000#L33
|
__ http://code.djangoproject.com/browser/django/trunk/django/middleware/http.py?rev=11000#L33
|
||||||
|
@ -157,7 +157,7 @@ Features deprecated in 1.1
|
||||||
|
|
||||||
One feature has been marked as deprecated in Django 1.1:
|
One feature has been marked as deprecated in Django 1.1:
|
||||||
|
|
||||||
* You should no longer use ``AdminSite.root()`` to register that admin
|
* You should no longer use ``AdminSite.root()`` to register that admin
|
||||||
views. That is, if your URLconf contains the line::
|
views. That is, if your URLconf contains the line::
|
||||||
|
|
||||||
(r'^admin/(.*)', admin.site.root),
|
(r'^admin/(.*)', admin.site.root),
|
||||||
|
@ -289,11 +289,11 @@ Test client improvements
|
||||||
A couple of small -- but highly useful -- improvements have been made to the
|
A couple of small -- but highly useful -- improvements have been made to the
|
||||||
test client:
|
test client:
|
||||||
|
|
||||||
* The test :class:`Client` now can automatically follow redirects with the
|
* The test :class:`Client` now can automatically follow redirects with the
|
||||||
``follow`` argument to :meth:`Client.get` and :meth:`Client.post`. This
|
``follow`` argument to :meth:`Client.get` and :meth:`Client.post`. This
|
||||||
makes testing views that issue redirects simpler.
|
makes testing views that issue redirects simpler.
|
||||||
|
|
||||||
* It's now easier to get at the template context in the response returned
|
* It's now easier to get at the template context in the response returned
|
||||||
the test client: you'll simply access the context as
|
the test client: you'll simply access the context as
|
||||||
``request.context[key]``. The old way, which treats ``request.context`` as
|
``request.context[key]``. The old way, which treats ``request.context`` as
|
||||||
a list of contexts, one for each rendered template in the inheritance
|
a list of contexts, one for each rendered template in the inheritance
|
||||||
|
@ -352,16 +352,16 @@ GeoDjango
|
||||||
In Django 1.1, GeoDjango_ (i.e. ``django.contrib.gis``) has several new
|
In Django 1.1, GeoDjango_ (i.e. ``django.contrib.gis``) has several new
|
||||||
features:
|
features:
|
||||||
|
|
||||||
* Support for SpatiaLite_ -- a spatial database for SQLite -- as a spatial
|
* Support for SpatiaLite_ -- a spatial database for SQLite -- as a spatial
|
||||||
backend.
|
backend.
|
||||||
|
|
||||||
* Geographic aggregates (``Collect``, ``Extent``, ``MakeLine``, ``Union``)
|
* Geographic aggregates (``Collect``, ``Extent``, ``MakeLine``, ``Union``)
|
||||||
and ``F`` expressions.
|
and ``F`` expressions.
|
||||||
|
|
||||||
* New ``GeoQuerySet`` methods: ``collect``, ``geojson``, and
|
* New ``GeoQuerySet`` methods: ``collect``, ``geojson``, and
|
||||||
``snap_to_grid``.
|
``snap_to_grid``.
|
||||||
|
|
||||||
* A new list interface methods for ``GEOSGeometry`` objects.
|
* A new list interface methods for ``GEOSGeometry`` objects.
|
||||||
|
|
||||||
For more details, see the `GeoDjango documentation`_.
|
For more details, see the `GeoDjango documentation`_.
|
||||||
|
|
||||||
|
@ -446,7 +446,7 @@ the weary! If you'd like to help, discussion of Django development, including
|
||||||
progress toward the 1.2 release, takes place daily on the django-developers
|
progress toward the 1.2 release, takes place daily on the django-developers
|
||||||
mailing list:
|
mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. Feel free to
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. Feel free to
|
||||||
join the discussions!
|
join the discussions!
|
||||||
|
@ -454,7 +454,7 @@ join the discussions!
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -26,11 +26,11 @@ There have been large changes to the way that CSRF protection works, detailed in
|
||||||
:doc:`the CSRF documentation </ref/contrib/csrf>`. The following are the major
|
:doc:`the CSRF documentation </ref/contrib/csrf>`. The following are the major
|
||||||
changes that developers must be aware of:
|
changes that developers must be aware of:
|
||||||
|
|
||||||
* ``CsrfResponseMiddleware`` and ``CsrfMiddleware`` have been deprecated, and
|
* ``CsrfResponseMiddleware`` and ``CsrfMiddleware`` have been deprecated, and
|
||||||
**will be removed completely in Django 1.4**, in favor of a template tag that
|
**will be removed completely in Django 1.4**, in favor of a template tag that
|
||||||
should be inserted into forms.
|
should be inserted into forms.
|
||||||
|
|
||||||
* All contrib apps use a ``csrf_protect`` decorator to protect the view. This
|
* All contrib apps use a ``csrf_protect`` decorator to protect the view. This
|
||||||
requires the use of the ``csrf_token`` template tag in the template, so if you
|
requires the use of the ``csrf_token`` template tag in the template, so if you
|
||||||
have used custom templates for contrib views, you MUST READ THE UPGRADE
|
have used custom templates for contrib views, you MUST READ THE UPGRADE
|
||||||
INSTRUCTIONS to fix those templates.
|
INSTRUCTIONS to fix those templates.
|
||||||
|
@ -40,12 +40,12 @@ changes that developers must be aware of:
|
||||||
The upgrade notes have been removed in current Django docs. Please refer
|
The upgrade notes have been removed in current Django docs. Please refer
|
||||||
to the docs for Django 1.3 or older to find these instructions.
|
to the docs for Django 1.3 or older to find these instructions.
|
||||||
|
|
||||||
* ``CsrfViewMiddleware`` is included in :setting:`MIDDLEWARE_CLASSES` by
|
* ``CsrfViewMiddleware`` is included in :setting:`MIDDLEWARE_CLASSES` by
|
||||||
default. This turns on CSRF protection by default, so that views that accept
|
default. This turns on CSRF protection by default, so that views that accept
|
||||||
POST requests need to be written to work with the middleware. Instructions
|
POST requests need to be written to work with the middleware. Instructions
|
||||||
on how to do this are found in the CSRF docs.
|
on how to do this are found in the CSRF docs.
|
||||||
|
|
||||||
* CSRF-related code has moved from ``contrib`` to ``core`` (with
|
* CSRF-related code has moved from ``contrib`` to ``core`` (with
|
||||||
backwards compatible imports in the old locations, which are
|
backwards compatible imports in the old locations, which are
|
||||||
deprecated).
|
deprecated).
|
||||||
|
|
||||||
|
@ -70,13 +70,13 @@ If you used ``LazyObject`` in your own code, and implemented the
|
||||||
``get_all_members()`` method for wrapped objects, you need to make the following
|
``get_all_members()`` method for wrapped objects, you need to make the following
|
||||||
changes:
|
changes:
|
||||||
|
|
||||||
* If your class does not have special requirements for introspection (i.e. you
|
* If your class does not have special requirements for introspection (i.e. you
|
||||||
have not implemented ``__getattr__()`` or other methods that allow for
|
have not implemented ``__getattr__()`` or other methods that allow for
|
||||||
attributes not discoverable by normal mechanisms), you can simply remove the
|
attributes not discoverable by normal mechanisms), you can simply remove the
|
||||||
``get_all_members()`` method. The default implementation on ``LazyObject``
|
``get_all_members()`` method. The default implementation on ``LazyObject``
|
||||||
will do the right thing.
|
will do the right thing.
|
||||||
|
|
||||||
* If you have more complex requirements for introspection, first rename the
|
* If you have more complex requirements for introspection, first rename the
|
||||||
``get_all_members()`` method to ``__dir__()``. This is the standard method,
|
``get_all_members()`` method to ``__dir__()``. This is the standard method,
|
||||||
from Python 2.6 onwards, for supporting introspection. If you are require
|
from Python 2.6 onwards, for supporting introspection. If you are require
|
||||||
support for Python < 2.6, add the following code to the class::
|
support for Python < 2.6, add the following code to the class::
|
||||||
|
@ -282,20 +282,20 @@ The sample settings given previously would now be stored using::
|
||||||
|
|
||||||
This affects the following settings:
|
This affects the following settings:
|
||||||
|
|
||||||
========================================= ==========================
|
========================================= ==========================
|
||||||
Old setting New Setting
|
Old setting New Setting
|
||||||
========================================= ==========================
|
========================================= ==========================
|
||||||
:setting:`DATABASE_ENGINE` :setting:`ENGINE`
|
:setting:`DATABASE_ENGINE` :setting:`ENGINE`
|
||||||
:setting:`DATABASE_HOST` :setting:`HOST`
|
:setting:`DATABASE_HOST` :setting:`HOST`
|
||||||
:setting:`DATABASE_NAME` :setting:`NAME`
|
:setting:`DATABASE_NAME` :setting:`NAME`
|
||||||
:setting:`DATABASE_OPTIONS` :setting:`OPTIONS`
|
:setting:`DATABASE_OPTIONS` :setting:`OPTIONS`
|
||||||
:setting:`DATABASE_PASSWORD` :setting:`PASSWORD`
|
:setting:`DATABASE_PASSWORD` :setting:`PASSWORD`
|
||||||
:setting:`DATABASE_PORT` :setting:`PORT`
|
:setting:`DATABASE_PORT` :setting:`PORT`
|
||||||
:setting:`DATABASE_USER` :setting:`USER`
|
:setting:`DATABASE_USER` :setting:`USER`
|
||||||
:setting:`TEST_DATABASE_CHARSET` :setting:`TEST_CHARSET`
|
:setting:`TEST_DATABASE_CHARSET` :setting:`TEST_CHARSET`
|
||||||
:setting:`TEST_DATABASE_COLLATION` :setting:`TEST_COLLATION`
|
:setting:`TEST_DATABASE_COLLATION` :setting:`TEST_COLLATION`
|
||||||
:setting:`TEST_DATABASE_NAME` :setting:`TEST_NAME`
|
:setting:`TEST_DATABASE_NAME` :setting:`TEST_NAME`
|
||||||
========================================= ==========================
|
========================================= ==========================
|
||||||
|
|
||||||
These changes are also required if you have manually created a database
|
These changes are also required if you have manually created a database
|
||||||
connection using ``DatabaseWrapper()`` from your database backend of choice.
|
connection using ``DatabaseWrapper()`` from your database backend of choice.
|
||||||
|
@ -367,9 +367,9 @@ or, when directly formatting a date value::
|
||||||
|
|
||||||
The same applies to the globals found in ``django.forms.fields``:
|
The same applies to the globals found in ``django.forms.fields``:
|
||||||
|
|
||||||
* ``DEFAULT_DATE_INPUT_FORMATS``
|
* ``DEFAULT_DATE_INPUT_FORMATS``
|
||||||
* ``DEFAULT_TIME_INPUT_FORMATS``
|
* ``DEFAULT_TIME_INPUT_FORMATS``
|
||||||
* ``DEFAULT_DATETIME_INPUT_FORMATS``
|
* ``DEFAULT_DATETIME_INPUT_FORMATS``
|
||||||
|
|
||||||
Use ``django.utils.formats.get_format()`` to get the appropriate formats.
|
Use ``django.utils.formats.get_format()`` to get the appropriate formats.
|
||||||
|
|
||||||
|
@ -559,7 +559,7 @@ Django team by trying out the alpha codebase in a safe test environment and
|
||||||
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
||||||
central place to search for open issues:
|
central place to search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open new tickets if no existing ticket corresponds to a problem you're
|
Please open new tickets if no existing ticket corresponds to a problem you're
|
||||||
running into.
|
running into.
|
||||||
|
@ -567,7 +567,7 @@ running into.
|
||||||
Additionally, discussion of Django development, including progress toward the
|
Additionally, discussion of Django development, including progress toward the
|
||||||
1.2 release, takes place daily on the django-developers mailing list:
|
1.2 release, takes place daily on the django-developers mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -576,7 +576,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -143,7 +143,7 @@ codebase in a safe test environment and reporting any bugs or issues
|
||||||
you encounter. The Django ticket tracker is the central place to
|
you encounter. The Django ticket tracker is the central place to
|
||||||
search for open issues:
|
search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open new tickets if no existing ticket corresponds to a problem
|
Please open new tickets if no existing ticket corresponds to a problem
|
||||||
you're running into.
|
you're running into.
|
||||||
|
@ -152,7 +152,7 @@ Additionally, discussion of Django development, including progress
|
||||||
toward the 1.2 release, takes place daily on the django-developers
|
toward the 1.2 release, takes place daily on the django-developers
|
||||||
mailing list:
|
mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -161,7 +161,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to
|
Django's online documentation also includes pointers on how to
|
||||||
contribute to Django:
|
contribute to Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation
|
Contributions on any level -- developing code, writing documentation
|
||||||
or simply triaging tickets and helping to test proposed bugfixes --
|
or simply triaging tickets and helping to test proposed bugfixes --
|
||||||
|
|
|
@ -76,7 +76,7 @@ release candidate in a safe testing environment and reporting any bugs
|
||||||
or issues you encounter. The Django ticket tracker is the central
|
or issues you encounter. The Django ticket tracker is the central
|
||||||
place to search for open issues:
|
place to search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open a new ticket only if no existing ticket corresponds to a
|
Please open a new ticket only if no existing ticket corresponds to a
|
||||||
problem you're running into.
|
problem you're running into.
|
||||||
|
@ -85,7 +85,7 @@ Additionally, discussion of Django development, including progress
|
||||||
toward the 1.2 release, takes place daily on the django-developers
|
toward the 1.2 release, takes place daily on the django-developers
|
||||||
mailing list:
|
mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -94,7 +94,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -28,13 +28,13 @@ token's presence on form submission, and validates it.
|
||||||
Prior to Django 1.2.5, our CSRF protection made an exception for AJAX
|
Prior to Django 1.2.5, our CSRF protection made an exception for AJAX
|
||||||
requests, on the following basis:
|
requests, on the following basis:
|
||||||
|
|
||||||
* Many AJAX toolkits add an X-Requested-With header when using
|
* Many AJAX toolkits add an X-Requested-With header when using
|
||||||
XMLHttpRequest.
|
XMLHttpRequest.
|
||||||
|
|
||||||
* Browsers have strict same-origin policies regarding
|
* Browsers have strict same-origin policies regarding
|
||||||
XMLHttpRequest.
|
XMLHttpRequest.
|
||||||
|
|
||||||
* In the context of a browser, the only way that a custom header
|
* In the context of a browser, the only way that a custom header
|
||||||
of this nature can be added is with XMLHttpRequest.
|
of this nature can be added is with XMLHttpRequest.
|
||||||
|
|
||||||
Therefore, for ease of use, we did not apply CSRF checks to requests
|
Therefore, for ease of use, we did not apply CSRF checks to requests
|
||||||
|
|
|
@ -18,21 +18,21 @@ Overview
|
||||||
|
|
||||||
Django 1.2 introduces several large, important new features, including:
|
Django 1.2 introduces several large, important new features, including:
|
||||||
|
|
||||||
* Support for `multiple database connections`_ in a single Django instance.
|
* Support for `multiple database connections`_ in a single Django instance.
|
||||||
|
|
||||||
* `Model validation`_ inspired by Django's form validation.
|
* `Model validation`_ inspired by Django's form validation.
|
||||||
|
|
||||||
* Vastly `improved protection against Cross-Site Request Forgery`_ (CSRF).
|
* Vastly `improved protection against Cross-Site Request Forgery`_ (CSRF).
|
||||||
|
|
||||||
* A new `user "messages" framework`_ with support for cookie- and session-based
|
* A new `user "messages" framework`_ with support for cookie- and session-based
|
||||||
message for both anonymous and authenticated users.
|
message for both anonymous and authenticated users.
|
||||||
|
|
||||||
* Hooks for `object-level permissions`_, `permissions for anonymous users`_,
|
* Hooks for `object-level permissions`_, `permissions for anonymous users`_,
|
||||||
and `more flexible username requirements`_.
|
and `more flexible username requirements`_.
|
||||||
|
|
||||||
* Customization of email sending via `email backends`_.
|
* Customization of email sending via `email backends`_.
|
||||||
|
|
||||||
* New :ref:`"smart" if template tag <new-in-1.2-smart-if>` which supports
|
* New :ref:`"smart" if template tag <new-in-1.2-smart-if>` which supports
|
||||||
comparison operators.
|
comparison operators.
|
||||||
|
|
||||||
.. _multiple database connections: `support for multiple databases`_
|
.. _multiple database connections: `support for multiple databases`_
|
||||||
|
@ -58,10 +58,10 @@ manner per :doc:`our API stability policy </misc/api-stability>` policy.
|
||||||
However, a handful of features *have* changed in ways that, for some users, will be
|
However, a handful of features *have* changed in ways that, for some users, will be
|
||||||
backwards-incompatible. The big changes are:
|
backwards-incompatible. The big changes are:
|
||||||
|
|
||||||
* Support for Python 2.3 has been dropped. See the full notes
|
* Support for Python 2.3 has been dropped. See the full notes
|
||||||
below.
|
below.
|
||||||
|
|
||||||
* The new CSRF protection framework is not backwards-compatible with
|
* The new CSRF protection framework is not backwards-compatible with
|
||||||
the old system. Users of the old system will not be affected until
|
the old system. Users of the old system will not be affected until
|
||||||
the old system is removed in Django 1.4.
|
the old system is removed in Django 1.4.
|
||||||
|
|
||||||
|
@ -69,16 +69,16 @@ backwards-incompatible. The big changes are:
|
||||||
important backwards-incompatible changes, detailed in `CSRF Protection`_,
|
important backwards-incompatible changes, detailed in `CSRF Protection`_,
|
||||||
below.
|
below.
|
||||||
|
|
||||||
* Authors of custom :class:`~django.db.models.Field` subclasses should be
|
* Authors of custom :class:`~django.db.models.Field` subclasses should be
|
||||||
aware that a number of methods have had a change in prototype, detailed
|
aware that a number of methods have had a change in prototype, detailed
|
||||||
under `get_db_prep_*() methods on Field`_, below.
|
under `get_db_prep_*() methods on Field`_, below.
|
||||||
|
|
||||||
* The internals of template tags have changed somewhat; authors of custom
|
* The internals of template tags have changed somewhat; authors of custom
|
||||||
template tags that need to store state (e.g. custom control flow tags)
|
template tags that need to store state (e.g. custom control flow tags)
|
||||||
should ensure that their code follows the new rules for `stateful template
|
should ensure that their code follows the new rules for `stateful template
|
||||||
tags`_
|
tags`_
|
||||||
|
|
||||||
* The :func:`~django.contrib.auth.decorators.user_passes_test`,
|
* The :func:`~django.contrib.auth.decorators.user_passes_test`,
|
||||||
:func:`~django.contrib.auth.decorators.login_required`, and
|
:func:`~django.contrib.auth.decorators.login_required`, and
|
||||||
:func:`~django.contrib.auth.decorators.permission_required`, decorators
|
:func:`~django.contrib.auth.decorators.permission_required`, decorators
|
||||||
from :mod:`django.contrib.auth` only apply to functions and no longer
|
from :mod:`django.contrib.auth` only apply to functions and no longer
|
||||||
|
@ -429,11 +429,11 @@ We've made large changes to the way CSRF protection works, detailed in
|
||||||
:doc:`the CSRF documentation </ref/contrib/csrf>`. Here are the major changes you
|
:doc:`the CSRF documentation </ref/contrib/csrf>`. Here are the major changes you
|
||||||
should be aware of:
|
should be aware of:
|
||||||
|
|
||||||
* ``CsrfResponseMiddleware`` and ``CsrfMiddleware`` have been deprecated and
|
* ``CsrfResponseMiddleware`` and ``CsrfMiddleware`` have been deprecated and
|
||||||
will be removed completely in Django 1.4, in favor of a template tag that
|
will be removed completely in Django 1.4, in favor of a template tag that
|
||||||
should be inserted into forms.
|
should be inserted into forms.
|
||||||
|
|
||||||
* All contrib apps use a ``csrf_protect`` decorator to protect the view. This
|
* All contrib apps use a ``csrf_protect`` decorator to protect the view. This
|
||||||
requires the use of the ``csrf_token`` template tag in the template. If you
|
requires the use of the ``csrf_token`` template tag in the template. If you
|
||||||
have used custom templates for contrib views, you MUST READ THE UPGRADE
|
have used custom templates for contrib views, you MUST READ THE UPGRADE
|
||||||
INSTRUCTIONS to fix those templates.
|
INSTRUCTIONS to fix those templates.
|
||||||
|
@ -443,12 +443,12 @@ should be aware of:
|
||||||
The upgrade notes have been removed in current Django docs. Please refer
|
The upgrade notes have been removed in current Django docs. Please refer
|
||||||
to the docs for Django 1.3 or older to find these instructions.
|
to the docs for Django 1.3 or older to find these instructions.
|
||||||
|
|
||||||
* ``CsrfViewMiddleware`` is included in :setting:`MIDDLEWARE_CLASSES` by
|
* ``CsrfViewMiddleware`` is included in :setting:`MIDDLEWARE_CLASSES` by
|
||||||
default. This turns on CSRF protection by default, so views that accept
|
default. This turns on CSRF protection by default, so views that accept
|
||||||
POST requests need to be written to work with the middleware. Instructions
|
POST requests need to be written to work with the middleware. Instructions
|
||||||
on how to do this are found in the CSRF docs.
|
on how to do this are found in the CSRF docs.
|
||||||
|
|
||||||
* All of the CSRF has moved from contrib to core (with backwards
|
* All of the CSRF has moved from contrib to core (with backwards
|
||||||
compatible imports in the old locations, which are deprecated and
|
compatible imports in the old locations, which are deprecated and
|
||||||
will cease to be supported in Django 1.4).
|
will cease to be supported in Django 1.4).
|
||||||
|
|
||||||
|
@ -816,20 +816,20 @@ shortened. The previous sample settings would now look like this::
|
||||||
|
|
||||||
This affects the following settings:
|
This affects the following settings:
|
||||||
|
|
||||||
========================================= ==========================
|
========================================= ==========================
|
||||||
Old setting New Setting
|
Old setting New Setting
|
||||||
========================================= ==========================
|
========================================= ==========================
|
||||||
:setting:`DATABASE_ENGINE` :setting:`ENGINE`
|
:setting:`DATABASE_ENGINE` :setting:`ENGINE`
|
||||||
:setting:`DATABASE_HOST` :setting:`HOST`
|
:setting:`DATABASE_HOST` :setting:`HOST`
|
||||||
:setting:`DATABASE_NAME` :setting:`NAME`
|
:setting:`DATABASE_NAME` :setting:`NAME`
|
||||||
:setting:`DATABASE_OPTIONS` :setting:`OPTIONS`
|
:setting:`DATABASE_OPTIONS` :setting:`OPTIONS`
|
||||||
:setting:`DATABASE_PASSWORD` :setting:`PASSWORD`
|
:setting:`DATABASE_PASSWORD` :setting:`PASSWORD`
|
||||||
:setting:`DATABASE_PORT` :setting:`PORT`
|
:setting:`DATABASE_PORT` :setting:`PORT`
|
||||||
:setting:`DATABASE_USER` :setting:`USER`
|
:setting:`DATABASE_USER` :setting:`USER`
|
||||||
:setting:`TEST_DATABASE_CHARSET` :setting:`TEST_CHARSET`
|
:setting:`TEST_DATABASE_CHARSET` :setting:`TEST_CHARSET`
|
||||||
:setting:`TEST_DATABASE_COLLATION` :setting:`TEST_COLLATION`
|
:setting:`TEST_DATABASE_COLLATION` :setting:`TEST_COLLATION`
|
||||||
:setting:`TEST_DATABASE_NAME` :setting:`TEST_NAME`
|
:setting:`TEST_DATABASE_NAME` :setting:`TEST_NAME`
|
||||||
========================================= ==========================
|
========================================= ==========================
|
||||||
|
|
||||||
These changes are also required if you have manually created a database
|
These changes are also required if you have manually created a database
|
||||||
connection using ``DatabaseWrapper()`` from your database backend of choice.
|
connection using ``DatabaseWrapper()`` from your database backend of choice.
|
||||||
|
@ -967,9 +967,9 @@ Or, when directly formatting a date value::
|
||||||
|
|
||||||
The same applies to the globals found in ``django.forms.fields``:
|
The same applies to the globals found in ``django.forms.fields``:
|
||||||
|
|
||||||
* ``DEFAULT_DATE_INPUT_FORMATS``
|
* ``DEFAULT_DATE_INPUT_FORMATS``
|
||||||
* ``DEFAULT_TIME_INPUT_FORMATS``
|
* ``DEFAULT_TIME_INPUT_FORMATS``
|
||||||
* ``DEFAULT_DATETIME_INPUT_FORMATS``
|
* ``DEFAULT_DATETIME_INPUT_FORMATS``
|
||||||
|
|
||||||
Use ``django.utils.formats.get_format()`` to get the appropriate formats.
|
Use ``django.utils.formats.get_format()`` to get the appropriate formats.
|
||||||
|
|
||||||
|
|
|
@ -150,13 +150,13 @@ To compensate for this, the focus of the Django 1.3 development
|
||||||
process has been on adding lots of smaller, long standing feature
|
process has been on adding lots of smaller, long standing feature
|
||||||
requests. These include:
|
requests. These include:
|
||||||
|
|
||||||
* Improved tools for accessing and manipulating the current Site via
|
* Improved tools for accessing and manipulating the current Site via
|
||||||
:func:`django.contrib.sites.models.get_current_site`.
|
:func:`django.contrib.sites.models.get_current_site`.
|
||||||
|
|
||||||
* A :class:`~django.test.client.RequestFactory` for mocking
|
* A :class:`~django.test.client.RequestFactory` for mocking
|
||||||
requests in tests.
|
requests in tests.
|
||||||
|
|
||||||
* A new test assertion --
|
* A new test assertion --
|
||||||
:meth:`~django.test.client.Client.assertNumQueries` -- making it
|
:meth:`~django.test.client.Client.assertNumQueries` -- making it
|
||||||
easier to test the database activity associated with a view.
|
easier to test the database activity associated with a view.
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ Localflavor changes
|
||||||
Django 1.3 introduces the following backwards-incompatible changes to
|
Django 1.3 introduces the following backwards-incompatible changes to
|
||||||
local flavors:
|
local flavors:
|
||||||
|
|
||||||
* Indonesia (id) -- The province "Nanggroe Aceh Darussalam (NAD)"
|
* Indonesia (id) -- The province "Nanggroe Aceh Darussalam (NAD)"
|
||||||
has been removed from the province list in favor of the new
|
has been removed from the province list in favor of the new
|
||||||
official designation "Aceh (ACE)".
|
official designation "Aceh (ACE)".
|
||||||
|
|
||||||
|
@ -312,10 +312,10 @@ As a result of the introduction of class-based generic views, the
|
||||||
function-based generic views provided by Django have been deprecated.
|
function-based generic views provided by Django have been deprecated.
|
||||||
The following modules and the views they contain have been deprecated:
|
The following modules and the views they contain have been deprecated:
|
||||||
|
|
||||||
* :mod:`django.views.generic.create_update`
|
* :mod:`django.views.generic.create_update`
|
||||||
* :mod:`django.views.generic.date_based`
|
* :mod:`django.views.generic.date_based`
|
||||||
* :mod:`django.views.generic.list_detail`
|
* :mod:`django.views.generic.list_detail`
|
||||||
* :mod:`django.views.generic.simple`
|
* :mod:`django.views.generic.simple`
|
||||||
|
|
||||||
Test client response ``template`` attribute
|
Test client response ``template`` attribute
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -373,7 +373,7 @@ Django team by trying out the alpha codebase in a safe test environment and
|
||||||
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
||||||
central place to search for open issues:
|
central place to search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open new tickets if no existing ticket corresponds to a problem you're
|
Please open new tickets if no existing ticket corresponds to a problem you're
|
||||||
running into.
|
running into.
|
||||||
|
@ -381,7 +381,7 @@ running into.
|
||||||
Additionally, discussion of Django development, including progress toward the
|
Additionally, discussion of Django development, including progress toward the
|
||||||
1.3 release, takes place daily on the django-developers mailing list:
|
1.3 release, takes place daily on the django-developers mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -390,7 +390,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -29,10 +29,10 @@ setting is ``True``) when using the :djadmin:`runserver` management command.
|
||||||
Based on feedback from the community this release adds two new options to the
|
Based on feedback from the community this release adds two new options to the
|
||||||
:djadmin:`runserver` command to modify this behavior:
|
:djadmin:`runserver` command to modify this behavior:
|
||||||
|
|
||||||
* ``--nostatic``: prevents the :djadmin:`runserver` command from serving
|
* ``--nostatic``: prevents the :djadmin:`runserver` command from serving
|
||||||
files completely.
|
files completely.
|
||||||
|
|
||||||
* ``--insecure``: enables serving of static files even if running with
|
* ``--insecure``: enables serving of static files even if running with
|
||||||
:setting:`DEBUG` set to False. (This is **not** recommended!)
|
:setting:`DEBUG` set to False. (This is **not** recommended!)
|
||||||
|
|
||||||
See the :doc:`staticfiles reference documentation </ref/contrib/staticfiles>`
|
See the :doc:`staticfiles reference documentation </ref/contrib/staticfiles>`
|
||||||
|
@ -100,25 +100,25 @@ desired outside the use of the optional :mod:`~django.contrib.staticfiles` app.
|
||||||
|
|
||||||
As a result, we took the following steps to rectify the issue:
|
As a result, we took the following steps to rectify the issue:
|
||||||
|
|
||||||
* Two new global settings were added that will be used by, **but are not
|
* Two new global settings were added that will be used by, **but are not
|
||||||
limited to**, the :doc:`staticfiles</ref/contrib/staticfiles>` app:
|
limited to**, the :doc:`staticfiles</ref/contrib/staticfiles>` app:
|
||||||
|
|
||||||
* :setting:`STATIC_ROOT` (formally ``STATICFILES_ROOT``)
|
* :setting:`STATIC_ROOT` (formally ``STATICFILES_ROOT``)
|
||||||
|
|
||||||
* :setting:`STATIC_URL` (formally ``STATICFILES_URL``)
|
* :setting:`STATIC_URL` (formally ``STATICFILES_URL``)
|
||||||
|
|
||||||
* The ``django.contrib.staticfiles.templatetags.staticfiles.get_staticfiles_prefix``
|
* The ``django.contrib.staticfiles.templatetags.staticfiles.get_staticfiles_prefix``
|
||||||
template tag was moved to Django's core (``django.templatetags.static``) and
|
template tag was moved to Django's core (``django.templatetags.static``) and
|
||||||
renamed to :ttag:`get_static_prefix`.
|
renamed to :ttag:`get_static_prefix`.
|
||||||
|
|
||||||
* The ``django.contrib.staticfiles.context_processors.staticfiles``
|
* The ``django.contrib.staticfiles.context_processors.staticfiles``
|
||||||
context processor was moved to Django's core
|
context processor was moved to Django's core
|
||||||
(``django.core.context_processors.static``) and renamed to
|
(``django.core.context_processors.static``) and renamed to
|
||||||
:func:`~django.core.context_processors.static`.
|
:func:`~django.core.context_processors.static`.
|
||||||
|
|
||||||
* :ref:`form-media-paths` now uses :setting:`STATIC_URL` as the prefix
|
* :ref:`form-media-paths` now uses :setting:`STATIC_URL` as the prefix
|
||||||
**if the value is not None**, and falls back to the previously used
|
**if the value is not None**, and falls back to the previously used
|
||||||
:setting:`MEDIA_URL` setting otherwise.
|
:setting:`MEDIA_URL` setting otherwise.
|
||||||
|
|
||||||
Changes to the login methods of the admin
|
Changes to the login methods of the admin
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -209,7 +209,7 @@ Django team by trying out the beta codebase in a safe test environment and
|
||||||
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
reporting any bugs or issues you encounter. The Django ticket tracker is the
|
||||||
central place to search for open issues:
|
central place to search for open issues:
|
||||||
|
|
||||||
* http://code.djangoproject.com/timeline
|
* http://code.djangoproject.com/timeline
|
||||||
|
|
||||||
Please open new tickets if no existing ticket corresponds to a problem you're
|
Please open new tickets if no existing ticket corresponds to a problem you're
|
||||||
running into.
|
running into.
|
||||||
|
@ -217,7 +217,7 @@ running into.
|
||||||
Additionally, discussion of Django development, including progress toward the
|
Additionally, discussion of Django development, including progress toward the
|
||||||
1.3 release, takes place daily on the django-developers mailing list:
|
1.3 release, takes place daily on the django-developers mailing list:
|
||||||
|
|
||||||
* http://groups.google.com/group/django-developers
|
* http://groups.google.com/group/django-developers
|
||||||
|
|
||||||
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
... and in the ``#django-dev`` IRC channel on ``irc.freenode.net``. If you're
|
||||||
interested in helping out with Django's development, feel free to join the
|
interested in helping out with Django's development, feel free to join the
|
||||||
|
@ -226,7 +226,7 @@ discussions there.
|
||||||
Django's online documentation also includes pointers on how to contribute to
|
Django's online documentation also includes pointers on how to contribute to
|
||||||
Django:
|
Django:
|
||||||
|
|
||||||
* :doc:`How to contribute to Django </internals/contributing/index>`
|
* :doc:`How to contribute to Django </internals/contributing/index>`
|
||||||
|
|
||||||
Contributions on any level -- developing code, writing documentation or simply
|
Contributions on any level -- developing code, writing documentation or simply
|
||||||
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
triaging tickets and helping to test proposed bugfixes -- are always welcome and
|
||||||
|
|
|
@ -188,16 +188,16 @@ Improvements to built-in template tags
|
||||||
|
|
||||||
A number of improvements have been made to Django's built-in template tags:
|
A number of improvements have been made to Django's built-in template tags:
|
||||||
|
|
||||||
* The :ttag:`include` tag now accepts a ``with`` option, allowing
|
* The :ttag:`include` tag now accepts a ``with`` option, allowing
|
||||||
you to specify context variables to the included template
|
you to specify context variables to the included template
|
||||||
|
|
||||||
* The :ttag:`include` tag now accepts an ``only`` option, allowing
|
* The :ttag:`include` tag now accepts an ``only`` option, allowing
|
||||||
you to exclude the current context from the included context
|
you to exclude the current context from the included context
|
||||||
|
|
||||||
* The :ttag:`with` tag now allows you to define multiple context
|
* The :ttag:`with` tag now allows you to define multiple context
|
||||||
variables in a single :ttag:`with` block.
|
variables in a single :ttag:`with` block.
|
||||||
|
|
||||||
* The :ttag:`load` tag now accepts a ``from`` argument, allowing
|
* The :ttag:`load` tag now accepts a ``from`` argument, allowing
|
||||||
you to load a single tag or filter from a library.
|
you to load a single tag or filter from a library.
|
||||||
|
|
||||||
TemplateResponse
|
TemplateResponse
|
||||||
|
@ -573,20 +573,20 @@ found on disk, namely:
|
||||||
For translatable literals found in Python code and templates (``'django'``
|
For translatable literals found in Python code and templates (``'django'``
|
||||||
gettext domain):
|
gettext domain):
|
||||||
|
|
||||||
* Priorities of translations included with applications listed in the
|
* Priorities of translations included with applications listed in the
|
||||||
:setting:`INSTALLED_APPS` setting were changed. To provide a behavior
|
:setting:`INSTALLED_APPS` setting were changed. To provide a behavior
|
||||||
consistent with other parts of Django that also use such setting (templates,
|
consistent with other parts of Django that also use such setting (templates,
|
||||||
etc.) now, when building the translation that will be made available, the
|
etc.) now, when building the translation that will be made available, the
|
||||||
apps listed first have higher precedence than the ones listed later.
|
apps listed first have higher precedence than the ones listed later.
|
||||||
|
|
||||||
* Now it is possible to override the translations shipped with applications by
|
* Now it is possible to override the translations shipped with applications by
|
||||||
using the :setting:`LOCALE_PATHS` setting whose translations have now higher
|
using the :setting:`LOCALE_PATHS` setting whose translations have now higher
|
||||||
precedence than the translations of :setting:`INSTALLED_APPS` applications.
|
precedence than the translations of :setting:`INSTALLED_APPS` applications.
|
||||||
The relative priority among the values listed in this setting has also been
|
The relative priority among the values listed in this setting has also been
|
||||||
modified so the paths listed first have higher precedence than the
|
modified so the paths listed first have higher precedence than the
|
||||||
ones listed later.
|
ones listed later.
|
||||||
|
|
||||||
* The ``locale`` subdirectory of the directory containing the settings, that
|
* The ``locale`` subdirectory of the directory containing the settings, that
|
||||||
usually coincides with and is know as the *project directory* is being
|
usually coincides with and is know as the *project directory* is being
|
||||||
deprecated in this release as a source of translations. (the precedence of
|
deprecated in this release as a source of translations. (the precedence of
|
||||||
these translations is intermediate between applications and :setting:`LOCALE_PATHS`
|
these translations is intermediate between applications and :setting:`LOCALE_PATHS`
|
||||||
|
@ -596,14 +596,14 @@ gettext domain):
|
||||||
For translatable literals found in Javascript code (``'djangojs'`` gettext
|
For translatable literals found in Javascript code (``'djangojs'`` gettext
|
||||||
domain):
|
domain):
|
||||||
|
|
||||||
* Similarly to the ``'django'`` domain translations: Overriding of
|
* Similarly to the ``'django'`` domain translations: Overriding of
|
||||||
translations shipped with applications by using the :setting:`LOCALE_PATHS`
|
translations shipped with applications by using the :setting:`LOCALE_PATHS`
|
||||||
setting is now possible for this domain too. These translations have higher
|
setting is now possible for this domain too. These translations have higher
|
||||||
precedence than the translations of Python packages passed to the
|
precedence than the translations of Python packages passed to the
|
||||||
:ref:`javascript_catalog view <javascript_catalog-view>`. Paths listed first
|
:ref:`javascript_catalog view <javascript_catalog-view>`. Paths listed first
|
||||||
have higher precedence than the ones listed later.
|
have higher precedence than the ones listed later.
|
||||||
|
|
||||||
* Translations under the ``locale`` subdirectory of the *project directory*
|
* Translations under the ``locale`` subdirectory of the *project directory*
|
||||||
have never been taken in account for JavaScript translations and remain in
|
have never been taken in account for JavaScript translations and remain in
|
||||||
the same situation considering the deprecation of such location.
|
the same situation considering the deprecation of such location.
|
||||||
|
|
||||||
|
|
|
@ -94,12 +94,12 @@ two most common are `python-memcached`_ and `pylibmc`_.
|
||||||
|
|
||||||
To use Memcached with Django:
|
To use Memcached with Django:
|
||||||
|
|
||||||
* Set :setting:`BACKEND <CACHES-BACKEND>` to
|
* Set :setting:`BACKEND <CACHES-BACKEND>` to
|
||||||
``django.core.cache.backends.memcached.MemcachedCache`` or
|
``django.core.cache.backends.memcached.MemcachedCache`` or
|
||||||
``django.core.cache.backends.memcached.PyLibMCCache`` (depending
|
``django.core.cache.backends.memcached.PyLibMCCache`` (depending
|
||||||
on your chosen memcached binding)
|
on your chosen memcached binding)
|
||||||
|
|
||||||
* Set :setting:`LOCATION <CACHES-LOCATION>` to ``ip:port`` values,
|
* Set :setting:`LOCATION <CACHES-LOCATION>` to ``ip:port`` values,
|
||||||
where ``ip`` is the IP address of the Memcached daemon and ``port`` is the
|
where ``ip`` is the IP address of the Memcached daemon and ``port`` is the
|
||||||
port on which Memcached is running, or to a ``unix:path`` value, where
|
port on which Memcached is running, or to a ``unix:path`` value, where
|
||||||
``path`` is the path to a Memcached Unix socket file.
|
``path`` is the path to a Memcached Unix socket file.
|
||||||
|
@ -358,11 +358,11 @@ backend, each cache backend can be given additional arguments to
|
||||||
control caching behavior. These arguments are provided as additional
|
control caching behavior. These arguments are provided as additional
|
||||||
keys in the :setting:`CACHES` setting. Valid arguments are as follows:
|
keys in the :setting:`CACHES` setting. Valid arguments are as follows:
|
||||||
|
|
||||||
* :setting:`TIMEOUT <CACHES-TIMEOUT>`: The default timeout, in
|
* :setting:`TIMEOUT <CACHES-TIMEOUT>`: The default timeout, in
|
||||||
seconds, to use for the cache. This argument defaults to 300
|
seconds, to use for the cache. This argument defaults to 300
|
||||||
seconds (5 minutes).
|
seconds (5 minutes).
|
||||||
|
|
||||||
* :setting:`OPTIONS <CACHES-OPTIONS>`: Any options that should be
|
* :setting:`OPTIONS <CACHES-OPTIONS>`: Any options that should be
|
||||||
passed to cache backend. The list options understood by each
|
passed to cache backend. The list options understood by each
|
||||||
backend vary with each backend.
|
backend vary with each backend.
|
||||||
|
|
||||||
|
@ -388,20 +388,20 @@ keys in the :setting:`CACHES` setting. Valid arguments are as follows:
|
||||||
options directly to the underlying cache library. As a result,
|
options directly to the underlying cache library. As a result,
|
||||||
the list of valid options depends on the library in use.
|
the list of valid options depends on the library in use.
|
||||||
|
|
||||||
* :setting:`KEY_PREFIX <CACHES-KEY_PREFIX>`: A string that will be
|
* :setting:`KEY_PREFIX <CACHES-KEY_PREFIX>`: A string that will be
|
||||||
automatically included (prepended by default) to all cache keys
|
automatically included (prepended by default) to all cache keys
|
||||||
used by the Django server.
|
used by the Django server.
|
||||||
|
|
||||||
See the :ref:`cache documentation <cache_key_prefixing>` for
|
See the :ref:`cache documentation <cache_key_prefixing>` for
|
||||||
more information.
|
more information.
|
||||||
|
|
||||||
* :setting:`VERSION <CACHES-VERSION>`: The default version number
|
* :setting:`VERSION <CACHES-VERSION>`: The default version number
|
||||||
for cache keys generated by the Django server.
|
for cache keys generated by the Django server.
|
||||||
|
|
||||||
See the :ref:`cache documentation <cache_versioning>` for more
|
See the :ref:`cache documentation <cache_versioning>` for more
|
||||||
information.
|
information.
|
||||||
|
|
||||||
* :setting:`KEY_FUNCTION <CACHES-KEY_FUNCTION>`
|
* :setting:`KEY_FUNCTION <CACHES-KEY_FUNCTION>`
|
||||||
A string containing a dotted path to a function that defines how
|
A string containing a dotted path to a function that defines how
|
||||||
to compose a prefix, version and key into a final cache key.
|
to compose a prefix, version and key into a final cache key.
|
||||||
|
|
||||||
|
@ -470,13 +470,13 @@ response for HEAD request.
|
||||||
Additionally, the cache middleware automatically sets a few headers in each
|
Additionally, the cache middleware automatically sets a few headers in each
|
||||||
:class:`~django.http.HttpResponse`:
|
:class:`~django.http.HttpResponse`:
|
||||||
|
|
||||||
* Sets the ``Last-Modified`` header to the current date/time when a fresh
|
* Sets the ``Last-Modified`` header to the current date/time when a fresh
|
||||||
(uncached) version of the page is requested.
|
(uncached) version of the page is requested.
|
||||||
|
|
||||||
* Sets the ``Expires`` header to the current date/time plus the defined
|
* Sets the ``Expires`` header to the current date/time plus the defined
|
||||||
:setting:`CACHE_MIDDLEWARE_SECONDS`.
|
:setting:`CACHE_MIDDLEWARE_SECONDS`.
|
||||||
|
|
||||||
* Sets the ``Cache-Control`` header to give a max age for the page --
|
* Sets the ``Cache-Control`` header to give a max age for the page --
|
||||||
again, from the :setting:`CACHE_MIDDLEWARE_SECONDS` setting.
|
again, from the :setting:`CACHE_MIDDLEWARE_SECONDS` setting.
|
||||||
|
|
||||||
See :doc:`/topics/http/middleware` for more on middleware.
|
See :doc:`/topics/http/middleware` for more on middleware.
|
||||||
|
@ -932,18 +932,18 @@ reaches your Web site.
|
||||||
|
|
||||||
Here are a few examples of upstream caches:
|
Here are a few examples of upstream caches:
|
||||||
|
|
||||||
* Your ISP may cache certain pages, so if you requested a page from
|
* Your ISP may cache certain pages, so if you requested a page from
|
||||||
http://example.com/, your ISP would send you the page without having to
|
http://example.com/, your ISP would send you the page without having to
|
||||||
access example.com directly. The maintainers of example.com have no
|
access example.com directly. The maintainers of example.com have no
|
||||||
knowledge of this caching; the ISP sits between example.com and your Web
|
knowledge of this caching; the ISP sits between example.com and your Web
|
||||||
browser, handling all of the caching transparently.
|
browser, handling all of the caching transparently.
|
||||||
|
|
||||||
* Your Django Web site may sit behind a *proxy cache*, such as Squid Web
|
* Your Django Web site may sit behind a *proxy cache*, such as Squid Web
|
||||||
Proxy Cache (http://www.squid-cache.org/), that caches pages for
|
Proxy Cache (http://www.squid-cache.org/), that caches pages for
|
||||||
performance. In this case, each request first would be handled by the
|
performance. In this case, each request first would be handled by the
|
||||||
proxy, and it would be passed to your application only if needed.
|
proxy, and it would be passed to your application only if needed.
|
||||||
|
|
||||||
* Your Web browser caches pages, too. If a Web page sends out the
|
* Your Web browser caches pages, too. If a Web page sends out the
|
||||||
appropriate headers, your browser will use the local cached copy for
|
appropriate headers, your browser will use the local cached copy for
|
||||||
subsequent requests to that page, without even contacting the Web page
|
subsequent requests to that page, without even contacting the Web page
|
||||||
again to see whether it has changed.
|
again to see whether it has changed.
|
||||||
|
@ -1099,9 +1099,9 @@ entries may be cached on any shared cache. The following code uses
|
||||||
There are a few other ways to control cache parameters. For example, HTTP
|
There are a few other ways to control cache parameters. For example, HTTP
|
||||||
allows applications to do the following:
|
allows applications to do the following:
|
||||||
|
|
||||||
* Define the maximum time a page should be cached.
|
* Define the maximum time a page should be cached.
|
||||||
|
|
||||||
* Specify whether a cache should always check for newer versions, only
|
* Specify whether a cache should always check for newer versions, only
|
||||||
delivering the cached content when there are no changes. (Some caches
|
delivering the cached content when there are no changes. (Some caches
|
||||||
might deliver cached content even if the server page changed, simply
|
might deliver cached content even if the server page changed, simply
|
||||||
because the cache copy isn't yet expired.)
|
because the cache copy isn't yet expired.)
|
||||||
|
@ -1119,14 +1119,14 @@ cache on every access and to store cached versions for, at most, 3,600 seconds::
|
||||||
Any valid ``Cache-Control`` HTTP directive is valid in ``cache_control()``.
|
Any valid ``Cache-Control`` HTTP directive is valid in ``cache_control()``.
|
||||||
Here's a full list:
|
Here's a full list:
|
||||||
|
|
||||||
* ``public=True``
|
* ``public=True``
|
||||||
* ``private=True``
|
* ``private=True``
|
||||||
* ``no_cache=True``
|
* ``no_cache=True``
|
||||||
* ``no_transform=True``
|
* ``no_transform=True``
|
||||||
* ``must_revalidate=True``
|
* ``must_revalidate=True``
|
||||||
* ``proxy_revalidate=True``
|
* ``proxy_revalidate=True``
|
||||||
* ``max_age=num_seconds``
|
* ``max_age=num_seconds``
|
||||||
* ``s_maxage=num_seconds``
|
* ``s_maxage=num_seconds``
|
||||||
|
|
||||||
For explanation of Cache-Control HTTP directives, see the `Cache-Control spec`_.
|
For explanation of Cache-Control HTTP directives, see the `Cache-Control spec`_.
|
||||||
|
|
||||||
|
@ -1154,11 +1154,11 @@ Other optimizations
|
||||||
Django comes with a few other pieces of middleware that can help optimize your
|
Django comes with a few other pieces of middleware that can help optimize your
|
||||||
site's performance:
|
site's performance:
|
||||||
|
|
||||||
* ``django.middleware.http.ConditionalGetMiddleware`` adds support for
|
* ``django.middleware.http.ConditionalGetMiddleware`` adds support for
|
||||||
modern browsers to conditionally GET responses based on the ``ETag``
|
modern browsers to conditionally GET responses based on the ``ETag``
|
||||||
and ``Last-Modified`` headers.
|
and ``Last-Modified`` headers.
|
||||||
|
|
||||||
* :class:`django.middleware.gzip.GZipMiddleware` compresses responses for all
|
* :class:`django.middleware.gzip.GZipMiddleware` compresses responses for all
|
||||||
modern browsers, saving bandwidth and transfer time.
|
modern browsers, saving bandwidth and transfer time.
|
||||||
|
|
||||||
Order of MIDDLEWARE_CLASSES
|
Order of MIDDLEWARE_CLASSES
|
||||||
|
@ -1175,9 +1175,9 @@ response phase. Thus, you need to make sure that ``UpdateCacheMiddleware``
|
||||||
appears *before* any other middleware that might add something to the ``Vary``
|
appears *before* any other middleware that might add something to the ``Vary``
|
||||||
header. The following middleware modules do so:
|
header. The following middleware modules do so:
|
||||||
|
|
||||||
* ``SessionMiddleware`` adds ``Cookie``
|
* ``SessionMiddleware`` adds ``Cookie``
|
||||||
* ``GZipMiddleware`` adds ``Accept-Encoding``
|
* ``GZipMiddleware`` adds ``Accept-Encoding``
|
||||||
* ``LocaleMiddleware`` adds ``Accept-Language``
|
* ``LocaleMiddleware`` adds ``Accept-Language``
|
||||||
|
|
||||||
``FetchFromCacheMiddleware``, on the other hand, runs during the request phase,
|
``FetchFromCacheMiddleware``, on the other hand, runs during the request phase,
|
||||||
where middleware is applied first-to-last, so an item at the top of the list
|
where middleware is applied first-to-last, so an item at the top of the list
|
||||||
|
|
|
@ -29,21 +29,21 @@ be passed as an extra argument to the URLconf.
|
||||||
|
|
||||||
Django ships with generic views to do the following:
|
Django ships with generic views to do the following:
|
||||||
|
|
||||||
* Perform common "simple" tasks: redirect to a different page and
|
* Perform common "simple" tasks: redirect to a different page and
|
||||||
render a given template.
|
render a given template.
|
||||||
|
|
||||||
* Display list and detail pages for a single object. If we were creating an
|
* Display list and detail pages for a single object. If we were creating an
|
||||||
application to manage conferences then a ``TalkListView`` and a
|
application to manage conferences then a ``TalkListView`` and a
|
||||||
``RegisteredUserListView`` would be examples of list views. A single
|
``RegisteredUserListView`` would be examples of list views. A single
|
||||||
talk page is an example of what we call a "detail" view.
|
talk page is an example of what we call a "detail" view.
|
||||||
|
|
||||||
* Present date-based objects in year/month/day archive pages,
|
* Present date-based objects in year/month/day archive pages,
|
||||||
associated detail, and "latest" pages.
|
associated detail, and "latest" pages.
|
||||||
`The Django Weblog <http://www.djangoproject.com/weblog/>`_'s
|
`The Django Weblog <http://www.djangoproject.com/weblog/>`_'s
|
||||||
year, month, and day archives are built with these, as would be a typical
|
year, month, and day archives are built with these, as would be a typical
|
||||||
newspaper's archives.
|
newspaper's archives.
|
||||||
|
|
||||||
* Allow users to create, update, and delete objects -- with or
|
* Allow users to create, update, and delete objects -- with or
|
||||||
without authorization.
|
without authorization.
|
||||||
|
|
||||||
Taken together, these views provide easy interfaces to perform the most common
|
Taken together, these views provide easy interfaces to perform the most common
|
||||||
|
|
|
@ -154,16 +154,16 @@ trying to change has been altered in the meantime.
|
||||||
|
|
||||||
For example, consider the following exchange between the client and server:
|
For example, consider the following exchange between the client and server:
|
||||||
|
|
||||||
1. Client requests ``/foo/``.
|
1. Client requests ``/foo/``.
|
||||||
2. Server responds with some content with an ETag of ``"abcd1234"``.
|
2. Server responds with some content with an ETag of ``"abcd1234"``.
|
||||||
3. Client sends an HTTP ``PUT`` request to ``/foo/`` to update the
|
3. Client sends an HTTP ``PUT`` request to ``/foo/`` to update the
|
||||||
resource. It also sends an ``If-Match: "abcd1234"`` header to specify
|
resource. It also sends an ``If-Match: "abcd1234"`` header to specify
|
||||||
the version it is trying to update.
|
the version it is trying to update.
|
||||||
4. Server checks to see if the resource has changed, by computing the ETag
|
4. Server checks to see if the resource has changed, by computing the ETag
|
||||||
the same way it does for a ``GET`` request (using the same function).
|
the same way it does for a ``GET`` request (using the same function).
|
||||||
If the resource *has* changed, it will return a 412 status code code,
|
If the resource *has* changed, it will return a 412 status code code,
|
||||||
meaning "precondition failed".
|
meaning "precondition failed".
|
||||||
5. Client sends a ``GET`` request to ``/foo/``, after receiving a 412
|
5. Client sends a ``GET`` request to ``/foo/``, after receiving a 412
|
||||||
response, to retrieve an updated version of the content before updating
|
response, to retrieve an updated version of the content before updating
|
||||||
it.
|
it.
|
||||||
|
|
||||||
|
@ -182,10 +182,10 @@ conditional ``GET`` handling via the
|
||||||
easy to use and suitable for many situations, those pieces of middleware
|
easy to use and suitable for many situations, those pieces of middleware
|
||||||
functionality have limitations for advanced usage:
|
functionality have limitations for advanced usage:
|
||||||
|
|
||||||
* They are applied globally to all views in your project
|
* They are applied globally to all views in your project
|
||||||
* They don't save you from generating the response itself, which may be
|
* They don't save you from generating the response itself, which may be
|
||||||
expensive
|
expensive
|
||||||
* They are only appropriate for HTTP ``GET`` requests.
|
* They are only appropriate for HTTP ``GET`` requests.
|
||||||
|
|
||||||
You should choose the most appropriate tool for your particular problem here.
|
You should choose the most appropriate tool for your particular problem here.
|
||||||
If you have a way to compute ETags and modification times quickly and if some
|
If you have a way to compute ETags and modification times quickly and if some
|
||||||
|
|
|
@ -205,7 +205,7 @@ first manager declared is the *default manager*, it is important to allow that
|
||||||
to be controlled. So here's how Django handles custom managers and
|
to be controlled. So here's how Django handles custom managers and
|
||||||
:ref:`model inheritance <model-inheritance>`:
|
:ref:`model inheritance <model-inheritance>`:
|
||||||
|
|
||||||
1. Managers defined on non-abstract base classes are *not* inherited by
|
1. Managers defined on non-abstract base classes are *not* inherited by
|
||||||
child classes. If you want to reuse a manager from a non-abstract base,
|
child classes. If you want to reuse a manager from a non-abstract base,
|
||||||
redeclare it explicitly on the child class. These sorts of managers are
|
redeclare it explicitly on the child class. These sorts of managers are
|
||||||
likely to be fairly specific to the class they are defined on, so
|
likely to be fairly specific to the class they are defined on, so
|
||||||
|
@ -213,14 +213,14 @@ to be controlled. So here's how Django handles custom managers and
|
||||||
far as the default manager goes). Therefore, they aren't passed onto
|
far as the default manager goes). Therefore, they aren't passed onto
|
||||||
child classes.
|
child classes.
|
||||||
|
|
||||||
2. Managers from abstract base classes are always inherited by the child
|
2. Managers from abstract base classes are always inherited by the child
|
||||||
class, using Python's normal name resolution order (names on the child
|
class, using Python's normal name resolution order (names on the child
|
||||||
class override all others; then come names on the first parent class,
|
class override all others; then come names on the first parent class,
|
||||||
and so on). Abstract base classes are designed to capture information
|
and so on). Abstract base classes are designed to capture information
|
||||||
and behavior that is common to their child classes. Defining common
|
and behavior that is common to their child classes. Defining common
|
||||||
managers is an appropriate part of this common information.
|
managers is an appropriate part of this common information.
|
||||||
|
|
||||||
3. The default manager on a class is either the first manager declared on
|
3. The default manager on a class is either the first manager declared on
|
||||||
the class, if that exists, or the default manager of the first abstract
|
the class, if that exists, or the default manager of the first abstract
|
||||||
base class in the parent hierarchy, if that exists. If no default
|
base class in the parent hierarchy, if that exists. If no default
|
||||||
manager is explicitly declared, Django's normal default manager is
|
manager is explicitly declared, Django's normal default manager is
|
||||||
|
|
|
@ -10,12 +10,12 @@ model maps to a single database table.
|
||||||
|
|
||||||
The basics:
|
The basics:
|
||||||
|
|
||||||
* Each model is a Python class that subclasses
|
* Each model is a Python class that subclasses
|
||||||
:class:`django.db.models.Model`.
|
:class:`django.db.models.Model`.
|
||||||
|
|
||||||
* Each attribute of the model represents a database field.
|
* Each attribute of the model represents a database field.
|
||||||
|
|
||||||
* With all of this, Django gives you an automatically-generated
|
* With all of this, Django gives you an automatically-generated
|
||||||
database-access API; see :doc:`/topics/db/queries`.
|
database-access API; see :doc:`/topics/db/queries`.
|
||||||
|
|
||||||
.. seealso::
|
.. seealso::
|
||||||
|
@ -53,14 +53,14 @@ The above ``Person`` model would create a database table like this:
|
||||||
|
|
||||||
Some technical notes:
|
Some technical notes:
|
||||||
|
|
||||||
* The name of the table, ``myapp_person``, is automatically derived from
|
* The name of the table, ``myapp_person``, is automatically derived from
|
||||||
some model metadata but can be overridden. See :ref:`table-names` for more
|
some model metadata but can be overridden. See :ref:`table-names` for more
|
||||||
details..
|
details..
|
||||||
|
|
||||||
* An ``id`` field is added automatically, but this behavior can be
|
* An ``id`` field is added automatically, but this behavior can be
|
||||||
overridden. See :ref:`automatic-primary-key-fields`.
|
overridden. See :ref:`automatic-primary-key-fields`.
|
||||||
|
|
||||||
* The ``CREATE TABLE`` SQL in this example is formatted using PostgreSQL
|
* The ``CREATE TABLE`` SQL in this example is formatted using PostgreSQL
|
||||||
syntax, but it's worth noting Django uses SQL tailored to the database
|
syntax, but it's worth noting Django uses SQL tailored to the database
|
||||||
backend specified in your :doc:`settings file </topics/settings>`.
|
backend specified in your :doc:`settings file </topics/settings>`.
|
||||||
|
|
||||||
|
@ -113,12 +113,12 @@ Each field in your model should be an instance of the appropriate
|
||||||
:class:`~django.db.models.Field` class. Django uses the field class types to
|
:class:`~django.db.models.Field` class. Django uses the field class types to
|
||||||
determine a few things:
|
determine a few things:
|
||||||
|
|
||||||
* The database column type (e.g. ``INTEGER``, ``VARCHAR``).
|
* The database column type (e.g. ``INTEGER``, ``VARCHAR``).
|
||||||
|
|
||||||
* The :doc:`widget </ref/forms/widgets>` to use in Django's admin interface,
|
* The :doc:`widget </ref/forms/widgets>` to use in Django's admin interface,
|
||||||
if you care to use it (e.g. ``<input type="text">``, ``<select>``).
|
if you care to use it (e.g. ``<input type="text">``, ``<select>``).
|
||||||
|
|
||||||
* The minimal validation requirements, used in Django's admin and in
|
* The minimal validation requirements, used in Django's admin and in
|
||||||
automatically-generated forms.
|
automatically-generated forms.
|
||||||
|
|
||||||
Django ships with dozens of built-in field types; you can find the complete list
|
Django ships with dozens of built-in field types; you can find the complete list
|
||||||
|
@ -140,11 +140,11 @@ optional. They're fully explained in the :ref:`reference
|
||||||
<common-model-field-options>`, but here's a quick summary of the most often-used
|
<common-model-field-options>`, but here's a quick summary of the most often-used
|
||||||
ones:
|
ones:
|
||||||
|
|
||||||
:attr:`~Field.null`
|
:attr:`~Field.null`
|
||||||
If ``True``, Django will store empty values as ``NULL`` in the database.
|
If ``True``, Django will store empty values as ``NULL`` in the database.
|
||||||
Default is ``False``.
|
Default is ``False``.
|
||||||
|
|
||||||
:attr:`~Field.blank`
|
:attr:`~Field.blank`
|
||||||
If ``True``, the field is allowed to be blank. Default is ``False``.
|
If ``True``, the field is allowed to be blank. Default is ``False``.
|
||||||
|
|
||||||
Note that this is different than :attr:`~Field.null`.
|
Note that this is different than :attr:`~Field.null`.
|
||||||
|
@ -154,7 +154,7 @@ ones:
|
||||||
allow entry of an empty value. If a field has :attr:`blank=False
|
allow entry of an empty value. If a field has :attr:`blank=False
|
||||||
<Field.blank>`, the field will be required.
|
<Field.blank>`, the field will be required.
|
||||||
|
|
||||||
:attr:`~Field.choices`
|
:attr:`~Field.choices`
|
||||||
An iterable (e.g., a list or tuple) of 2-tuples to use as choices for
|
An iterable (e.g., a list or tuple) of 2-tuples to use as choices for
|
||||||
this field. If this is given, Django's admin will use a select box
|
this field. If this is given, Django's admin will use a select box
|
||||||
instead of the standard text field and will limit choices to the choices
|
instead of the standard text field and will limit choices to the choices
|
||||||
|
@ -195,17 +195,17 @@ ones:
|
||||||
>>> p.get_gender_display()
|
>>> p.get_gender_display()
|
||||||
u'Male'
|
u'Male'
|
||||||
|
|
||||||
:attr:`~Field.default`
|
:attr:`~Field.default`
|
||||||
The default value for the field. This can be a value or a callable
|
The default value for the field. This can be a value or a callable
|
||||||
object. If callable it will be called every time a new object is
|
object. If callable it will be called every time a new object is
|
||||||
created.
|
created.
|
||||||
|
|
||||||
:attr:`~Field.help_text`
|
:attr:`~Field.help_text`
|
||||||
Extra "help" text to be displayed under the field on the object's admin
|
Extra "help" text to be displayed under the field on the object's admin
|
||||||
form. It's useful for documentation even if your object doesn't have an
|
form. It's useful for documentation even if your object doesn't have an
|
||||||
admin form.
|
admin form.
|
||||||
|
|
||||||
:attr:`~Field.primary_key`
|
:attr:`~Field.primary_key`
|
||||||
If ``True``, this field is the primary key for the model.
|
If ``True``, this field is the primary key for the model.
|
||||||
|
|
||||||
If you don't specify :attr:`primary_key=True <Field.primary_key>` for
|
If you don't specify :attr:`primary_key=True <Field.primary_key>` for
|
||||||
|
@ -215,7 +215,7 @@ ones:
|
||||||
unless you want to override the default primary-key behavior. For more,
|
unless you want to override the default primary-key behavior. For more,
|
||||||
see :ref:`automatic-primary-key-fields`.
|
see :ref:`automatic-primary-key-fields`.
|
||||||
|
|
||||||
:attr:`~Field.unique`
|
:attr:`~Field.unique`
|
||||||
If ``True``, this field must be unique throughout the table.
|
If ``True``, this field must be unique throughout the table.
|
||||||
|
|
||||||
Again, these are just short descriptions of the most common field options. Full
|
Again, these are just short descriptions of the most common field options. Full
|
||||||
|
@ -435,21 +435,21 @@ explicit declaration defines how the two models are related.
|
||||||
|
|
||||||
There are a few restrictions on the intermediate model:
|
There are a few restrictions on the intermediate model:
|
||||||
|
|
||||||
* Your intermediate model must contain one - and *only* one - foreign key
|
* Your intermediate model must contain one - and *only* one - foreign key
|
||||||
to the target model (this would be ``Person`` in our example). If you
|
to the target model (this would be ``Person`` in our example). If you
|
||||||
have more than one foreign key, a validation error will be raised.
|
have more than one foreign key, a validation error will be raised.
|
||||||
|
|
||||||
* Your intermediate model must contain one - and *only* one - foreign key
|
* Your intermediate model must contain one - and *only* one - foreign key
|
||||||
to the source model (this would be ``Group`` in our example). If you
|
to the source model (this would be ``Group`` in our example). If you
|
||||||
have more than one foreign key, a validation error will be raised.
|
have more than one foreign key, a validation error will be raised.
|
||||||
|
|
||||||
* The only exception to this is a model which has a many-to-many
|
* The only exception to this is a model which has a many-to-many
|
||||||
relationship to itself, through an intermediary model. In this
|
relationship to itself, through an intermediary model. In this
|
||||||
case, two foreign keys to the same model are permitted, but they
|
case, two foreign keys to the same model are permitted, but they
|
||||||
will be treated as the two (different) sides of the many-to-many
|
will be treated as the two (different) sides of the many-to-many
|
||||||
relation.
|
relation.
|
||||||
|
|
||||||
* When defining a many-to-many relationship from a model to
|
* When defining a many-to-many relationship from a model to
|
||||||
itself, using an intermediary model, you *must* use
|
itself, using an intermediary model, you *must* use
|
||||||
:attr:`symmetrical=False <ManyToManyField.symmetrical>` (see
|
:attr:`symmetrical=False <ManyToManyField.symmetrical>` (see
|
||||||
:ref:`the model field reference <manytomany-arguments>`).
|
:ref:`the model field reference <manytomany-arguments>`).
|
||||||
|
@ -601,13 +601,13 @@ Field name restrictions
|
||||||
|
|
||||||
Django places only two restrictions on model field names:
|
Django places only two restrictions on model field names:
|
||||||
|
|
||||||
1. A field name cannot be a Python reserved word, because that would result
|
1. A field name cannot be a Python reserved word, because that would result
|
||||||
in a Python syntax error. For example::
|
in a Python syntax error. For example::
|
||||||
|
|
||||||
class Example(models.Model):
|
class Example(models.Model):
|
||||||
pass = models.IntegerField() # 'pass' is a reserved word!
|
pass = models.IntegerField() # 'pass' is a reserved word!
|
||||||
|
|
||||||
2. A field name cannot contain more than one underscore in a row, due to
|
2. A field name cannot contain more than one underscore in a row, due to
|
||||||
the way Django's query lookup syntax works. For example::
|
the way Django's query lookup syntax works. For example::
|
||||||
|
|
||||||
class Example(models.Model):
|
class Example(models.Model):
|
||||||
|
@ -702,7 +702,7 @@ of :ref:`methods automatically given to each model <model-instance-methods>`.
|
||||||
You can override most of these -- see `overriding predefined model methods`_,
|
You can override most of these -- see `overriding predefined model methods`_,
|
||||||
below -- but there are a couple that you'll almost always want to define:
|
below -- but there are a couple that you'll almost always want to define:
|
||||||
|
|
||||||
:meth:`~Model.__unicode__`
|
:meth:`~Model.__unicode__`
|
||||||
A Python "magic method" that returns a unicode "representation" of any
|
A Python "magic method" that returns a unicode "representation" of any
|
||||||
object. This is what Python and Django will use whenever a model
|
object. This is what Python and Django will use whenever a model
|
||||||
instance needs to be coerced and displayed as a plain string. Most
|
instance needs to be coerced and displayed as a plain string. Most
|
||||||
|
@ -712,7 +712,7 @@ below -- but there are a couple that you'll almost always want to define:
|
||||||
You'll always want to define this method; the default isn't very helpful
|
You'll always want to define this method; the default isn't very helpful
|
||||||
at all.
|
at all.
|
||||||
|
|
||||||
:meth:`~Model.get_absolute_url`
|
:meth:`~Model.get_absolute_url`
|
||||||
This tells Django how to calculate the URL for an object. Django uses
|
This tells Django how to calculate the URL for an object. Django uses
|
||||||
this in its admin interface, and any time it needs to figure out a URL
|
this in its admin interface, and any time it needs to figure out a URL
|
||||||
for an object.
|
for an object.
|
||||||
|
@ -800,14 +800,14 @@ models.
|
||||||
|
|
||||||
There are three styles of inheritance that are possible in Django.
|
There are three styles of inheritance that are possible in Django.
|
||||||
|
|
||||||
1. Often, you will just want to use the parent class to hold information that
|
1. Often, you will just want to use the parent class to hold information that
|
||||||
you don't want to have to type out for each child model. This class isn't
|
you don't want to have to type out for each child model. This class isn't
|
||||||
going to ever be used in isolation, so :ref:`abstract-base-classes` are
|
going to ever be used in isolation, so :ref:`abstract-base-classes` are
|
||||||
what you're after.
|
what you're after.
|
||||||
2. If you're subclassing an existing model (perhaps something from another
|
2. If you're subclassing an existing model (perhaps something from another
|
||||||
application entirely) and want each model to have its own database table,
|
application entirely) and want each model to have its own database table,
|
||||||
:ref:`multi-table-inheritance` is the way to go.
|
:ref:`multi-table-inheritance` is the way to go.
|
||||||
3. Finally, if you only want to modify the Python-level behavior of a model,
|
3. Finally, if you only want to modify the Python-level behavior of a model,
|
||||||
without changing the models fields in any way, you can use
|
without changing the models fields in any way, you can use
|
||||||
:ref:`proxy-models`.
|
:ref:`proxy-models`.
|
||||||
|
|
||||||
|
@ -1197,11 +1197,11 @@ were needed in any case, so the current separation arose.
|
||||||
|
|
||||||
So, the general rules are:
|
So, the general rules are:
|
||||||
|
|
||||||
1. If you are mirroring an existing model or database table and don't want
|
1. If you are mirroring an existing model or database table and don't want
|
||||||
all the original database table columns, use ``Meta.managed=False``.
|
all the original database table columns, use ``Meta.managed=False``.
|
||||||
That option is normally useful for modeling database views and tables
|
That option is normally useful for modeling database views and tables
|
||||||
not under the control of Django.
|
not under the control of Django.
|
||||||
2. If you are wanting to change the Python-only behavior of a model, but
|
2. If you are wanting to change the Python-only behavior of a model, but
|
||||||
keep all the same fields as in the original, use ``Meta.proxy=True``.
|
keep all the same fields as in the original, use ``Meta.proxy=True``.
|
||||||
This sets things up so that the proxy model is an exact copy of the
|
This sets things up so that the proxy model is an exact copy of the
|
||||||
storage structure of the original model when data is saved.
|
storage structure of the original model when data is saved.
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue