The Django framework has had stable, first-class support for Python 3 since Django 1.6 (almost three years ago as of time of this writing). Yet the wider ecosystem of third-party packages of tools moved more slowly, which means that for many more years we've been avoiding the "bleeding edge" platform and staying true to Python 2.
At Good Code, this meant we've been sticking with Python 2 for new Django projects, but ensuring that any Python (or Django) related packages that we release work well with both Python 2 and Python 3. As a case in point, our django-queryinspect package, first released in 2014, supported Python 3 from the start.
In the meantime, the support for Python 3 everywhere grew, and nowadays it's pretty rare (at least in the web development niche) to find a popular and maintained component that doesn't work well with it. Even big Django users such as Instagram have been switching withut problems.
This means there really is no good reason to not go with Python 3 by default for all new projects, even for conservative developers who love their platform to be stable, as we do. So we've decided to officially switch to using Python 3.
Python 2 support is alive and well
This doesn't mean, however, that we're abandoning Python 2. The new code we're writing will support Python 2 for the time being, wherever that support is not a considerable burden (for many typical web projects, it's still pretty easy to do). This means we're not forcing our users to use Python 3 if they're not in a position to easily do so.