-
Book Overview & Buying
-
Table Of Contents
Web Development with Django Cookbook - Second Edition
By :
Since version 1.7, Django can be used with Python 2.7 and Python 3. In this recipe, we will take a look at the operations to make your code compatible with both the Python versions.
When creating a new Django project or upgrading an old existing project, consider following the rules given in this recipe.
Making your code compatible with both Python versions consists of the following steps:
from __future__ import unicode_literals and then use usual quotes without a u prefix for Unicode strings and a b prefix for bytestrings.django.utils.encoding.smart_bytes function. To ensure that a value is Unicode, use the django.utils.encoding.smart_text or django.utils.encoding.force_text function.__unicode__ method, use the __str__ method and add the python_2_unicode_compatible decorator, as follows:# models.py # -*- coding: UTF-8 -*- from __future__ import unicode_literals from django.db import models from django.utils.translation import ugettext_lazy as _ from django.utils.encoding import \ python_2_unicode_compatible @python_2_unicode_compatible class NewsArticle(models.Model): title = models.CharField(_("Title"), max_length=200) content = models.TextField(_("Content")) def __str__(self): return self.title class Meta: verbose_name = _("News Article") verbose_name_plural = _("News Articles")
iteritems(), iterkeys(), and itervalues() from django.utils.six. Take a look at the following:from django.utils.six import iteritems
d = {"imported": 25, "skipped": 12, "deleted": 3}
for k, v in iteritems(d):
print("{0}: {1}".format(k, v))as keyword, as follows:try:
article = NewsArticle.objects.get(slug="hello-world")
except NewsArticle.DoesNotExist as exc:
pass
except NewsArticle.MultipleObjectsReturned as exc:
passdjango.utils.six, as shown in the following:from django.utils import six isinstance(val, six.string_types) # previously basestring isinstance(val, six.text_type) # previously unicode isinstance(val, bytes) # previously str isinstance(val, six.integer_types) # previously (int, long)
xrange, use range from django.utils.six.moves, as follows:from django.utils.six.moves import range
for i in range(1, 11):
print(i)from django.utils import six
if six.PY2:
print("This is Python 2")
if six.PY3:
print("This is Python 3")All strings in Django projects should be considered as Unicode strings. Only the input of HttpRequest and output of HttpResponse is usually in the UTF-8 encoded bytestring.
Many functions and methods in Python 3 now return the iterators instead of lists, which make the language more efficient. To make the code compatible with both the Python versions, you can use the six library that is bundled in Django.
Read more about writing compatible code in the official Django documentation at https://docs.djangoproject.com/en/1.8/topics/python3/.
Downloading the example code
You can download the example code files for all Packt books that you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register in order to have the files e-mailed directly to you.
Change the font size
Change margin width
Change background colour