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