08 Sep 2026

feedDjango community aggregator: Community blog posts

Coding tactics: the series

Over the summer I published a series on coding tactics: the everyday craft of ifs, loops, and the reasoning behind them. Eight posts, one thesis, best read in order. This is the map.

Coding tactics: the series

08 Sep 2026 10:00am GMT

04 Sep 2026

feedDjango community aggregator: Community blog posts

Issue 353: DjangoCon US Recaps Galore!

News

Django Developers Survey 2026 results

The fifth annual survey run with JetBrains is out, with the full report, infographics, and a companion writeup titled "The State of Django 2026: Boring is so back."

Help test Python 3.15!

Python release manager Hugo van Kemende kindly requests you add 3.15 and allow-prereleases: true to your GitHub Actions matrix and publish wheels before the October 1 release.


Releases

Django bugfix release issued: 6.1.1

Twelve fixes, nearly all of them 6.1 regressions: admin changelist search crashes, ModelAdmin.list_display traversing multiple relations, __in returning empty querysets, and DecimalField without precision on SQLite.

Python 3.15.0 candidate 2 is here!

The last planned release candidate, carrying 144 bugfixes from 76 contributors since rc1, ahead of the October 1 final.


Django Software Foundation

DEP 0019: Technical Governance for Django

Now accepted, DEP 19 supersedes DEP 10 and DEP 12 as Django's single technical governance document, and trades hard eligibility rules for eight qualitative traits that Steering Council candidates should show three or more of. The five-member council keeps binding authority over technical decisions, with elections triggered by the final feature release of a major release series, a drop below three elected members, or a council vote.

DSF member of the month - Benjamin Balder Bach

The django-money maintainer and Django Day Copenhagen organizer on closing the distance between developers and the people who use what they build.


Djangonaut Space News

Djangonaut Space - Session 7 Accepting Applications

Applications for the eight-week mentorship program close September 6 Anywhere on Earth, with the session starting October 12.


Python Software Foundation

The 2026 PSF Board Election is Open!

Eligible members can approve up to 17 candidates for four open seats, and ballots cannot be changed once cast, so read the nominee statements before voting closes September 15 at 2:00 pm UTC.

Inaugural Python Packaging Council Election: Voting is now open!

The first Packaging Council election is open to members who affirmed their intent to vote, and closes at the same September 15 deadline.

Metadata requests no longer tracked in PyPI download counts

PyPI now counts only .whl, .tar.gz, and .zip requests, so BigQuery data breaks permanently at 2026-08-24: about 39% of urllib3's earlier counts turned out to be metadata and other non-distribution files.


Wagtail CMS News

Our DjangoConUS 2026 photo album ๐Ÿ“ท

Meagen Voss shares photos from Chicago rather than a talk recap, including her first main-stage talk on Wagtail's approach to AI.


Updates to Django

Today, "Updates to Django" is presented by Raffaella from Djangonaut Space! ๐Ÿš€

Last week we had 5 pull requests merged into Django by 5 different contributors - including 2 first-time contributors! Congratulations to Iaroslav and Tyler Russin for having their first commits merged into Django - welcome on board!

News in Django 6.1:

Playwright is replacing Selenium for integration tests ๐ŸŽ‰


Django Fellow Reports

Django Fellow Report - Jacob

I had a rejuvenating week attending, presenting at, and sprinting during DjangoCon US. I'm still relatively new to this community, so I'm still allowed to be impressed with everyone's gracious and welcoming attitudes. A smattering of things falling under the usual categories this week.

Django Fellow Report - Sarah

Was in Chicago (๐ŸŒฌ๏ธ ๐Ÿ™๏ธ ๐ŸŒญ ๐Ÿ‡บ๐Ÿ‡ธ) for DjangoCon US ๐ŸŽ‰. It was a fantastic conference and a lovely city. Delivered a keynote which went "good enough" and my baby boy managed with the jetlag reasonably well ๐Ÿ˜€. Came away from the conference with a few ideas and energy from engaging with our community

Django Fellow Report - Natalia

A week of holidays ๐Ÿ–๏ธ ๐Ÿ‘ก ๐Ÿฆ followed by a week of DjangoCon US! ๐Ÿš† โ˜€๏ธ ๐Ÿ‘ฅ ๐ŸŽค


Sponsored

Until September 10, receive 30% off all new or renewal licenses, with 100% of the proceeds going directly to the Django Software Foundation.


Articles

Why We Started Building on the Django 6.1 Alpha

Divio started building on Django 6.1 at the first alpha, months before the August release. Here's why they picked the pre-release and what they found while testing it every day.

A Dolly Parton Developer

Following Rikki Endsley's "Willie Nelson developer," Trey Hunner makes the case for Dolly Parton as the model: know your rights (she refused to hand over publishing on "I Will Always Love You" when Elvis's team demanded half), exit with grace (she paid Porter Wagoner $1 million to leave his show and kept the friendship), and write the next one. She recorded close to 1,000 songs and wrote thousands more, which is a better target than being a rockstar.

Store lists in a single Django column without joins?

After a decade of development, version 1.0.0 of django-select-multiple-field is here, bringing full support for modern Python and Django versions to store multiple choices in a single database column without extra join tables.

Make Your Django Application Editable

The CMS doesn't need to own your data to make it editable.

htmx and Django LiveView, side by side

Seven worked cases showing where stateless htmx requests and LiveView's persistent WebSocket diverge, with the conclusion that they are complementary rather than interchangeable.

Nifty Django Feature: Use Index for Custom Migration Operations

Override create_sql() and remove_sql() on a models.Index subclass and arbitrary table-level SQL rides along in Meta.indexes, managed by migrations for free.

Django and deployments

A proposed manage.py deploy namespace of lower-level commands that start by printing their expected inputs and outputs, leaving the actual automation to packages and plugins.

Agents All the Way Down

The annotated script of Josh Thomas's DjangoCon US talk on how AI coding agents changed the way he writes Django, written to land for skeptics and true believers alike.

Postgres 19: How Our Advice Has Changed Since...

JIT is off by default, LZ4 replaces pglz for TOAST, and async I/O means the old "an index always beats a parallel sequential scan" assumption is worth re-testing.

