WIP Timeline

20 years of Django in a collaborative timeline.

WIP: This timeline is pieced together by everyone’s memory and experiences. Is something significant missing? Or do you wanna add your very own milestone? See instructions for adding or editing entries.

  • Just before lunch on July 13, 2005, Jacob Kaplan-Moss makes the first commit to the public repository that would become Django. This is followed by a series of commits by Adrian Holovaty importing from the private repository where Django had lived up to that point.

  • The first post on djangoproject.com dates July 15th, and in fact, all the posts of the djangoproject.com weblog are still available on the current website.

  • Adrian Holovaty announces the first release of Django 0.90:

    We're especially excited that getting Django no longer requires installing Subversion. :-)

    In this context, it’s important to understand that distribution of Django had worked through Subversion (SVN), a pre-decessor to Git. At this point in time, Django is not on PyPi nor GitHub (which didn’t exist until 2007). Instead, installing Django involves downloading a .tar.gz file or a so-called Python egg.

    In fact, you can still download the 0.90 code here.

    This first release contained all the familiar fundamentals of Django: Views, forms, templates, models, admin, database backends and settings.

    The quote about SVN is referring to the fact that the very first Django installation instructions looked like this:

    A screenshot of djangoproject.com's download instructions, archived on August 5 2005.
  • At this point in time and until South was released, Django doesn’t have migrations. This means that altering Django models necessitates manual database changes. While developing, it’s common to drop the database and recreate it.

  • 📦 0.95 released (docs)

    Django version 0.95 is released, and it includes: Database transactions, custom model managers, signal handling with pre_save and post_save, and most of the framework is now translation-friendly.

  • 📦 0.96 released (docs)

    Django version 0.96 is released: This would be the final “unstable” release before Django moved to the 1.0 series. Lots of new stuff gets added, including loaddata and dumpdata commands, introduction of syncdb (you might recall that from before Django had migrations), django.newforms library (which would replace django.forms in 1.0), and a new test client:

    Django now includes a test framework so you can start transmuting fear into boredom (with apologies to Kent Beck).

    Kent Beck was the creator of “Extreme Programming” methods.

  • The first book about Django is published, titled The Definitive Guide to Django: Web Development Done Right and written by Django’s original creators Adrian Holovaty and Jacob Kaplan-Moss.

  • The Django Software Foundation (DSF) is launced and announced 🌄

  • Django South 0.2 is released by Andrew Godwin. It notably becomes the migration framework for Django for many years (until Django 1.7 is released in 2014). If you were using Django between 2008 and 2014, you most likely also used South:

    Django has always made use of automatic schema generation - the almost-famous “syncdb” that must be run at least once (and often more) on every Django project. If you’ve ever used Django on a resonably large project, you quickly discover that you’re deleting tables and regenerating them if you change schema - and that’s only if you’re in development, and can afford to possibly lose data.

    Other frameworks, such as the infamous Ruby on Rails, have migrations, which incrementally build up a schema as a series of migrations are executed, the idea being that a schema change is simply one more migration. South is an attempt to bring migrations over to Django, but in a more robust and useable way.

  • 📦 1.0 released (docs)

    Django version 1.0 is released and Django’s Documentation (docs.djangoprojects.com) is officially launched.

    Since Django 0.96, we’ve made over 4,000 code commits, fixed more than 2,000 bugs, and edited, added, or removed around 350,000 lines of code. We’ve also added 40,000 lines of new documentation, and greatly improved what was already there.

  • The first DjangoCon is held, a 2-day DjangoCon US in Mountain View. The event has 200 attendees and marks the launch of Django 1.0.

  • At Cal Henderson’s DjangoCon keynote, a joke is made that Django needs a mascot with magical powers. Bryan Veloso very quickly posts a first design, based on an image from iStockPhoto. A tagline “The web framework for ponies with magical powers” is included.

    djangopony.com is launched, and a Twitter profile @djangopony adds to the personification. Since then, the initial design by Bryan Veloso has been used largely as-is, meaning that the pony itself remains under copyright to iStockPhoto and illustrator Eric DePrince.

    See also: Django Pony retrospective on DjangoAdvent

    Django Pony wallpaper by Bryan Veloso and iStockPhoto
  • 📦 1.1 released (docs)

    Django 1.1 is released, including new features like the TransactionTestCase (wrapping test cases in database transactions), aggregate support in the ORM, F() expressions, proxy models, admin actions, and many more things that have since then become classics.

  • 📦 1.2 released (docs)

    Django 1.2 is released, and it’s a VERY BIG release.

    It adds support for multiple databases, the messages framework, CSRF form protection with {% csrf_token %} (available since 1.1.2), the permission framework, email backends, natural keys in fixtures, BigIntegerField, spacial databases in GeoDjango,

    Oh and not least, if you remember writing template tages like {% ifnotequal a b %}, those are now replaced by {% if a!=b %}.

    This is also the first release that drops a supported Python version, as version 2.2 support is removed 😵

  • The first release available on PyPi is Django 1.2, which is uploaded together with older releases, ranging from 1.0.1 and up.

  • 📦 1.3 released (docs)

    Django 1.3 is released: It introduced class-based views (CBVs) and django.contrib.staticfiles. Django no vendors unittest2 from Python 2.7 in order to maintain backwards compatibility with older Python versions. The on_delete option for foreign key fields is introduced.

    The PROFANITIES_LIST setting is introduced, rather than maintaining a list of naughty words inside the comments app.

  • 📦 1.4 released (docs)

    Exactly a year after 1.3 was released, 1.4 comes out: Django now supports timezones! select_for_update is added, a --template option for manage.py startproject and manage.py startapp, an explicit wsgi.py file, prefetch_related and bulk_create for the ORM, custom list filters for the admin, and much more.

  • 📦 1.5 released (docs)

    Django 1.5 is released with support for a swappable User model, and the first Django release to support Python 3 (in an experimental way), and update_fields is introduced to specify which fields should be saved on a model.

  • Harry Percival’s book “Test Driven Web Development with Python” is out on O’Reilly - and is announced in a blog post on the “Obey the Testing Goat!” website. Harry’s book, tutorials and website were influential to a lot of thinking around web development and the motivation for writing tests.

  • 📦 1.6 released (docs)

    Dedicated to Malcolm Tredinnick (RIP 🕯️), Django 1.6 now officially supports Python 3 and it modernizes the startproject and startapp commands. Under the hood, persistent database connections are introduced to reuse the same db connection across multiple requests and a call to a Model’s save() now requires just 1 database query instead of 2.

  • 📦 1.7 released (docs)

    Django will have migrations! This is perhaps the most well-known Django release, as South is replaced by a built-in migration framework. All Django projects will have to adapt, but the benefits are huge. South becomes the blueprint for the built-in migrations feature, which is lead once again by Andrew Godwin.

    But that isn’t the only big change: 1.7 also introduces the Application registry (an optional apps.py for applications), the system checks framework, as well as the widely popular QuerySet.as_manager() shortcut.

  • Django has its first big birthday celebration. A blog post is written and a Django Birthday conference is held in the US. Also this series of video greetings is sent from community all-over the world:

  • 📦 2.0 released (docs)

    Django version 2.0 is released, highlights include: New default URL patterns, mobile-friendly admin, Window expressions for the ORM.

  • 📦 3.0 released (docs)

    Django version 3.0 is released, highlight include MariaDB support and ASGI support.

  • 📦 4.0 released (docs)

    Django version 4.0 is released, highlights include: Template-based form rendering, the pytz dependency is removed, Meta.constraints introduces functional expressions, a new Redis cache backend is added.

  • 📦 5.0 released (docs)

    Django version 5.0 is released, highlights include: db-computed field defaults, GeneratedField is added, and a simplified .as_field_group form field template rendering.

  • DEP 14: Background workers by Jake Howard is merged after a little over 3 months of lively discussions. This immediately turns into a separate django-tasks project, which is targeted for inclusion in future Django versions. Django will have a bundled task handling system!

  • Django turns 20 and this timeline is launched!

Adding milestones

This timeline is pieced together by everyone’s memory and experiences. Is something significant missing? Or do you wanna add your very OWN sigificant milestone?

  1. Copy the contents of the template.
  2. Create a new file in content/timeline with a name like YYYY-DD-MM + lowercase slug (for instance “2005-07-13-first-commit.md”) and paste in the template’s content.
  3. Adjust the content, following the instructions in the comments.
  4. Submit the change as a Pull Request.