21 Aug 2026

feedDjango community aggregator: Community blog posts

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