"Premature" optimization

The full Knuth quote licenses optimizing the critical 3%, and dropping "small" from "small efficiencies" turned it into a blanket excuse to skip the design work that is cheapest to do up front.


DjangoCon US Recaps

Yes, a standalone category since so many posts on it this week!

DjangoCon US 2026 Recap - Jonathan Peacher

Jonathan Peacher's notes on attending the conference this year in Chicago, highlighting various talks and projects.

My Time at DjangoCon US 2026 - Jason Judkins

Jason Judkins transcribed the talks so he could go back over them, and this recap is the trailer for a longer per-talk series. He picks out a theme running through Paolo Melchiorre's UUID history, Drishti Jain's GeoDjango talk, and Abigail Gbadago's polyglot persistence talk: push the work down a layer, because the database usually knows how to do it better than you do. AI turned up in nearly every talk, with almost nobody uncritical about it.

DjangoCon US 2026 Recap - Tim Schilling

Tim Schilling's fifth DjangoCon, spent chairing sprints with Kudzayi Bamhare, working on Django Simple Deploy with Colin Copeland, and meeting Djangonaut Space members in person for the first time.

My DjangoCon US 2026 - Paolo Melchiorre

Paolo Melchiorre on giving "The Django UUID Story," staffing the DSF booth, and fielding questions at the DSF members open space.

DjangoCon US 2026 - Dwayne McDaniel

Dwayne McDaniel's recap runs talk by talk: Karen Tracey on Django 6's background tasks, CSP support, and template partials, Natalia Bidart on keeping templates the source of truth with HTMX, and Elizabeth Christensen on UUIDv7, graph queries, and OAuth 2.0 in PostgreSQL 18 and 19. His through line is that frameworks, databases, and browsers keep absorbing work that used to need extra layers, with Kasey Kelly's 16,000-line AI-generated frontend file as the cautionary case.


Events

Django On the Med

September 23, 2026 in Pescara, Italy ๐Ÿ‡ฎ๐Ÿ‡น.

Django Day Copenhagen 2026

October 2, 2026 in Copenhagen ๐Ÿ‡ฉ๐Ÿ‡ฐ.


Django Job Board

Two new listings this week, plus the DSF still looking for its first Executive Director.

Machine Learning Engineer (Hybrid) at Provision ๐Ÿ†•

Django Developer at The Cruise Brothers ๐Ÿ†•

Full Stack Software Engineer (Hybrid) at Provision

Executive Director at Django Software Foundation

AI-Assisted Software Engineer, Web Applications at Logical Media Group


Projects

django-danceschool/django-danceschool

Django CMS project with comprehensive features for running a partnered social dance school.

p-r-a-v-i-n/django-fast-multipart

An experimental Rust-backed multipart parser that plugs into Django's parser extension point, so upload handlers, request limits, request.POST, and request.FILES all keep working as they do now. Requires CPython 3.12 or later and Django 6.1, with prebuilt wheels for Linux, macOS, and Windows.

04 Sep 2026 3:00pm GMT

02 Sep 2026

feedDjango community aggregator: Community blog posts

Django and deployments

I have been pondering the wider deployment space in Django for a while and from various angles. This includes my released package django-prodserver but also wondering if the DSF could provide hosting as a small scale commercial operation or what via alternatives I could offer in hosting for Django specifically. Then also I have considered what the wider API in Django could be for deployments.

These thoughts come at a good time, Will Vincent has done two talks on deploying python projects this year and I think his talks would serve as a great theoretical starting point to ensure we cover 90% of what is required. Then after DjangoCon US last week, Paolo made toot suggesting it's time for a deploy command. That toot triggered two things, first a memory of the chats I had in Athens this year and DjangoCon Europe and that I had been meaning to write about this topic for a while.

First let's consider the high level conceptual stages when deploying a project:

  1. Prepare the overall environment - signing up for an account, creating a project or just booting up a VPS
  2. Prepare Django and it's settings - these are changes made to the project repository
  3. Get the Django project from source control to the environment
  4. Do the first time setup - ideally this would be idempotent.
  5. Start the production process
  6. Doing a second deployment - because code always changes and then repeat step 5.

From this list, I think a single managed.py deploy might be too much magical to begin with, but I do think it's possible eventually. I'm thinking it's more likely deploy to be a command that stitches together several lower level commands and each of those commands correspond to a step in the above list. So we could have something like:

  1. manage.py init_deploy_env
  2. manage.py productionize
  3. manage.py deploy_project --first
  4. manage.py initialize --production
  5. manage.py prodserver web and manage.py worker
  6. manage.py deploy_project

A couple of very important points, first those names are simply examples for this post to communicate the idea and perhaps it would be best to have them all within a namespace of deploy, so manage.py deploy productionize etc.

Second and most importantly, I am very aware of the numerous possible combinations that exist when it comes to how a project can be deployed today and I am very much NOT suggesting Django support any of them. What I am suggesting is that we focus on the common API inside Django and we have packages and plugins like Eric has with django-simple-deploy. My approach here would be create an API that explicitly does nothing but simply prints expected inputs and outputs from each step. We can then start to automate the parts worth automating in a package, which may get us to a single deploy command.

Let me know your thoughts! As the maintainer of django-prodserver I have a vested interest in this space! :D

PS It's worth noting that there have been years of packages that have done similar things and we should use as reference, django-production is one such package or dj-lite for sqlite configuration in production.

02 Sep 2026 5:00am GMT

01 Sep 2026

feedDjango community aggregator: Community blog posts

"Premature" optimization

"Premature optimization is the root of all evil" - our field's favorite half-sentence, quoted far more often than the sentence it was cut from. Usually it serves as permission: build it fast, profile later, fix a thing or two, done. Let's put the sentence back together and ask what it licenses: when is optimization premature, and when is "premature" the excuse?

โ€œPrematureโ€ optimization

01 Sep 2026 10:00am GMT

28 Aug 2026

feedDjango community aggregator: Community blog posts

Issue 352: PyCharm & Django Fall Fundraiser


News

PyCharm & Django Fall Fundraiser

