BlueSoybean.com - Free RSS-Based News Reader

close

The Django weblog

Latest news about Django, the Python web framework.


Source: https://www.djangoproject.com/rss/weblog/

Articles

DSF member of the month - Akio Ogasahara | Weblog | Django

Posted by Sarah Abderemane on Nov. 21, 2025

via The Django weblog
Share  
Tags  

Twenty years of Django releases

On November 16th 2005, Django co-creator Adrian Holovaty announced the first ever Django release, Django 0.90. Twenty years later, today here we are 🚀. Since we’re , here are a few release-related numbers that represent Django’s history:
  • 447 releases over 20 years. That’s about 22 per year on average. We’re at 38 so far for 2025. Fun fact: 33 of those releases predate PyPI, and were published via the Django website only!
  • 131 security vulnerabilities addressed in those Django releases. Our is a testament to our stellar track-record.
  • 262,203 releases of Django-related packages. is gigantic. There’s tens of releases of Django packages per day as of 2025. There were 52 just today. With the caveat this depends a lot on what you classify as a "Django" package.
This is what decades’ worth of a stable framework looks like. Expect more gradual improvements and bug fixes over the next twenty years’ worth of releases. And if you like this kind of data, check out the report by JetBrains, with lots of statistics on our ecosystem (and there’s a offer).

Support Django

If you or your employer counts on Django’s 20 years of stability, consider whether you can support the project via donations to our non-profit Django Software Foundation.
  • Check out how to
Once you’ve done it, post with #DjangoBirthday and tag us / / / so we can say thank you! 59% Of our US $300,000.00 goal for 2025, as of November 19th, 2025, we are at:
  • 58.7% funded
  • $176,098.60 donated

via The Django weblog
Share  
Tags  

Django 6.0 release candidate 1 released

Django 6.0 release candidate 1 is now available. It represents the final opportunity for you to try out before Django 6.0 is released. The release candidate stage marks the string freeze and the call for translators . Provided no major bugs are discovered that can't be solved in the next two weeks, Django 6.0 will be released on or around December 3. Any delays will be communicated on the . Please use this opportunity to help find and fix bugs (which should be reported to ), you can grab a copy of the release candidate package from or on PyPI. The PGP key ID used for this release is Natalia Bidart:

via The Django weblog
Share  
Tags  

Going build-free with native JavaScript modules

For the last decade and more, we've been bundling CSS and JavaScript files. These build tools allowed us to utilize new browser capabilities in CSS and JS while still supporting older browsers. They also helped with client-side network performance, minimizing the content to be as small as possible and combining files into one large bundle to reduce network handshakes. We've gone through a lot of build tools iterations in the process; from Grunt (2012) to Gulp (2013) to Webpack (2014) to Parcel (2017) to esbuild (2020) and Vite (2020). And with modern browser technologies there is less need for these build tools.
  • Modern CSS supports many of the features natively that the build tools were created for. to organize code, , for feature detection.
  • JavaScript ES6 / ES2015 was a big step forward, and the language has been progressing steadily ever since. It now has native module support with the / keywords
  • Meanwhile, with , parallel requests can be made over the same connection, removing the constraints of the HTTP/1.x protocol.
These build processes are complex, particularly for beginners to Django. The tools and associated best practices move quickly. There is a lot to learn and you need to understand how to utilize them with your Django project. You can build a workflow that stores the build results in your static folder, but there is no core Django support for a build pipeline, so this largely requires selecting from a number of third party packages and integrating them into your project. The benefit this complexity adds is no longer as clear cut, especially for beginners. There are still advantages to build tools, but you can can create professional results without having to use or learn any build processes.

Build-free JavaScript tutorial

To demonstrate modern capabilities, let's expand with some newer JavaScript. We’ll use modern JS modules and we won’t require a build system. To give us a reason to need JS let's add a new requirement to the polls; to allow our users to add their own suggestions, instead of only being able to vote on the existing options. We update our form to have a new option under the selection code:
or add your own <input type="text" name="choice_text" maxlength="200" />
Now our users can add their own options to polls if the existing ones don't fit. We can update our voting view to handle this new option, with more validation:
  • If there is no vote selection we handle adding the new option
  • If there is no vote selection nor a new choice_text, we show an error
  • Also show an error if both are selected.
With our logic getting more complex it would be nicer if we had some JavaScript to do this. We can build a script that handles some of the form validation for us.
// Note the "export default" to make this function available for other modules.
export default function initFormValidation() {
  document.getElementById("polls").addEventListener("submit", function (e) {
    const choices = this.querySelectorAll('input[name="choice"]');
    const choiceText = this.querySelector('input[name="choice_text"]');

    const hasChecked = [...choices].some(r => r.checked);
    const hasText = choiceText?.value.trim() !== "";

    if (!hasChecked && !hasText) {
      e.preventDefault();
      alert("You didn't select a choice or provide a new one.");
    }

    if (hasChecked && hasText) {
      e.preventDefault();
      alert("You can't select a choice and also provide a new option.");
    }
  });
}
Note how we use export default in the above code. This means form_validation.js is a JavaScript module. When we create our main.js file, we can import it with the import statement:
import initFormValidation from "./form_validation.js";

initFormValidation();
Lastly, we add the script to the bottom of our details.html file, using Django’s usual static template tag. Note the type="module" this is needed to tell the browser we will be using import/export statements.
<script type="module" src="{% static 'polls/js/main.js' %}"></script>
That’s it! We got the modularity benefits of modern JavaScript without needing any build process. The browser handles the module loading for us. And thanks to parallel requests since HTTP/2, this can scale to many modules without a performance hit.

