1.3.txt 37 KB

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