Buy or renew an annual PyCharm Professional license through the campaign link and you get 30% off while JetBrains donates a matching amount to the DSF, which is working to close the gap between the roughly $300,000 it raises each year and the $500,000 that would make a full-time Executive Director sustainable. The campaign runs through September 10, 2026, so buy or renew before then. A renewal adds 12 months to your existing subscription.


Django Software Foundation

DEP 0020: Annual Release Cycle

Django moves to one feature release each January under YYYY.N calendar versioning, starting with 2028.0 in place of what would have been 7.0. Every release now gets a year of mainstream support and two years of security fixes, which retires the LTS label.

The Block and Tackle of Django's Code of Conduct Working Group

The machinery behind Django's move to Contributor Covenant 3.0: a 30-day public comment period enforced by a GitHub workflow, CODEOWNERS gating changes to the CoC text, and an automated decision changelog. The working group is releasing its case-tracking templates under CC BY 3.0 for other projects to adopt.


Python Software Foundation

RISC-V is now officially supported by CPython!

CPython now supports RISC-V at tier 3, the entry level for new platforms, which means the open instruction set architecture gets ongoing testing on real hardware through buildbots donated by the RISE Project. Stan Ulbrych led the work with Ludovic Henry, Furkan Onder, and Emma Smith, backed by a Sovereign Tech Agency fellowship.


Wagtail CMS News

Wagtail 8.0

A read-and-write v3 REST API, custom base page models, a global permission policy registry, and formalized Django 6.1 support. Two smaller wins: StreamField block IDs are now available as template context variables, and AVIF and WebP images are no longer converted to PNG by default.

Wagtail security releases: 7.0.9, 7.3.4, and 7.4.3

7.0.9, 7.3.4, and 7.4.3 carry the same five fixes as 8.0: permission handling in the Pages, Documents, Images, and translation APIs, document identification by SHA1, and snippet copying. Upgrade to the patch release matching your version.

Streamlining content ops with LLMs: Wagtail user guide

Google Summer of Code contributor Raghad Dahi rebuilt the user guide site, retiring a versioning scheme that made editors duplicate the whole site per release in favor of blocks readers can filter by version. For translations, an evaluation suite scored LLM providers on cost and quality before settling on DeepSeek V4 Flash, now covering 52 languages plus right-to-left support.

CMS with AI, not AI CMS: Wagtail 8.0's new API

The thinking behind that API: rather than bolting AI buttons onto the admin, Wagtail exposes 50+ admin operations with OpenAPI docs and Markdown rich text, drivable from curl, a script, or an MCP implementation. Worked examples include fixing SEO descriptions with an LLM and a generic content importer in about 100 lines.


Django Fellow Reports

Django Fellow Report - Jacob

Jacob Tyler Walls filed an early report before heading to DjangoCon US, with his usual prolificacy triaging three tickets, reviewing nine, and authoring seven. In addition, engaged with regular security reports and provided 1-1 mentoring to his GSoC mentee, Pravin.

Editors Note

All 3 Fellows are at DjangoCon US this week, so no formal report from Sarah or Natalia. All 3 also gave excellent talks that we will link to when the videos are available later this year.


Articles

Fuzzy String Matching in Django and PostgreSQL

Four ways to match misspelled and variant names, with the trade-offs spelled out. It expands on the author's DjangoCon US 2026 talk on search-as-you-type across 54 million names.

Modern Django Deployments in 2026: My DjangoCon US 2026 Conference Talk

The slides and notes from Will Vincent's recent talk on deployments.

Nifty Django Feature: Third-Party Packages

A helpful overview of Django's third-party package ecosystem, where to look, and how to apply it in your Django projects.

When Python is Too Slow

