App Engine Python SDK version 1.7.4 (2)
[gae.git] / python / lib / django_1_4 / docs / releases / 1.3.txt
blob3dc90affca187d9b29e3e2e5cc3bc4782ef2d825
1 ========================
2 Django 1.3 release notes
3 ========================
5 *March 23, 2011*
7 Welcome to Django 1.3!
9 Nearly a year in the making, Django 1.3 includes quite a few `new
10 features`_ and plenty of bug fixes and improvements to existing
11 features. These release notes cover the new features in 1.3, as well
12 as some `backwards-incompatible changes`_ you'll want to be aware of
13 when upgrading from Django 1.2 or older versions.
15 Overview
16 ========
18 Django 1.3's focus has mostly been on resolving smaller, long-standing
19 feature requests, but that hasn't prevented a few fairly significant
20 new features from landing, including:
22 * A framework for writing `class-based views`_.
24 * Built-in support for `using Python's logging facilities`_.
26 * Contrib support for `easy handling of static files`_.
28 * Django's testing framework now supports (and ships with a copy of)
29   `the unittest2 library`_.
31 There's plenty more, of course; see the coverage of `new features`_
32 below for a full rundown and details.
34 Wherever possible, of course, new features are introduced in a
35 backwards-compatible manner per :doc:`our API stability policy
36 </misc/api-stability>` policy. As a result of this policy, Django 1.3
37 `begins the deprecation process for some features`_.
39 Some changes, unfortunately, are genuinely backwards-incompatible; in
40 most cases these are due to security issues or bugs which simply
41 couldn't be fixed any other way. Django 1.3 includes a few of these,
42 and descriptions of them -- along with the (minor) modifications
43 you'll need to make to handle them -- are documented in the list of
44 `backwards-incompatible changes`_ below.
46 .. _new features: `What's new in Django 1.3`_
47 .. _backwards-incompatible changes: backwards-incompatible-changes-1.3_
48 .. _using Python's logging facilities: `Logging`_
49 .. _easy handling of static files: `Extended static files handling`_
50 .. _the unittest2 library: `unittest2 support`_
51 .. _begins the deprecation process for some features: `deprecated-features-1.3`_
53 Python compatibility
54 ====================
56 The release of Django 1.2 was notable for having the first shift in
57 Django's Python compatibility policy; prior to Django 1.2, Django
58 supported any 2.x version of Python from 2.3 up. As of Django 1.2, the
59 minimum requirement was raised to Python 2.4.
61 Django 1.3 continues to support Python 2.4, but will be the final
62 Django release series to do so; beginning with Django 1.4, the minimum
63 supported Python version will be 2.5. A document outlining our full
64 timeline for deprecating Python 2.x and moving to Python 3.x will be
65 published shortly after the release of Django 1.3.
67 What's new in Django 1.3
68 ========================
70 Class-based views
71 ~~~~~~~~~~~~~~~~~
73 Django 1.3 adds a framework that allows you to use a class as a view.
74 This means you can compose a view out of a collection of methods that
75 can be subclassed and overridden to provide common views of data without
76 having to write too much code.
78 Analogs of all the old function-based generic views have been
79 provided, along with a completely generic view base class that can be
80 used as the basis for reusable applications that can be easily
81 extended.
83 See :doc:`the documentation on class-based generic views</topics/class-based-views>`
84 for more details. There is also a document to help you :doc:`convert
85 your function-based generic views to class-based
86 views</topics/generic-views-migration>`.
88 Logging
89 ~~~~~~~
91 Django 1.3 adds framework-level support for Python's ``logging``
92 module.  This means you can now easily configure and control logging
93 as part of your Django project. A number of logging handlers and
94 logging calls have been added to Django's own code as well -- most
95 notably, the error emails sent on a HTTP 500 server error are now
96 handled as a logging activity. See :doc:`the documentation on Django's
97 logging interface </topics/logging>` for more details.
99 Extended static files handling
100 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
102 Django 1.3 ships with a new contrib app --
103 ``django.contrib.staticfiles`` -- to help developers handle the static
104 media files (images, CSS, Javascript, etc.) that are needed to render
105 a complete web page.
107 In previous versions of Django, it was common to place static assets
108 in :setting:`MEDIA_ROOT` along with user-uploaded files, and serve
109 them both at :setting:`MEDIA_URL`. Part of the purpose of introducing
110 the ``staticfiles`` app is to make it easier to keep static files
111 separate from user-uploaded files. Static assets should now go in
112 ``static/`` subdirectories of your apps or in other static assets
113 directories listed in :setting:`STATICFILES_DIRS`, and will be served
114 at :setting:`STATIC_URL`.
116 See the :doc:`reference documentation of the app </ref/contrib/staticfiles>`
117 for more details or learn how to :doc:`manage static files
118 </howto/static-files>`.
120 unittest2 support
121 ~~~~~~~~~~~~~~~~~
123 Python 2.7 introduced some major changes to the ``unittest`` library,
124 adding some extremely useful features. To ensure that every Django
125 project can benefit from these new features, Django ships with a copy
126 of unittest2_, a copy of the Python 2.7 unittest library, backported
127 for Python 2.4 compatibility.
129 To access this library, Django provides the ``django.utils.unittest``
130 module alias. If you are using Python 2.7, or you have installed
131 ``unittest2`` locally, Django will map the alias to the installed
132 version of the unittest library. Otherwise, Django will use its own
133 bundled version of unittest2.
135 To take advantage of this alias, simply use::
137     from django.utils import unittest
139 wherever you would have historically used::
141     import unittest
143 If you want to continue to use the base unittest library, you can --
144 you just won't get any of the nice new unittest2 features.
146 .. _unittest2: http://pypi.python.org/pypi/unittest2
148 Transaction context managers
149 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
151 Users of Python 2.5 and above may now use :ref:`transaction management functions
152 <transaction-management-functions>` as `context managers`_. For example::
154     with transaction.autocommit():
155         # ...
157 .. _context managers: http://docs.python.org/glossary.html#term-context-manager
159 For more information, see :ref:`transaction-management-functions`.
161 Configurable delete-cascade
162 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
164 :class:`~django.db.models.ForeignKey` and
165 :class:`~django.db.models.OneToOneField` now accept an
166 :attr:`~django.db.models.ForeignKey.on_delete` argument to customize behavior
167 when the referenced object is deleted. Previously, deletes were always
168 cascaded; available alternatives now include set null, set default, set to any
169 value, protect, or do nothing.
171 For more information, see the :attr:`~django.db.models.ForeignKey.on_delete`
172 documentation.
174 Contextual markers and comments for translatable strings
175 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
177 For translation strings with ambiguous meaning, you can now
178 use the ``pgettext`` function to specify the context of the string.
180 And if you just want to add some information for translators, you
181 can also add special translator comments in the source.
183 For more information, see :ref:`contextual-markers` and
184 :ref:`translator-comments`.
186 Improvements to built-in template tags
187 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
189 A number of improvements have been made to Django's built-in template tags:
191 * The :ttag:`include` tag now accepts a ``with`` option, allowing
192   you to specify context variables to the included template
194 * The :ttag:`include` tag now accepts an ``only`` option, allowing
195   you to exclude the current context from the included context
197 * The :ttag:`with` tag now allows you to define multiple context
198   variables in a single :ttag:`with` block.
200 * The :ttag:`load` tag now accepts a ``from`` argument, allowing
201   you to load a single tag or filter from a library.
203 TemplateResponse
204 ~~~~~~~~~~~~~~~~
206 It can sometimes be beneficial to allow decorators or middleware to
207 modify a response *after* it has been constructed by the view. For
208 example, you may want to change the template that is used, or put
209 additional data into the context.
211 However, you can't (easily) modify the content of a basic
212 :class:`~django.http.HttpResponse` after it has been constructed. To
213 overcome this limitation, Django 1.3 adds a new
214 :class:`~django.template.response.TemplateResponse` class. Unlike basic
215 :class:`~django.http.HttpResponse` objects,
216 :class:`~django.template.response.TemplateResponse` objects retain the details
217 of the template and context that was provided by the view to compute
218 the response. The final output of the response is not computed until
219 it is needed, later in the response process.
221 For more details, see the :doc:`documentation </ref/template-response>`
222 on the :class:`~django.template.response.TemplateResponse` class.
224 Caching changes
225 ~~~~~~~~~~~~~~~
227 Django 1.3 sees the introduction of several improvements to the
228 Django's caching infrastructure.
230 Firstly, Django now supports multiple named caches. In the same way
231 that Django 1.2 introduced support for multiple database connections,
232 Django 1.3 allows you to use the new :setting:`CACHES` setting to
233 define multiple named cache connections.
235 Secondly, :ref:`versioning <cache_versioning>`, :ref:`site-wide
236 prefixing <cache_key_prefixing>` and :ref:`transformation
237 <cache_key_transformation>` have been added to the cache API.
239 Thirdly, :ref:`cache key creation <using-vary-headers>` has been
240 updated to take the request query string into account on ``GET``
241 requests.
243 Finally, support for pylibmc_ has been added to the memcached cache
244 backend.
246 For more details, see the :doc:`documentation on
247 caching in Django</topics/cache>`.
249 .. _pylibmc: http://sendapatch.se/projects/pylibmc/
251 Permissions for inactive users
252 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
254 If you provide a custom auth backend with ``supports_inactive_user``
255 set to ``True``, an inactive ``User`` instance will check the backend
256 for permissions.  This is useful for further centralizing the
257 permission handling. See the :doc:`authentication docs </topics/auth>`
258 for more details.
260 GeoDjango
261 ~~~~~~~~~
263 The GeoDjango test suite is now included when
264 :ref:`running the Django test suite <running-unit-tests>` with ``runtests.py``
265 when using :ref:`spatial database backends <spatial-backends>`.
267 :setting:`MEDIA_URL` and :setting:`STATIC_URL` must end in a slash
268 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
270 Previously, the :setting:`MEDIA_URL` setting only required a trailing slash if
271 it contained a suffix beyond the domain name.
273 A trailing slash is now *required* for :setting:`MEDIA_URL` and the new
274 :setting:`STATIC_URL` setting as long as it is not blank. This ensures there is
275 a consistent way to combine paths in templates.
277 Project settings which provide either of both settings without a trailing
278 slash will now raise a ``PendingDeprecationWarning``.
280 In Django 1.4 this same condition will raise ``DeprecationWarning``,
281 and in Django 1.5 will raise an ``ImproperlyConfigured`` exception.
283 Everything else
284 ~~~~~~~~~~~~~~~
286 Django :doc:`1.1 <1.1>` and :doc:`1.2 <1.2>` added
287 lots of big ticket items to Django, like multiple-database support,
288 model validation, and a session-based messages framework. However,
289 this focus on big features came at the cost of lots of smaller
290 features.
292 To compensate for this, the focus of the Django 1.3 development
293 process has been on adding lots of smaller, long standing feature
294 requests. These include:
296 * Improved tools for accessing and manipulating the current
297   :class:`~django.contrib.sites.models.Site` object in
298   :doc:`the sites framework </ref/contrib/sites>`.
300 * A :class:`~django.test.client.RequestFactory` for mocking requests
301   in tests.
303 * A new test assertion --
304   :meth:`~django.test.TestCase.assertNumQueries` -- making it
305   easier to test the database activity associated with a view.
307 * Support for lookups spanning relations in admin's
308   :attr:`~django.contrib.admin.ModelAdmin.list_filter`.
310 * Support for HTTPOnly_ cookies.
312 * :meth:`~django.core.mail.mail_admins()` and
313   :meth:`~django.core.mail.mail_managers()` now support easily attaching
314   HTML content to messages.
316 * :class:`~django.core.mail.EmailMessage` now supports CC's.
318 * Error emails now include more of the detail and formatting of the
319   debug server error page.
321 * :meth:`~django.template.Library.simple_tag` now accepts a
322   ``takes_context`` argument, making it easier to write simple
323   template tags that require access to template context.
325 * A new :meth:`~django.shortcuts.render()` shortcut -- an alternative
326   to :meth:`~django.shortcuts.render_to_response()` providing a
327   :class:`~django.template.RequestContext` by default.
329 * Support for combining :ref:`F() expressions <query-expressions>`
330   with timedelta values when retrieving or updating database values.
332 .. _HTTPOnly: https://www.owasp.org/index.php/HTTPOnly
334 .. _backwards-incompatible-changes-1.3:
336 Backwards-incompatible changes in 1.3
337 =====================================
339 CSRF validation now applies to AJAX requests
340 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
342 Prior to Django 1.2.5, Django's CSRF-prevention system exempted AJAX
343 requests from CSRF verification; due to `security issues`_ reported to
344 us, however, *all* requests are now subjected to CSRF
345 verification. Consult :doc:`the Django CSRF documentation
346 </ref/contrib/csrf>` for details on how to handle CSRF verification in
347 AJAX requests.
349 .. _security issues: https://www.djangoproject.com/weblog/2011/feb/08/security/
351 Restricted filters in admin interface
352 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
354 Prior to Django 1.2.5, the Django administrative interface allowed
355 filtering on any model field or relation -- not just those specified
356 in ``list_filter`` -- via query string manipulation. Due to security
357 issues reported to us, however, query string lookup arguments in the
358 admin must be for fields or relations specified in ``list_filter`` or
359 ``date_hierarchy``.
361 Deleting a model doesn't delete associated files
362 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
364 In earlier Django versions, when a model instance containing a
365 :class:`~django.db.models.FileField` was deleted,
366 :class:`~django.db.models.FileField` took it upon itself to also delete the
367 file from the backend storage. This opened the door to several data-loss
368 scenarios, including rolled-back transactions and fields on different models
369 referencing the same file. In Django 1.3, when a model is deleted the
370 :class:`~django.db.models.FileField`'s
371 :func:`~django.db.models.FileField.delete` method won't be called.  If you
372 need cleanup of orphaned files, you'll need to handle it yourself (for
373 instance, with a custom management command that can be run manually or
374 scheduled to run periodically via e.g. cron).
376 PasswordInput default rendering behavior
377 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
379 The :class:`~django.forms.PasswordInput` form widget, intended for use
380 with form fields which represent passwords, accepts a boolean keyword
381 argument ``render_value`` indicating whether to send its data back to
382 the browser when displaying a submitted form with errors. Prior to
383 Django 1.3, this argument defaulted to ``True``, meaning that the
384 submitted password would be sent back to the browser as part of the
385 form. Developers who wished to add a bit of additional security by
386 excluding that value from the redisplayed form could instantiate a
387 :class:`~django.forms.PasswordInput` passing ``render_value=False`` .
389 Due to the sensitive nature of passwords, however, Django 1.3 takes
390 this step automatically; the default value of ``render_value`` is now
391 ``False``, and developers who want the password value returned to the
392 browser on a submission with errors (the previous behavior) must now
393 explicitly indicate this. For example::
395     class LoginForm(forms.Form):
396         username = forms.CharField(max_length=100)
397         password = forms.CharField(widget=forms.PasswordInput(render_value=True))
399 Clearable default widget for FileField
400 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
402 Django 1.3 now includes a :class:`~django.forms.ClearableFileInput` form widget
403 in addition to :class:`~django.forms.FileInput`. ``ClearableFileInput`` renders
404 with a checkbox to clear the field's value (if the field has a value and is not
405 required); ``FileInput`` provided no means for clearing an existing file from
406 a ``FileField``.
408 ``ClearableFileInput`` is now the default widget for a ``FileField``, so
409 existing forms including ``FileField`` without assigning a custom widget will
410 need to account for the possible extra checkbox in the rendered form output.
412 To return to the previous rendering (without the ability to clear the
413 ``FileField``), use the ``FileInput`` widget in place of
414 ``ClearableFileInput``. For instance, in a ``ModelForm`` for a hypothetical
415 ``Document`` model with a ``FileField`` named ``document``::
417     from django import forms
418     from myapp.models import Document
420     class DocumentForm(forms.ModelForm):
421         class Meta:
422             model = Document
423             widgets = {'document': forms.FileInput}
425 New index on database session table
426 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
428 Prior to Django 1.3, the database table used by the database backend
429 for the :doc:`sessions </topics/http/sessions>` app had no index on
430 the ``expire_date`` column. As a result, date-based queries on the
431 session table -- such as the query that is needed to purge old
432 sessions -- would be very slow if there were lots of sessions.
434 If you have an existing project that is using the database session
435 backend, you don't have to do anything to accommodate this change.
436 However, you may get a significant performance boost if you manually
437 add the new index to the session table. The SQL that will add the
438 index can be found by running the :djadmin:`sqlindexes` admin
439 command::
441     python manage.py sqlindexes sessions
443 No more naughty words
444 ~~~~~~~~~~~~~~~~~~~~~
446 Django has historically provided (and enforced) a list of profanities.
447 The :doc:`comments app </ref/contrib/comments/index>` has enforced this
448 list of profanities, preventing people from submitting comments that
449 contained one of those profanities.
451 Unfortunately, the technique used to implement this profanities list
452 was woefully naive, and prone to the `Scunthorpe problem`_. Improving
453 the built-in filter to fix this problem would require significant
454 effort, and since natural language processing isn't the normal domain
455 of a web framework, we have "fixed" the problem by making the list of
456 prohibited words an empty list.
458 If you want to restore the old behavior, simply put a
459 :setting:`PROFANITIES_LIST` setting in your settings file that includes the
460 words that you want to prohibit (see the `commit that implemented this
461 change`_ if you want to see the list of words that was historically
462 prohibited). However, if avoiding profanities is important to you, you
463 would be well advised to seek out a better, less naive approach to the
464 problem.
466 .. _Scunthorpe problem: http://en.wikipedia.org/wiki/Scunthorpe_problem
467 .. _commit that implemented this change: https://code.djangoproject.com/changeset/13996
469 Localflavor changes
470 ~~~~~~~~~~~~~~~~~~~
472 Django 1.3 introduces the following backwards-incompatible changes to
473 local flavors:
475 * Canada (ca) -- The province "Newfoundland and Labrador" has had its
476   province code updated to "NL", rather than the older "NF". In
477   addition, the Yukon Territory has had its province code corrected to
478   "YT", instead of "YK".
480 * Indonesia (id) -- The province "Nanggroe Aceh Darussalam (NAD)" has
481   been removed from the province list in favor of the new official
482   designation "Aceh (ACE)".
484 * United States of America (us) -- The list of "states" used by
485   ``USStateField`` has expanded to include Armed Forces postal
486   codes. This is backwards-incompatible if you were relying on
487   ``USStateField`` not including them.
489 FormSet updates
490 ~~~~~~~~~~~~~~~
492 In Django 1.3 ``FormSet`` creation behavior is modified slightly. Historically
493 the class didn't make a distinction between not being passed data and being
494 passed empty dictionary. This was inconsistent with behavior in other parts of
495 the framework. Starting with 1.3 if you pass in empty dictionary the
496 ``FormSet`` will raise a ``ValidationError``.
498 For example with a ``FormSet``::
500     >>> class ArticleForm(Form):
501     ...     title = CharField()
502     ...     pub_date = DateField()
503     >>> ArticleFormSet = formset_factory(ArticleForm)
505 the following code will raise a ``ValidationError``::
507     >>> ArticleFormSet({})
508     Traceback (most recent call last):
509     ...
510     ValidationError: [u'ManagementForm data is missing or has been tampered with']
512 if you need to instantiate an empty ``FormSet``, don't pass in the data or use
513 ``None``::
515     >>> formset = ArticleFormSet()
516     >>> formset = ArticleFormSet(data=None)
518 Callables in templates
519 ~~~~~~~~~~~~~~~~~~~~~~
521 Previously, a callable in a template would only be called automatically as part
522 of the variable resolution process if it was retrieved via attribute
523 lookup. This was an inconsistency that could result in confusing and unhelpful
524 behavior::
526     >>> Template("{{ user.get_full_name }}").render(Context({'user': user}))
527     u'Joe Bloggs'
528     >>> Template("{{ full_name }}").render(Context({'full_name': user.get_full_name}))
529     u'&lt;bound method User.get_full_name of &lt;...
531 This has been resolved in Django 1.3 - the result in both cases will be ``u'Joe
532 Bloggs'``. Although the previous behavior was not useful for a template language
533 designed for web designers, and was never deliberately supported, it is possible
534 that some templates may be broken by this change.
536 Use of custom SQL to load initial data in tests
537 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
539 Django provides a custom SQL hooks as a way to inject hand-crafted SQL
540 into the database synchronization process. One of the possible uses
541 for this custom SQL is to insert data into your database. If your
542 custom SQL contains ``INSERT`` statements, those insertions will be
543 performed every time your database is synchronized. This includes the
544 synchronization of any test databases that are created when you run a
545 test suite.
547 However, in the process of testing the Django 1.3, it was discovered
548 that this feature has never completely worked as advertised. When
549 using database backends that don't support transactions, or when using
550 a TransactionTestCase, data that has been inserted using custom SQL
551 will not be visible during the testing process.
553 Unfortunately, there was no way to rectify this problem without
554 introducing a backwards incompatibility. Rather than leave
555 SQL-inserted initial data in an uncertain state, Django now enforces
556 the policy that data inserted by custom SQL will *not* be visible
557 during testing.
559 This change only affects the testing process. You can still use custom
560 SQL to load data into your production database as part of the syncdb
561 process. If you require data to exist during test conditions, you
562 should either insert it using :ref:`test fixtures
563 <topics-testing-fixtures>`, or using the ``setUp()`` method of your
564 test case.
566 Changed priority of translation loading
567 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
569 Work has been done to simplify, rationalize and properly document the algorithm
570 used by Django at runtime to build translations from the different translations
571 found on disk, namely:
573 For translatable literals found in Python code and templates (``'django'``
574 gettext domain):
576 * Priorities of translations included with applications listed in the
577   :setting:`INSTALLED_APPS` setting were changed. To provide a behavior
578   consistent with other parts of Django that also use such setting (templates,
579   etc.) now, when building the translation that will be made available, the
580   apps listed first have higher precedence than the ones listed later.
582 * Now it is possible to override the translations shipped with applications by
583   using the :setting:`LOCALE_PATHS` setting whose translations have now higher
584   precedence than the translations of :setting:`INSTALLED_APPS` applications.
585   The relative priority among the values listed in this setting has also been
586   modified so the paths listed first have higher precedence than the
587   ones listed later.
589 * The ``locale`` subdirectory of the directory containing the settings, that
590   usually coincides with and is know as the *project directory* is being
591   deprecated in this release as a source of translations. (the precedence of
592   these translations is intermediate between applications and :setting:`LOCALE_PATHS`
593   translations). See the `corresponding deprecated features section`_
594   of this document.
596 For translatable literals found in Javascript code (``'djangojs'`` gettext
597 domain):
599 * Similarly to the ``'django'`` domain translations: Overriding of
600   translations shipped with applications by using the :setting:`LOCALE_PATHS`
601   setting is now possible for this domain too. These translations have higher
602   precedence than the translations of Python packages passed to the
603   :ref:`javascript_catalog view <javascript_catalog-view>`.  Paths listed first
604   have higher precedence than the ones listed later.
606 * Translations under the ``locale`` subdirectory of the *project directory*
607   have never been taken in account for JavaScript translations and remain in
608   the same situation considering the deprecation of such location.
610 .. _corresponding deprecated features section: loading_of_project_level_translations_
612 Transaction management
613 ~~~~~~~~~~~~~~~~~~~~~~
615 When using managed transactions -- that is, anything but the default
616 autocommit mode -- it is important when a transaction is marked as
617 "dirty". Dirty transactions are committed by the
618 :func:`~django.db.transaction.commit_on_success` decorator or the
619 :class:`~django.middleware.transaction.TransactionMiddleware`, and
620 :func:`~django.db.transaction.commit_manually` forces them to be
621 closed explicitly; clean transactions "get a pass", which means they
622 are usually rolled back at the end of a request when the connection is
623 closed.
625 Until Django 1.3, transactions were only marked dirty when Django was
626 aware of a modifying operation performed in them; that is, either some
627 model was saved, some bulk update or delete was performed, or the user
628 explicitly called ``transaction.set_dirty()``. In Django 1.3, a
629 transaction is marked dirty when *any* database operation is
630 performed.
632 As a result of this change, you no longer need to set a transaction
633 dirty explicitly when you execute raw SQL or use a data-modifying
634 ``SELECT``. However, you *do* need to explicitly close any read-only
635 transactions that are being managed using
636 :func:`~django.db.transaction.commit_manually`. For example::
638       @transaction.commit_manually
639       def my_view(request, name):
640           obj = get_object_or_404(MyObject, name__iexact=name)
641           return render_to_response('template', {'object':obj})
643 Prior to Django 1.3, this would work without error. However, under
644 Django 1.3, this will raise a
645 :class:`~django.db.transaction.TransactionManagementError` because
646 the read operation that retrieves the ``MyObject`` instance leaves the
647 transaction in a dirty state.
649 No password reset for inactive users
650 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
652 Prior to Django 1.3, inactive users were able to request a password reset email
653 and reset their password. In Django 1.3 inactive users will receive the same
654 message as a nonexistent account.
656 .. _deprecated-features-1.3:
658 Features deprecated in 1.3
659 ==========================
661 Django 1.3 deprecates some features from earlier releases.
662 These features are still supported, but will be gradually phased out
663 over the next few release cycles.
665 Code taking advantage of any of the features below will raise a
666 ``PendingDeprecationWarning`` in Django 1.3. This warning will be
667 silent by default, but may be turned on using Python's :mod:`warnings`
668 module, or by running Python with a ``-Wd`` or `-Wall` flag.
670 In Django 1.4, these warnings will become a ``DeprecationWarning``,
671 which is *not* silent. In Django 1.5 support for these features will
672 be removed entirely.
674 .. seealso::
676     For more details, see the documentation :doc:`Django's release process
677     </internals/release-process>` and our :doc:`deprecation timeline
678     </internals/deprecation>`.
680 ``mod_python`` support
681 ~~~~~~~~~~~~~~~~~~~~~~
683 The ``mod_python`` library has not had a release since 2007 or a commit since
684 2008. The Apache Foundation board voted to remove ``mod_python`` from the set
685 of active projects in its version control repositories, and its lead developer
686 has shifted all of his efforts toward the lighter, slimmer, more stable, and
687 more flexible ``mod_wsgi`` backend.
689 If you are currently using the ``mod_python`` request handler, you
690 should redeploy your Django projects using another request handler.
691 :doc:`mod_wsgi </howto/deployment/wsgi/modwsgi>` is the request handler
692 recommended by the Django project, but :doc:`FastCGI
693 </howto/deployment/fastcgi>` is also supported. Support for
694 ``mod_python`` deployment will be removed in Django 1.5.
696 Function-based generic views
697 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
699 As a result of the introduction of class-based generic views, the
700 function-based generic views provided by Django have been deprecated.
701 The following modules and the views they contain have been deprecated:
703 * :mod:`django.views.generic.create_update`
705 * :mod:`django.views.generic.date_based`
707 * :mod:`django.views.generic.list_detail`
709 * :mod:`django.views.generic.simple`
711 Test client response ``template`` attribute
712 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
714 Django's :ref:`test client <test-client>` returns
715 :class:`~django.test.client.Response` objects annotated with extra testing
716 information. In Django versions prior to 1.3, this included a
717 :attr:`~django.test.client.Response.template` attribute containing information
718 about templates rendered in generating the response: either None, a single
719 :class:`~django.template.Template` object, or a list of
720 :class:`~django.template.Template` objects. This inconsistency in return values
721 (sometimes a list, sometimes not) made the attribute difficult to work with.
723 In Django 1.3 the :attr:`~django.test.client.Response.template` attribute is
724 deprecated in favor of a new :attr:`~django.test.client.Response.templates`
725 attribute, which is always a list, even if it has only a single element or no
726 elements.
728 ``DjangoTestRunner``
729 ~~~~~~~~~~~~~~~~~~~~
731 As a result of the introduction of support for unittest2, the features
732 of :class:`django.test.simple.DjangoTestRunner` (including fail-fast
733 and Ctrl-C test termination) have been made redundant. In view of this
734 redundancy, :class:`~django.test.simple.DjangoTestRunner` has been
735 turned into an empty placeholder class, and will be removed entirely
736 in Django 1.5.
738 Changes to :ttag:`url` and :ttag:`ssi`
739 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
741 Most template tags will allow you to pass in either constants or
742 variables as arguments -- for example::
744     {% extends "base.html" %}
746 allows you to specify a base template as a constant, but if you have a
747 context variable ``templ`` that contains the value ``base.html``::
749     {% extends templ %}
751 is also legal.
753 However, due to an accident of history, the :ttag:`url` and
754 :ttag:`ssi` are different. These tags use the second, quoteless
755 syntax, but interpret the argument as a constant. This means it isn't
756 possible to use a context variable as the target of a :ttag:`url` and
757 :ttag:`ssi` tag.
759 Django 1.3 marks the start of the process to correct this historical
760 accident. Django 1.3 adds a new template library -- ``future`` -- that
761 provides alternate implementations of the :ttag:`url` and :ttag:`ssi`
762 template tags. This ``future`` library implement behavior that makes
763 the handling of the first argument consistent with the handling of all
764 other variables. So, an existing template that contains::
766     {% url sample %}
768 should be replaced with::
770     {% load url from future %}
771     {% url 'sample' %}
773 The tags implementing the old behavior have been deprecated, and in
774 Django 1.5, the old behavior will be replaced with the new behavior.
775 To ensure compatibility with future versions of Django, existing
776 templates should be modified to use the new ``future`` libraries and
777 syntax.
779 Changes to the login methods of the admin
780 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
782 In previous version the admin app defined login methods in multiple locations
783 and ignored the almost identical implementation in the already used auth app.
784 A side effect of this duplication was the missing adoption of the changes made
785 in r12634_ to support a broader set of characters for usernames.
787 This release refactors the admin's login mechanism to use a subclass of the
788 :class:`~django.contrib.auth.forms.AuthenticationForm` instead of a manual
789 form validation. The previously undocumented method
790 ``'django.contrib.admin.sites.AdminSite.display_login_form'`` has been removed
791 in favor of a new :attr:`~django.contrib.admin.AdminSite.login_form`
792 attribute.
794 .. _r12634: https://code.djangoproject.com/changeset/12634
796 ``reset`` and ``sqlreset`` management commands
797 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
799 Those commands have been deprecated. The ``flush`` and ``sqlflush`` commands
800 can be used to delete everything. You can also use ALTER TABLE or DROP TABLE
801 statements manually.
804 GeoDjango
805 ~~~~~~~~~
807 * The function-based :setting:`TEST_RUNNER` previously used to execute
808   the GeoDjango test suite,
809   :func:`django.contrib.gis.tests.run_gis_tests`, was deprecated for
810   the class-based runner,
811   :class:`django.contrib.gis.tests.GeoDjangoTestSuiteRunner`.
813 * Previously, calling
814   :meth:`~django.contrib.gis.geos.GEOSGeometry.transform` would
815   silently do nothing when GDAL wasn't available.  Now, a
816   :class:`~django.contrib.gis.geos.GEOSException` is properly raised
817   to indicate possible faulty application code.  A warning is now
818   raised if :meth:`~django.contrib.gis.geos.GEOSGeometry.transform` is
819   called when the SRID of the geometry is less than 0 or ``None``.
821 ``CZBirthNumberField.clean``
822 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
824 Previously this field's ``clean()`` method accepted a second, gender, argument
825 which allowed stronger validation checks to be made, however since this
826 argument could never actually be passed from the Django form machinery it is
827 now pending deprecation.
829 ``CompatCookie``
830 ~~~~~~~~~~~~~~~~
832 Previously, ``django.http`` exposed an undocumented ``CompatCookie`` class,
833 which was a bug-fix wrapper around the standard library ``SimpleCookie``. As the
834 fixes are moving upstream, this is now deprecated - you should use ``from
835 django.http import SimpleCookie`` instead.
837 .. _loading_of_project_level_translations:
839 Loading of *project-level* translations
840 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
842 This release of Django starts the deprecation process for inclusion of
843 translations located under the so-called *project path* in the translation
844 building process performed at runtime. The :setting:`LOCALE_PATHS` setting can
845 be used for the same task by adding the filesystem path to a ``locale``
846 directory containing project-level translations to the value of that setting.
848 Rationale for this decision:
850 * The *project path* has always been a loosely defined concept
851   (actually, the directory used for locating project-level
852   translations is the directory containing the settings module) and
853   there has been a shift in other parts of the framework to stop using
854   it as a reference for location of assets at runtime.
856 * Detection of the ``locale`` subdirectory tends to fail when the
857   deployment scenario is more complex than the basic one. e.g. it
858   fails when the settings module is a directory (ticket #10765).
860 * There are potential strange development- and deployment-time
861   problems like the fact that the ``project_dir/locale/`` subdir can
862   generate spurious error messages when the project directory is added
863   to the Python path (``manage.py runserver`` does this) and then it
864   clashes with the equally named standard library module, this is a
865   typical warning message::
867      /usr/lib/python2.6/gettext.py:49: ImportWarning: Not importing directory '/path/to/project/locale': missing __init__.py.
868      import locale, copy, os, re, struct, sys
870 * This location wasn't included in the translation building process
871   for JavaScript literals. This deprecation removes such
872   inconsistency.
874 ``PermWrapper`` moved to ``django.contrib.auth.context_processors``
875 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
877 In Django 1.2, we began the process of changing the location of the
878 ``auth`` context processor from ``django.core.context_processors`` to
879 ``django.contrib.auth.context_processors``. However, the
880 ``PermWrapper`` support class was mistakenly omitted from that
881 migration. In Django 1.3, the ``PermWrapper`` class has also been
882 moved to ``django.contrib.auth.context_processors``, along with the
883 ``PermLookupDict`` support class. The new classes are functionally
884 identical to their old versions; only the module location has changed.
886 Removal of ``XMLField``
887 ~~~~~~~~~~~~~~~~~~~~~~~
889 When Django was first released, Django included an
890 :class:`~django.db.models.XMLField` that performed automatic XML validation
891 for any field input. However, this validation function hasn't been
892 performed since the introduction of ``newforms``, prior to the 1.0 release.
893 As a result, ``XMLField`` as currently implemented is functionally
894 indistinguishable from a simple :class:`~django.db.models.TextField`.
896 For this reason, Django 1.3 has fast-tracked the deprecation of
897 ``XMLField`` -- instead of a two-release deprecation, ``XMLField``
898 will be removed entirely in Django 1.4.
900 It's easy to update your code to accommodate this change -- just
901 replace all uses of ``XMLField`` with ``TextField``, and remove the
902 ``schema_path`` keyword argument (if it is specified).