Skip to content

Making django project compatible with both Python versions

Notifications You must be signed in to change notification settings

localboy/django-python-2-3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 

Repository files navigation

django-python-2-3

Making your Django project compatible with both Python versions consists of the following steps:

  1. Add from __future__ import unicode_literals at the top of each module and then use usual quotes without a u prefix for Unicode strings and a b prefix for bytestrings.

  2. To ensure that a value is bytestring, use the 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.

  3. In your models use __str__ method instead of __unicode__ and add the python_2_unicode_compatible decorator

  4. # 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")
  5. To iterate through dictionaries, use 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))
  6. At the time of capturing exceptions, use the as keyword, as follows:

    try:
        article = NewsArticle.objects.get(slug="hello-world")
    except NewsArticle.DoesNotExist as exc:
        pass
    except NewsArticle.MultipleObjectsReturned as exc:
        pass
  7. Use django.utils.six to check the type of a value 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)
  8. Use range from django.utils.six.moves ,Instead of xrange , as follows:

    from django.utils.six.moves import range
    
    for i in range(1, 11):
        print(i)

About

Making django project compatible with both Python versions

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published