An opinionated guide on where to turn when Python feels too slow in your application (the answer isn't always switch to Rust).

The Move to Python 3 Begins!

CCP is moving EVE Online's 2.4 million lines of Python off Stackless Python 2.7, in place since 2010, with the first changes deployed on August 25. Stage one leans on automated tools to make the code compile under both versions: 95.9% of roughly 20,000 files already do, leaving about 3,300 blocking lines (1,500 print statements, 800 long literals like 123L, 600 old-style except clauses) and another 20,000 lines that compile but behave differently and need a human to look at each one.

Core Dispatch #10

A roundup of CPython development from August 5 to 27: Python 3.12.14, 3.11.16, and 3.10.21 shipped on the 12th, 3.15.0 release candidate 2 is due September 1, and six PEPs moved, including PEP 805 on safe parallel execution and PEP 833 reaching Final for the simple repository API. Most of the discussion energy went to the competing module export proposals in PEPs 842, 843, and 844.


Events

DjangoCon Europe 2027 in Austria!

Five days of Django, Python, and community in Innsbruck, Austria, February 17-21, 2027.

DjangoCon US 2027 in Riverside, California

Join us for five days of inspiration, education, and networking at the Riverside Convention Center in beautiful Riverside, California, September 13-17, 2027.

Call for Organizers: DjangoCon US 2027

That Riverside conference needs people to run it, and more than 15 committees are recruiting, from program and sponsorship to Code of Conduct, A/V, website, and sprints. Leadership roles carry the heaviest load, with weekly check-ins and monthly board reports, but most positions do not require previous organizing experience: email hello@djangocon.us to volunteer.


Django Forum

Public thanks to our 3 Fellows

A short forum thread appreciating Django's Fellows.


Podcasts

Django Chat #205: Django Developers Survey 2026

A special summer episode on the just-released 2026 Django Developers Survey, working through what it says about Django 6.1, HTMX, async, AI, deployment, testing, and Python tooling.


Django Job Board

Two foundation roles anchor the board this week, with the DSF hiring its first Executive Director and the PSF looking for a Security Developer, alongside two full stack engineering openings.

Full Stack Software Engineer (Hybrid) at Provision

Executive Director at Django Software Foundation

AI-Assisted Software Engineer, Web Applications at Logical Media Group

Security Developer at Python Software Foundation


Projects

15r10nk/matchify

Converts eligible if/elif/else chains into Python 3.10+ match statements, preserving runtime behavior and source formatting, including isinstance checks that become class patterns with attributes.

matiasb/django-tasks-fennel

A Django Tasks backend which uses Celery as its underlying queue. Mentioned as part of the author's talk at DjangoCon US this week: Teach Django Tasks to speak Celery: Building a Celery backend for Django Tasks.

28 Aug 2026 3:00pm GMT

27 Aug 2026

feedDjango community aggregator: Community blog posts

Building large features for Django

It's been another month of slow writing and not for want, but in between holidays and the same amount of work, the blog post just got squeezed out each week. Additionally the GSoC project that I have been mentoring took a slight turn into more of a research based thing rather than trying to push anything into Django right now.

However with the GSoC research itself and the recent features of tasks, the email updates, my own prodserver package, I'm beginning to solidify in my head what a modern Django feature looks like. One thing to clarify here is when I use the word feature, I'm referencing a concept that Django can represent, such as Databases, Tasks, Emails & Storage.

These features while different in what they achieve have a very similar architecture within Django, marked by some common characteristics:

This architecture leans into Django being an API layer for various concepts that all tie together to become a website or web app. I'm taking this route with prodserver and this approach also taken by by mentee for GSoC when producing django-experimental and django-featurevault.

Django Experimental is a proof of concept around how an experimental features may be added to Django at some point. Django Feature Vault is a similar package specifically targeting an API for feature flags native to Django. Please do give them a read and a spin on a project if you like and raise issues. Both also have associated draft DEPs (Experimental, Feature Flags) available to review and comment.

I wonder if we can more formally codify this architecture (perhaps a copier package template?) to continue to smooth the on-ramp for those that want to contribute new features and ideas to Django and the community.

27 Aug 2026 5:00am GMT

26 Aug 2026

feedDjango community aggregator: Community blog posts

Modern Django Deployments in 2026: My DjangoCon US 2026 Conference Talk

A written guide to my talk on deploying Django and why 90% of it is the same.

26 Aug 2026 11:57am GMT

25 Aug 2026

feedDjango community aggregator: Community blog posts

Death by a thousand reasonable decisions

When I read consistent, cohesive code, I have a feel for its author. I may disagree with the ideas, but I can feel where the author is driving it. Other times the feel is split-brain - the code's "energy" is fractured, the work of unaligned hands each solving its own small problem, none with an idea where the whole is going. Immediately I feel it should be rewritten or refactored holistically.

Here is the paradox. Most of us are dedicated professionals with years of experience, and bad code is everywhere. Programmers I respect produce it; my own code is far from perfect. Why?

Death by a thousand reasonable decisions

25 Aug 2026 10:00am GMT

24 Aug 2026

feedDjango community aggregator: Community blog posts

Django Developers Survey 2026

๐Ÿ”— Links

๐ŸŽฅ YouTube

24 Aug 2026 5:32pm GMT

23 Aug 2026

feedDjango community aggregator: Community blog posts

When Python is Too Slow

Python is a perfect language for Agile development, where requirements might change on the go. Especially if you are in a startup business, you will need to experiment and change things fast. However, Python is an interpreted language, and in certain situations you might need faster performance than what an interpreted language can provide. A common practice in these cases is using python-to-binary bindings, where the binary code is built with Rust, C++, or Go. In this article, I will explore bindings to Rust-based code.

How do the bindings work

The idea behind bindings is that you create a module with functions of a specific domain in a language that compiles to binary, and build it as a C-compatible dynamic library (.so on Linux, .dylib on macOS, .dll on Windows). Then a Python wrapper is built as a Python package and installed together with the dynamic library, allowing you to import and use functions that pass control to the corresponding functions in the dynamic library. On some occasions, classes can be used instead of functions. If any parameters are complex, they must be serialized in the wrapper and passed to the dynamic library as a JSON string or as a set of individual primitive parameters.

An experiment with benchmarks

To try this Python-Rust communication, I vibe coded an experiment that reads a large CSV file and builds a new one with duplicates stripped out based on specified column indexes. In my test case, it was a 3 MB CSV file with data about European NGOs for the donation platform I am building, where I wanted to remove the NGOs that don't have website URLs listed. As benchmarked, the file was processed 4.3x faster with the Rust binding than directly with Python.

Here is the repo to get a first glimpse into the code and structure.

What is there to know about Rust

A few things about Rust: Rust packages are built with Cargo, which is the equivalent of pip, virtualenv, and setuptools combined. A single package is called a crate, and it can be published to crates.io, the equivalent of PyPI. To create a Python-to-Rust binding, the standard approach is to use Rust's PyO3 library together with maturin, a build tool installable as a PyPI package.

Rust syntax is not the most developer-friendly compared to Python or Go, but with today's AI agents, most Python-native code can be ported to it fairly easily. The good thing about Rust and Go compared to C++ is that you don't have to manage memory at a low level or work with pointers directly.

The package structure

The common file structure can be:

thepackage_rs/           # the package - self-contained and installable
โ”œโ”€โ”€ Cargo.toml           # crate manifest (pyo3, etc.)
โ”œโ”€โ”€ pyproject.toml       # maturin build backend config
โ”œโ”€โ”€ src/lib.rs           # Rust implementation
โ””โ”€โ”€ python/
    โ””โ”€โ”€ thepackage_rs/
        โ””โ”€โ”€ __init__.py  # Python wrapper

Once the code is ready, you build it with:

(.venv) maturin develop --release

This builds the Python package and installs it into the current virtual environment. You can also get the wheel at thepackage_rs/target/*.whl, built for your specific operating system.

Rust in Django

When developing Django websites, the biggest bottlenecks are usually not in the language itself, but in the connections to databases, file systems or object storage, and APIs. Still, in cases where you need to process large amounts of data or do heavier calculations, using a binary instead of Python makes sense. The orjson library, and DRF renderers built on top of it such as django-orjson or drf-orjson-renderer, are good examples of this - Rust boosts the speed of building or parsing JSON 2-10x compared to a Python-native implementation. The best places to use Rust replacements are background tasks, management commands, template parsing (see the experimental django-rusty-templates), and occasionally views or middleware.

Final words

So Python itself is good enough, especially when it comes to code readability and speed of development. However, when needed, certain parts can be improved 2 to 10x just by rewriting them as Python-Rust bindings. Just keep in mind that when it comes to views with data from the database or Elasticsearch, post-processing - such as reordering in Python or Rust - is an antipattern; do that directly in the queries instead. Finally, keep in mind, that building with Rust will need extra dependencies and maintainance in your workflows.


Cover photo by Alex Tepetidis

23 Aug 2026 5:00pm GMT

21 Aug 2026

feedDjango community aggregator: Community blog posts

Fuzzy String Matching in Django and PostgreSQL

Gerald Carlton and I will be presenting on fuzzy name search at DjangoCon US 2026 on Monday, August 24, and this is the companion blog post. Searching for a person by name is harder than it looks: names might be typed differently by different operators or change over a person's lifetime; for example, Smith could be entered as Smyth, Smythe, or Smidt, and Weiss as WeiรŸ. Although names are particularly susceptible to misspelling, these strategies apply to all fuzzy string matching.

21 Aug 2026 6:00pm GMT

Issue 351: DjangoCon US last call, Djangonaut Space applications open

We'll see you in Chicago! Jeff and Will are heading to DjangoCon US next week, so if you're going too, come say hi.


News

Almost Time: What to Know Before You Head to Chicago

DjangoCon US 2026 kicks off Monday, August 24 in Chicago, with registration and breakfast starting at 7:30 AM on the 14th floor. Watch for Friday's attendee email with your Slack invite and lightning-talk sign-up, and if you're sticking around for sprints on August 27-28, grab a free sprints ticket now.

New One-Day and Online Tickets

Can't make the whole week? DjangoCon US 2026 added one-day in-person tickets that also include online access to every other session, plus online-only tickets for remote attendees.

DSF Membership Open Space at DjangoCon US

Bring your questions about the Foundation to DSF board directors on Wednesday, August 26, 1:00 to 1:45 PM in the Wolf Point Ballroom.


Djangonaut Space News

Session 7 is preparing to take flight ๐Ÿ’ซ

Session 7 runs October 12 through December 6, with teams of three or four Djangonauts guided by a Navigator and a Captain, working on Django Core, django CMS, Django Debug Toolbar, the Django Girls+ website, BeeWare, and Render Engine. Plan on about five hours a week, and note that past sessions have accepted roughly 10% of applicants, so fill out every section. Applications close September 6, 2026, Anywhere on Earth.


Updates to Django

Today, "Updates to Django" is presented by Raffaella from Djangonaut Space! ๐Ÿš€

Last week we had 13 pull requests merged into Django by 6 different contributors - including 2 first-time contributors! Congratulations to Karan Suthar and Jens Spanier for having their first commits merged into Django - welcome on board!

News in Django 6.1:


Django Fellow Reports

Django Fellow Report - Jacob

Jacob Tyler Walls spent the week sweeping up after the 6.1 release, triaging admin changelist search crashes on __exact lookups, a Model.from_db() override crash, and unnecessary DDL when only a Python-level on_delete changes. He also accepted tickets for calver support in django.utils.version and for updating the release process docs under DEP 20, while GIS, caching, and the GSoC multi-column subquery work continued.

Django Fellow Report - Sarah

Sarah Boyce worked through Django 6.1 release blockers: an admin crash when ModelAdmin.get_action() is overridden with its pre-6.1 signature, values() querysets crashing on models with Meta.ordering, DecimalField without precision on SQLite, and second-degree relations in ModelAdmin.list_display looking up values on the wrong model. She also documented the YYYY[.N] versioning scheme and updated the download page for the newly approved annual release cycle.


Sponsored

Simple APM dashboards for Python. Set up in just 5 minutes

Drowning in data? Honeybadger gives you Just Enough APMโ„ข without enterprise bloat or cost.

Our dev-friendly APM dashboards expose metrics and trends across your apps and infrastructure, so you can find and fix Python issues before users notice!


Articles

Nifty Django Feature: Counting on Multiple Columns

Count only counts one column at a time, so counting unique pet-and-vet pairs returns either every appointment or every distinct vet, never the answer you wanted. The fix is a small Subquery subclass whose template wraps values("pet", "vet").distinct() in a SELECT COUNT(*), which is a nice demonstration of how far Django's expression system bends.

django-upgrade 1.32.0 out now, with 44 AI-assisted bug fixes

Adam Johnson turned Claude loose on django-upgrade with the prompt "Find and fix bugs" and shipped 44 fixes across two rounds. The catches include url() to path() conversions that mangled regexes with literal angle brackets or unescaped dots, a five-year-old fixer that rewrote calls to html.escape() when it meant html.unescape(), and a multi_db = False mapping that produced an empty database list and blocked every query in a test.

Nearly 20 years of choosing Django

Lincoln Loop has attended or sponsored most DjangoCons since the first one in California in 2008, where founder Peter Baumgartner gave an early lightning talk. The team credits the conference with teaching them how to work a booth, order swag people actually wear, talk to strangers, and, for several of them, get over a fear of public speaking.

Docker Compose reads .env files by default

Compose reads the .env file in the directory you run it from and honors any COMPOSE_* variables it finds there, which is easy to miss if you think of .env as something that only reaches your containers. Frank Wiles uses it to set COMPOSE_FILE=compose.yml:overlay-compose.yml per directory, so a worktree can remap ports and add labels without touching the shared compose file.


Events

Start DjangoCon US at the Welcome Reception

Kick off the conference Sunday, August 23, 7-9 PM in the 15th Floor Lobby, with casual conversation and drinks courtesy of REVSYS, Two Rock Software, and Caktus Group.

Sign up for Travel Safety Checks & Chicago Travel Safety Updates

Traveling to Chicago from out of town or abroad? Sign up for the optional Travel Safety Check so someone can check in with you by WhatsApp or Signal once you've arrived.

Introducing Open Spaces! (And Why You Should Host One)

Pitch a topic on a sticky note and host your own participant-led discussion during Monday and Tuesday's Open Spaces sessions in the Wolf Point Ballroom.


DjangoCon US

TIME RUNNING OUT! 10% off

Join us in Chicago or ONLINE! August 24-26 for the main conference, followed by two days of sprints. Online and one day tickets also available.


Videos

Interview with Django Expert Paolo Melchiorre on AI and Open Source

DSF Board Member Paolo Melchiorre talks about Django, AI-assisted development, open-source maintainership, and how the Python community is adapting to AI.

Why AI Coding Agents Fail on Real Codebases - Sheena O'Connell on Spec-Driven Development

PSF director and Django developer Sheena O'Connell sat down at PyCon US to discuss spec-driven development, AI agents, and why so many teams struggle to make agentic coding work in practice.


Django Job Board

Full Stack Software Engineer (Hybrid) at Provision

Toronto-based construction-AI startup building full-stack product surfaces and AI-forward document-processing systems.

Executive Director at Django Software Foundation

Remote US role running the DSF's fundraising, operations, and public representation as its first Executive Director.

Security Developer at Python Software Foundation

Global remote role triaging CPython/PyPI vulnerabilities and remediating supply-chain attacks alongside the Python Security Response Team.

Senior Full Stack Engineer at Hive Collective

US-only remote, backend-leaning full-stack role at a profitable LegalTech SaaS with an AI-assisted workflow.

Senior Backend Engineer at MyOme

Remote US backend role building portal integrations for patients and providers ordering genetic testing.

Python + TypeScript Engineers at Fusionbox

Remote US consultancy role building Django/React systems for financial workflows and multi-tenant architectures.


Projects

alzeph/django-forge-log

A lightweight, automatic audit trail - Who, What, When, Where, and the before/after Diff - for Django views (FBV, CBV, DRF ViewSets) and the Admin, stored in a single central JSON table.

tim-schilling/django-salmon

Does the monkey-patching of Django's internals once, then exposes a standardized set of signals so APM and observability tools do not each have to reinvent it. Receivers get args, result, timing, and a lazy stacktrace, and the decorator stack per facet is configurable.

21 Aug 2026 3:00pm GMT

18 Aug 2026

feedDjango community aggregator: Community blog posts

Exotic `goto`: generators and exceptions

The last post argued that break, continue, and labeled jumps are structured goto - disciplined jumps that keep code linear. Two ordinary language features are jumps in disguise: yield, which suspends a function and later resumes it in the middle, and throw, which leaps across stack frames to a waiting handler.

Exotic goto: generators and exceptions

18 Aug 2026 10:00am GMT

Django: django-upgrade 1.32.0 out now, with 44 AI-assisted bug fixes

django-upgrade is my tool for automatically upgrading your project code for new Django versions. It rewrites your Python files to fix deprecations and adopt some new features, taking a chunk of the monotony out of upgrading between Django versions.

Yesterday, I released version 1.32.0, which fixes 44 bugs. Some are big, some are small, and all of them were found by Claude Fable, with this simple prompt:

Find and fix bugs

Yup, that's it. Across two rounds of self-directed bug discovery, Claude found and fixed these bugs, matching the coding style and changelog entries. It needed one more prompt to split the fixes into individual commits.

I am pretty astounded at how well this little project worked. Claude worked "in the cloud", while I was doing other stuff, so the bottlenecks to progress were my review capacity and CI runs on GitHub Actions for each commit.

My big takeaway is that given such LLM power, the bar for software quality should be raised.

Let's review some of the bugs that it fixed, within the individual code fixers in django-upgrade.

Bad url() to path() conversions

The django_urls fixer converts old url() calls, with their regular expression patterns, into path() calls with the newer route syntax, where possible.

Claude found two cases where the "where possible" condition was too optimistic.

First, literal angle brackets. In a regular expression, < and > are literal characters, but in path() route syntax they declare parameters. The fixer copied them through unchanged:

-    url(r"^go/<page>/$", views.redirect_angle),
+    path("go/<page>/", views.redirect_angle),

The old pattern matched only the exact URL /go/<page>/, angle brackets included. The new route matches /go/anything/ and passes page as a keyword argument to the view, which likely isn't expecting it. And if the bracketed text isn't a valid Python identifier, like <not-a-name>, Django instead raises ImproperlyConfigured at startup. PR #715 made the fixer skip such patterns.

Second, unescaped dots. In a regular expression, a bare . matches any character, whilst \. matches only a literal dot. The fixer treated both the same, converting:

-    url(r"^report.pdf$", views.report),
+    path("report.pdf", views.report),

The old pattern also matched URLs like /reportxpdf, so the conversion silently narrowed which URLs the pattern matches. Most such patterns contain a "latent bug" where the author meant \., but it's not django-upgrade's place to change behaviour. PR #710 made the fixer leave patterns with unescaped dots alone.

These two bug fixes have hopefully closed a loop for me on a client project. Last year, I tried applying django-upgrade to a large client project, and it failed some tests. In my investigation, I cut down the fixers being applied to a short list, including django_urls, and still some tests failed. I reached the suspicion that some URLs were being converted incorrectly, but I ran out of time to properly investigate. Now a bot has found and fixed these bugs without me even trying, I'll be trying that upgrade again!

Escaping backwards

Django 3.0 deprecated django.utils.text.unescape_entities() in favour of Python's html.unescape().

Back in version 1.2.0 (2021), I added the unescape_entities fixer to django-upgrade to rewrite calls to the new function. But I accidentally made it rewrite calls to the inverse function, html.escape() instead of html.unescape():

-from django.utils.text import unescape_entities
+import html

-text = unescape_entities(raw)
+text = html.escape(raw)

Woops! You can see how the results would vary:

>>> html.unescape("Tom &amp; Jerry")
'Tom & Jerry'
>>> html.escape("Tom &amp; Jerry")
'Tom &amp;amp; Jerry'

๐Ÿ˜ฌ

PR #684 was the bug fix to correctly rewrite code to use html.unescape().

This fixer survived nearly five years of use, perhaps through a combination of few projects activating it, no one noticing when it broke their code, and users potentially working around the issue by disabling the fixer. I'm glad Claude could spot the obvious error.

TestCase.multi_db = False fixer blocking all database queries

Django 2.2 replaced the test case attributes allow_database_queries and multi_db with databases.

django-upgrade rewrites those old attributes to the new one, but it mapped multi_db = False to an empty list:

 class OrderTests(TestCase):
-    multi_db = False
+    databases = []

That looks sensible at first glance, but it's wrong. Under Django's deprecation shim, multi_db = False still allowed queries against the default database. The rewritten databases = [] blocks queries against all databases, breaking previously-working tests with DatabaseOperationForbidden errors.

PR #727 corrected the mapping:

 class OrderTests(TestCase):
-    multi_db = False
+    databases = ["default"]

This is another bug I introduced in version 1.2.0. I guess no one hit this code path, since it would trigger an obvious test case breakage. But with open source, it is hard to know how many folks will actually make a bug report.

Bar height++

These bug fixes are a subset of the 44 in the release-see the changelog for the full list. There are definitely some more bugs lurking, but for now I'm out of time and energy for django-upgrade. I even left some harder-to-review bug fixes in draft PRs for my next pass at the project.

But yeah, since bugs like these are now fairly cheap to find, I hope that the software quality bar goes up. Applying fixes still requires some vigilance in review and checks from deterministic tools like linters, but good projects generally already apply such tools. And while it can be hard to trust LLMs to build features, where they often large piles of code, this genre of small, targeted bug fixes are an easy win.

Try my prompt on your own project. Here it is again:

Find and fix bugs

Fin

May robot eyeballs make all your bugs shallow,

-Adam

18 Aug 2026 4:00am GMT

14 Aug 2026

feedDjango community aggregator: Community blog posts

Issue 350: Django moves to an annual release cycle

News

Django moves to an annual release cycle

Starting in January 2028, Django switches from its eight-month cycle to one feature release per year (matching Python's annual October releases), dropping the LTS distinction in favor of every release getting one year of mainstream support followed by two years of security and data-loss fixes; nothing changes before then.

DSF Office Hours

The DSF Board holds open office hours every Wednesday at 6:00 PM UTC, no agenda or invitation needed. Right now the main topics are the Executive Director search and the 2026 fundraising goal.

Django Girls - August Newsletter

Tie-in with Djangonaut Space for a team to work on the Django Girls infrastructure during the upcoming session. Plus a call to join the Social Media Team.

PyPI freezes the HTML index API

PyPI is adopting PEP 833 to stop extending the HTML simple-index format with new metadata, pushing future additions to the JSON API instead; nothing breaks and no action is needed unless you're a mirror or bulk consumer, in which case consider switching to JSON.


Releases

Django REST Framework 3.18.0

Django REST Framework 3.18.0 drops support for Django 4.2, 5.0, and 5.1, adds Django 6.1 support, and changes list-serializer (many=True) errors to a dict format. It also adds a @throttle_scope decorator for function-based views, unaccent support in SearchFilter, and nulls_distinct support for UniqueTogetherValidator.

Python 3.12.14, 3.11.16, and 3.10.21 are now available!

Security-only releases for the three versions, fixing roughly 30 vulnerabilities including path-traversal issues in tar/ZIP extraction, billion-laughs protection in XML parsing, and (for 3.11 and 3.10) an SSL certificate parsing fix; upgrading is highly recommended.

Wagtail 8.0rc1

The first 8.0 release candidate adds custom base page models, a global permission-policy registry, and rich-text-to-HTML serialization in the v2 API. It stops downconverting AVIF/WebP images to PNG by default and adds provisional Django 6.1 support, pending django-ninja compatibility.


Django Software Foundation

Django Steering Council Meetings - 2026

At its August 3 meeting, the Steering Council voted on DEP 19 membership matters, discussed DEP 20's annual release cycle, and talked through what "Django Core Developer" should mean. Fellows also flagged DEP 19 implementation gaps, a naming question for the ORM's RAISE fetch mode, and an upcoming table-expressions proposal.


DjangoCon US

Save 10% on DjangoCon US 2026 registration

DjangoCon US 2026 runs August 24 to 28 in Chicago and ONLINE, now under two weeks away. Register through our link to take 10% off. A new One Day rate is now available if you can't make the whole week. Time is running out to get your ticket. Get yours before they are gone! Online tickets available.


Python Software Foundation

Announcing the Packaging Council Election Candidates for 2026!

The inaugural Python Packaging Council election has 17 nominees for 5 seats (the top 2 get two-year terms, the next 3 get one-year terms); PSF voting members must affirm by August 25 at 2:00 pm UTC, with voting running September 1-15.

Announcing the PSF Board Candidates for 2026!

18 candidates are running for 4 open PSF Board seats, with the same August 25 affirmation deadline and September 1-15 voting window; members who voted last election are carried over automatically unless their email changed.


Wagtail CMS News

Free talk ideas for Wagtail Space 2026

Wagtail Space 2026 runs November 18-20, and the CFP is open at pretalx.com/wagtail-space-2026/cfp; organizers are capping AI-focused talks at roughly half the program, so non-AI proposals stand a better chance.


Updates to Django

Today, "Updates to Django" is presented by Raffaella from Djangonaut Space! ๐Ÿš€

Last week we had 14 pull requests merged into Django by 8 different contributors - including 2 first-time contributors! Congratulations to Jakob Friedrich and OsmnvAslan for having their first commits merged into Django - welcome on board!

The fetch mode that raises a FieldFetchBlocked exception has been renamed to FETCH_RAISE.

Thanks to the contributor's effort, the admin save_as behavior for view-only inlines has been fixed, ensuring they are correctly rendered after validation errors.

The documentation for converting a ManyToManyField to use a through model has also been updated for converting correcting incorrect on_delete options and adding some additional caveats.


Django Fellow Reports

Django Fellow Report - Jacob

Django 6.1 shipped this week. Jacob also cross-pollinated GSoC's multi-column subquery work with a search-performance improvement he tried out on djangoproject.com.

Django Fellow Report - Natalia

Most of Natalia's week went to the security release, then assisting Jacob with the Django 6.1 final release, including translation updates that turned into a bit of a spiral.

Django Fellow Report - Sarah

Sarah's main focus was the GSoC project migrating Django's integration tests from Selenium to Playwright, which she hopes to land soon.


Articles

Nifty Feature: Admin Form Injection

Reuse Django admin's built-in popup machinery (showRelatedObjectLookupPopup() and dismissRelatedLookupPopup()) to build custom popup workflows that inject a value into an admin form field, not just the stock foreign-key picker.

Storing Django Static and Media Files on Cloudflare R2

A walkthrough of wiring django-storages and boto3 up to Cloudflare R2 (zero egress fees), using two buckets: a public one for static files and public media with querystring_auth = False, and a private one for restricted media served through signed URLs.

Introducing django-msgspec

django-msgspec swaps in msgspec, a C-based serializer several times faster than the standard library, as a drop-in replacement for JsonResponse, DRF's parsers and renderers, session serializers, and more. It handles numeric dict keys and huge integers that trip up orjson, though it encodes non-finite floats as null and rejects None/boolean dict keys.

Newlines

Why splitting text into lines is trickier than it looks, and why Python's splitlines() recognizes ten different line-break code points.

Introducing emojet, a fast emoji lookup library

Adam Johnson built emojet, a Rust-backed replacement for the emoji package's emojize()/demojize(), after finding that package's 520 KB JSON file cost 22ms just to import. emojet imports 23.7x faster, is up to 70x faster on lookups, and uses about 40% less memory.


Events

Keynote: Boldly Go, Building Worlds: Is there Room for me on the Bridge? - Dawn Wages

Dawn Wages opens DjangoCon US 2026 Monday at 9:00 AM, drawing on Star Trek and Octavia Butler's Afrofuturism to reflect on a decade in the Python community (PSF Board Chair, Django Girls, Wagtail) and what it takes to build equitable, accountable open source spaces.

What I'm looking forward to at DjangoCon US 2026

Attending for his fifth year, the author is most looking forward to the people, an open-spaces package-maintainers discussion, running Sprints as chair alongside Kudzayi Bamhare, and the speakers dinner. He'll also be handing out handmade bookmarks to fellow readers.

DjangoCon US 2026 conference prep

Three quick logistics posts from the organizers: why you should volunteer (badges, room timing, and speaker support, no experience needed), how to give a Lightning Talk (five minutes, any topic, sign-up announced onsite), and how to stay active (a Strava group, the hotel's pool and gym, and the 18-mile Lakefront Trail).


Videos

Introducing t-strings: f-strings with superpowers - Dave Peck (PyCascades 2026)

Dave Peck introduces Python 3.14's t-strings, which look like f-strings but evaluate to Template instances, helping prevent SQL/HTML injection and enabling custom formatting via libraries like tdom and t-sql. He covers when to reach for them, adoption strategies, and current editor tooling support.


Django Job Board

Full Stack Software Engineer (Hybrid) at Provision ๐Ÿ†•

Toronto-based construction-AI startup building full-stack product surfaces and AI-forward document-processing systems.

Executive Director at Django Software Foundation ๐Ÿ†•

Remote US role running the DSF's fundraising, operations, and public representation as its first Executive Director.

Security Developer at Python Software Foundation

Global remote role triaging CPython/PyPI vulnerabilities and remediating supply-chain attacks alongside the Python Security Response Team.

Senior Full Stack Engineer at Hive Collective

US-only remote, backend-leaning full-stack role at a profitable LegalTech SaaS with an AI-assisted workflow.

Senior Backend Engineer at MyOme

Remote US backend role building portal integrations for patients and providers ordering genetic testing.

Python + TypeScript Engineers at Fusionbox

Remote US consultancy role building Django/React systems for financial workflows and multi-tenant architectures.


Projects

adamchainz/django-msgspec

msgspec-powered utilities for Django.

adamchainz/emojet

Convert, find, and count emoji in Python.

14 Aug 2026 3:00pm GMT

12 Aug 2026

feedDjango community aggregator: Community blog posts

Weeknotes (2026 week 33)

Weeknotes (2026 week 33)

Holidays and the heat wave

I had four weeks of holidays this summer. The timing couldn't have been much better with the heat wave - doing much thinking seems to be impossible anyway. I organized a multi-day feast with a few friends and with much help from others. We built up the site and installations over the course of multiple days and spent some days tearing most of it down afterwards. I started back to the office job physically tired but mentally rested. That's good. I'm really looking forward to seeing the pictures people took.

What's less good is that we're living through the projections which climate scientists warned us about decades ago. Or worse, even, since Switzerland is one of the regions where the temperature increased more than the global average. The member of Switzerland's Federal Council heading the Federal Department of the Environment, Transport, Energy and Communications reportedly said that he didn't expect such intense heat. Of course, it was reported earlier in the same week that the same member was responsible for removing funding for a more resilient forest from the budget for the next fiscal year. This is unfortunately to be expected: he has long been connected to the fossil energy industry. After all, he was also the president of Swissoil and Auto Schweiz. It's really frustrating. None of this is news to climate scientists, and it hasn't been news here either - these posts start in 2005, back when I was studying environmental sciences at ETH with a focus on atmospheric physics.

Scripts for auto-merging dependabot and pre-commit pull requests

I let Claude write some scripts for automatically merging pull requests created by various bots, see here. The script finds pull requests created by a predefined list of bots in a defined list of accounts (organizations or users) and squash-merges them if the CI run is green and there are no conflicts. It's a dry run by default; --apply is required to actually merge anything. It doesn't look at reviews and doesn't care whether a bump is major or minor - I'm relying on the test suites for that.

The ruff 0.16 update was a bit painful because ruff now enables 413 rules by default, up from 59. Recurring themes were warnings about mutable class variables (which are common when using Django), blind except clauses and underspecified dates without time zones, but none of them in scenarios where they actually hurt.

So, instead of just running the merge script, I had to fix up dozens of pyproject.toml files and projects. Oh well, next time will be smooth again.

Releases

Since I've been away from the computer for so long, the list of releases from the start of July onwards is quite short.

django-authlib

django-authlib 0.18 now also supports Microsoft Entra ID logins. The admin integration also has support for Microsoft accounts, not just for Google.

django-content-editor

The django-content-editor 9.0.1 just contains a small fix which avoids submitting the form that allows cloning content between regions when cancelling the dialog.

12 Aug 2026 5:00pm GMT