diff content/Coding/025-upgrading-django1.5.rst @ 4:7ce6393e6d30

Adding converted blog posts from old blog.
author Brian Neal <bgneal@gmail.com>
date Thu, 30 Jan 2014 21:45:03 -0600
parents
children 49bebfa6f9d3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/content/Coding/025-upgrading-django1.5.rst	Thu Jan 30 21:45:03 2014 -0600
@@ -0,0 +1,120 @@
+Upgrading to Django 1.5
+#######################
+
+:date: 2013-08-29 19:30
+:tags: Django
+:slug: upgrading-to-django-1.5
+:author: Brian Neal
+
+Upgrading to Django 1.5
+=======================
+
+`Django`_ 1.5 came out a while ago, and I finally got around to upgrading two
+of my largest sites. I thought I would make a list of what I changed at a high
+level for my own reference. Perhaps someone else may find it useful as well.
+
+In any event, I highly recommend you read the excellent `release notes`_ and
+`deprecation timeline`_. I also recommend you run with warnings turned on::
+
+   $ python -Wall manage.py runserver
+
+This will help you flag down issues in your code. If you aren't sure where
+a warning is coming from, you can turn warnings into exceptions and get
+a traceback (see the Python docs on the warnings_ library). Another trick is to
+put a pdb_ breakpoint in the Django code before or after the warning, then you
+can examine the call stack with the ``w`` command.
+
+Upgrading Issues
+================
+
+Here are the issues that I ran into. Of course you may have a very different
+experience depending on what features of Django you used and the details of
+your site.
+
+#. **Replace occurrences of Django's simplejson with json**. The Django team
+   deprecated their version of the json library since they had dropped support
+   for older versions of Python.
+
+#. **select_related's depth argument is deprecated**. Instead of using
+   ``depth`` I had to explictly name which relationships to follow.
+
+#. **The cleanup management command is now called clearsessions**. I have
+   a Celery_ task I had to update because of this name change.
+
+#. **Remove my {% load url from future %} tags**. Long ago I had converted to
+   the newer ``url`` tag behavior by using this tag. Since this is now the
+   current behavior I could remove all of these tags.
+ 
+#. **The LOGIN_* settings now accept URL names**. These settings can now accept
+   URL names which allows me to be more DRY (Don't Repeat Yourself). I no
+   longer have to maintain URL patterns in two places.
+
+#. **Management commands should use self.stdout, etc. for output**. I'm not
+   sure if this is required, but it makes it easier to test your management
+   commands.
+
+#. **slugify is now available at django.utils.text**. I was doing something
+   kind of hacky by invoking the slugify template filter in Python code. Now
+   this slugify code is more naturally available as a free Python function
+   without the template filter baggage.
+
+#. **Remove all references to django.contrib.markup**. Django decided not to be
+   so tightly coupled to various third party markup languages. I can see their
+   reasoning, as it does add to their maintenance burden, but it is kind of
+   inconvenient if you already relied on it. Fortunately I had a while ago
+   stopped relying on the Markdown filter and had used a custom solution.
+   Seeing this issue in the release notes caused me to go looking through my
+   code and I found some unused templates and ``INSTALLED_APPS`` setting that
+   I could remove.  On my second site, I had one tiny usage of the Textile
+   filter that I decided to just get rid of since it was hardly worth carrying
+   the dependency for. I wrote a quick and dirty management command to convert
+   the database from storing Textile markup to HTML and I was done.
+
+#. **localflavor is deprecated in preferece to a third party app**. I was using
+   some US state fields in a few models. All I had to do was pip_ install
+   `django-localflavor`_, fix up some imports, update my requirements files,
+   and I was good.
+
+#. **Function-based generic views are now gone**. A third party application
+   I am using made use of the old function-based generic views. These have been
+   replaced with the newer class-based generic views. Luckily I wasn't actually
+   using the views in this application, I am only relying on it's models and
+   utilities. In this case I simply removed the inclusion of the application's
+   ``urls.py`` and all was well. The application is no longer maintained so
+   I would have had to port to the class-based views if I had needed them.
+
+#. **The adminmedia template tags library is now gone**. I wasn't actually
+   using this anymore, but I had a template that was still loading it. This
+   cruft was removed.
+
+What I didn't do
+================
+
+Django 1.5's largest new feature is probably its support for a `configurable
+User model`_. This impacts my largest site, and I wasn't quite sure how to
+proceed on this front. This is the only issue I feel like Django threw me under
+the bus on. Fortunately, the ``get_profile()`` and ``AUTH_PROFILE_MODULE``
+stuff will not be removed until Django 1.7. In addition, the author of the
+South_ library is developing model migration support which will also land in
+Django 1.7. Thus there is some time to sort this out, and I'm hoping Django
+will have some tutorials or docs on how to migrate away from the old
+``AUTH_PROFILE_MODULE`` scheme.
+
+Conclusion
+==========
+
+The upgrade process went smoother and quicker than I thought thanks to the
+excellent release notes and the Django team's use of Python warnings to flag
+deprecated features.
+
+
+.. _Django: https://www.djangoproject.com/
+.. _release notes: https://docs.djangoproject.com/en/1.5/releases/1.5/
+.. _deprecation timeline: https://docs.djangoproject.com/en/1.5/internals/deprecation/
+.. _warnings: http://docs.python.org/library/warnings.html
+.. _pdb: http://docs.python.org/library/pdb.html
+.. _Celery: http://www.celeryproject.org/
+.. _pip: http://www.pip-installer.org/en/latest/
+.. _django-localflavor: https://pypi.python.org/pypi/django-localflavor
+.. _configurable user model: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#auth-custom-user
+.. _South: http://south.aeracode.org/