In production

To deploy, all we need is Django's support for collecting static files into one place and its support for adding hashes to filenames. In production it is a good idea to use storage backend. It stores the file names it handles by appending the MD5 hash of the file’s content to the filename. This allows you to set far future cache expiries, which is good for performance, while still guaranteeing new versions of the file will make it to users’ browsers. This backend is also able to update the reference to form_validation.js in the import statement, with its new versioned file name.

Future work

ManifestStaticFilesStorage works, but a lot of its implementation details get in the way. It could be easier to use as a developer.
  • The support for import/export with hashed files is not very robust.
  • Comments in CSS with references to files can .
  • Circular dependencies in CSS/JS can not be processed.
  • Errors during collectstatic when files are missing are not always clear.
  • Differences between implementation of StaticFilesStorage and ManifestStaticFilesStorage can lead to errors in production that don't show up in development (like ).
  • Configuring common options means subclassing the storage when we could use the existing OPTIONS dict.
  • Collecting static files could be faster if it used parallelization (pull request: )
We discussed those possible improvements at the sprints and I’m hopeful we can make progress. I built to attempt to fix all these. The core work is to switch to a lexer for CSS and JS, that was used in Django previously. It was expanded to cover modern JS and CSS by working with Claude Code to do the grunt work of covering the syntax. It also switches to using a topological sort to find dependencies, whereas before we used a more brute force approach of repeated processing until we saw no more changes, which lead to more work, particularly on storages that used the network. It also meant we couldn't handle circular dependencies. To validate it works, I ran a , it’s been tested issues and with similar (often improved) performance. On average, it’s about 30% faster.
While those improvements would be welcome, do go ahead with trying build-free JavaScript and CSS in your Django projects today! Modern browsers make it possible to create great frontend experiences without the complexity.

via The Django weblog
Share  
Tags  

Django at PyCon FR 2025 🇫🇷

Last week, we had a great time at - a free (!) gathering for Pythonistas in France. Here are some of our highlights.

Sprints on Django, our website, IA, marketing

Over two days, the conference started with 27 contributors joining us to contribute to Django and our website and online presence. Half in the room were complete newcomers to open source, wanting to get a taste of what it’s like behind the scenes. We also had people who were new to Django, taking the excellent to get up to speed with the project. The tutorial is translated in 20 languages(!), so it’s excellent in situations like this where people come from all over Europe. Two contributors working together on a laptop pair programming Carmen, one of our sprint contributors, took the time to test that our software for ongoing Board elections is accessible 💚

Discussing Django’s direction

At the sprints, we also organized discussions on Django’s direction - specifically on marketing, Artificial Intelligence, and technical decisions. Some recurring topics were:
  • Highlights from the report produced by JetBrains, and the need for fundraising partnerships like their ongoing campaign.
  • What “batteries included” means for Django in 2025. Does it include REST? Contributors discussed the recent forum thread .
  • Type hints and Django. The , and how feature requests are meant to work for Django.
  • The impact of Artificial Intelligence on Django and Django developers. How AI adoption could be supported with documentation investments, but also the ethical concerns of AI coding.
We had a great time during those two days of sprints ❤️ thank you to everyone involved, we hope you stick around!

Design systems with JinjaX, Stimulus, and Cube CSS

demonstrated how to bring a design-system mindset to Django projects by combining , , and . Supported by modern tooling like Figma, Vite, and Storybook. JinjaX in particular, allows to take a more component-driven “lego blocks” approach to front-end development with Django. Mads on stage with title slide about design systems at PyCon FR

Three years of htmx in Django

shared her takeaways from using htmx with Django over three years. The verdict? A joyful developer experience, some (solved) challenges with testing. Her recommended additions to make the most of the two frameworks:
  • : opinionated htmx integration
  • : better DX for Django templates
  • : test data generator (alternative to fixtures)
  • : snapshots for pytest
Slide with libraries in use in the project stack of Céline

Becoming an open-source contributor in 2025

In her talk, explored how newcomers can get involved in open source—highlighting the Django community’s program. She explains why doing it is great, how to engage with busy maintainers, and specific actions people can take to get started. We really liked her sharing a prompt she uses with AI, to iterate on questions to maintainers before hitting “send”: “You are an expert in technical writing. I'm trying to write a message about a question I have about this open-source project I'm contributing to. Here's the link to its repo ‹Add link here›. I want to convey my question to the maintainers in a clear, concise way, at the same time that I want it to have enough context so that the communication happens with the least back and forth possible. I want this question to contain a short, max two sentence summary upfront, and then more context in the text's body. Ask me whatever questions you need about my question and context in order to produce this message.” Amanda showcases contributor programs Google Summer of Code and Djangonaut Space

La Suite numérique: government collaboration powered by Django

PyCon FR also featured , the French government’s collaborative workspace—developed with partners in Germany, the Netherlands (), and Italy. Their platform includes collaborative documents, video calls, chat, and an AI assistant — all powered by Django 🤘. This work is now part of a wider European Union initiative for sovereign digital infrastructure based on open source, for more information see: . Manuel on stage introducing La suite numerique

Up next…

Up next, we have the first ever event! And closer to France, will take place in Athens, Greece 🇬🇷🏖️🏛️☀️
We’re elated to support events like PyCon FR 2025. To help us do more of this, take a look at this great offer from JetBrains: – All money goes to the Django Software Foundation!

via The Django weblog
Share  
Tags