Django 1.9 release notes - UNDER DEVELOPMENT

Welcome to Django 1.9!

These release notes cover the new features, as well as some backwards incompatible changes you’ll want to be aware of when upgrading from Django 1.8 or older versions. We’ve dropped some features that have reached the end of their deprecation cycle, and we’ve begun the deprecation process for some features.

Python compatibility

Like Django 1.8, Django 1.9 requires Python 2.7 or above, though we highly recommend the latest minor release. We’ve dropped support for Python 3.2 and added support for Python 3.5.

What’s new in Django 1.9


Minor features


  • Admin views now have model_admin or admin_site attributes.


  • The default iteration count for the PBKDF2 password hasher has been increased by 20%. This backwards compatible change will not affect users who have subclassed django.contrib.auth.hashers.PBKDF2PasswordHasher to change the default value.


  • ...


  • ...

File Storage

  • ...

File Uploads

  • ...


  • ...

Generic Views

  • Class based views generated using as_view() now have view_class and view_initkwargs attributes.


  • ...

Management Commands

  • ...


  • Added the RelatedManager.set() method to the related managers created by ForeignKey, GenericForeignKey, and ManyToManyField.


  • ...


  • Template tags created with the simple_tag() helper can now store results in a template variable by using the as argument.

Requests and Responses

  • ...


  • ...


  • ...

Backwards incompatible changes in 1.9


In addition to the changes outlined in this section, be sure to review the deprecation timeline for any features that have been removed. If you haven’t updated your code within the deprecation timeline for a given feature, its removal may appear as a backwards incompatible change.

Database backend API

  • A couple of new tests rely on the ability of the backend to introspect column defaults (returning the result as Field.default). You can set the can_introspect_default database feature to False if your backend doesn’t implement this. You may want to review the implementation on the backends that Django includes for reference (#24245).

Default settings that were tuples are now lists

The default settings in django.conf.global_settings were a combination of lists and tuples. All settings that were formerly tuples are now lists.

is_usable attribute on template loaders is removed

Django template loaders previously required an is_usable attribute to be defined. If a loader was configured in the template settings and this attribute was False, the loader would be silently ignored. In practice, this was only used by the egg loader to detect if setuptools was installed. The is_usable attribute is now removed and the egg loader instead fails at runtime if setuptools is not installed.


  • CSS and images in contrib.admin to support Internet Explorer 6 & 7 have been removed as these browsers have reached end-of-life.
  • django.http.responses.REASON_PHRASES and django.core.handlers.wsgi.STATUS_CODE_TEXT have been removed. Use Python’s stdlib instead: http.client.responses for Python 3 and httplib.responses for Python 2.
  • ValuesQuerySet and ValuesListQuerySet have been removed.

Features deprecated in 1.9


Django 1.4 added the assignment_tag helper to ease the creation of template tags that store results in a template variable. The simple_tag() helper has gained this same ability, making the assignment_tag obsolete. Tags that use assignment_tag should be updated to use simple_tag.


  • The weak argument to django.dispatch.signals.Signal.disconnect() has been deprecated as it has no effect.
  • The check_aggregate_support() method of django.db.backends.base.BaseDatabaseOperations has been deprecated and will be removed in Django 2.1. The more general check_expression_support() should be used instead.
  • django.forms.extras is deprecated. You can find SelectDateWidget in django.forms.widgets (or simply django.forms) instead.

Features removed in 1.9

These features have reached the end of their deprecation cycle and so have been removed in Django 1.9 (please see the deprecation timeline for more details):

  • django.utils.dictconfig is removed.
  • django.utils.importlib is removed.
  • django.utils.tzinfo is removed.
  • django.utils.unittest is removed.
  • The syncdb command is removed.
  • django.db.models.signals.pre_syncdb and django.db.models.signals.post_syncdb is removed.
  • Support for allow_syncdb on database routers is removed.
  • The legacy method of syncing apps without migrations is removed, and migrations are compulsory for all apps. This includes automatic loading of initial_data fixtures and support for initial SQL data.
  • All models need to be defined inside an installed application or declare an explicit app_label. Furthermore, it isn’t possible to import them before their application is loaded. In particular, it isn’t possible to import models inside the root package of an application.
  • The model and form IPAddressField is removed. A stub field remains for compatibility with historical migrations.
  • AppCommand.handle_app() is no longer be supported.
  • RequestSite and get_current_site() are no longer importable from django.contrib.sites.models.
  • FastCGI support via the runfcgi management command is removed.
  • django.utils.datastructures.SortedDict is removed.
  • ModelAdmin.declared_fieldsets is removed.
  • The util modules that provided backwards compatibility are removed:
    • django.contrib.admin.util
    • django.contrib.gis.db.backends.util
    • django.db.backends.util
    • django.forms.util
  • ModelAdmin.get_formsets is removed.
  • The backward compatible shims introduced to rename the BaseMemcachedCache._get_memcache_timeout() method to get_backend_timeout() is removed.
  • The --natural and -n options for dumpdata are removed.
  • The use_natural_keys argument for serializers.serialize() is removed.
  • Private API django.forms.forms.get_declared_fields() is removed.
  • The ability to use a SplitDateTimeWidget with DateTimeField is removed.
  • The WSGIRequest.REQUEST property is removed.
  • The class django.utils.datastructures.MergeDict is removed.
  • The zh-cn and zh-tw language codes are removed.
  • The internal django.utils.functional.memoize() is removed.
  • django.core.cache.get_cache is removed.
  • django.db.models.loading is removed.
  • Passing callable arguments to querysets is no longer possible.
  • BaseCommand.requires_model_validation is removed in favor of requires_system_checks. Admin validators is replaced by admin checks.
  • The ModelAdmin.validator_class and default_validator_class attributes are removed.
  • ModelAdmin.validate() is removed.
  • django.db.backends.DatabaseValidation.validate_field is removed in favor of the check_field method.
  • The check management command is removed.
  • django.utils.module_loading.import_by_path is removed in favor of django.utils.module_loading.import_string.
  • ssi and url template tags are removed from the future template tag library.
  • django.utils.text.javascript_quote() is removed.
  • Database test settings as independent entries in the database settings, prefixed by TEST_, are no longer supported.
  • The cache_choices option to ModelChoiceField and ModelMultipleChoiceField is removed.
  • The default value of the RedirectView.permanent attribute has changed from True to False.
  • django.contrib.sitemaps.FlatPageSitemap is removed in favor of django.contrib.flatpages.sitemaps.FlatPageSitemap.
  • Private API django.test.utils.TestTemplateLoader is removed.
  • The django.contrib.contenttypes.generic module is removed.