24 Jul 2026
Django community aggregator: Community blog posts
Issue 347: Django 6.1 release candidate 1 released
News
Django 6.1 release candidate 1 released
This is the final opportunity to try out the new version before Django 6.1 is released. Try it, run your test suite, and report anything that breaks!
The DjangoCon US 2026 schedule has been released!
The talk lineup is out, covering Django 6.0 and 6.1 features, modern deployment patterns, GeoDjango at scale, and lightning talks across all three days.
PyPI Releases now reject new files after 14 days
PyPI will reject new files uploaded to releases older than 14 days to limit the impact of compromised publishing tokens or workflows.
Planned Updates to the PyPI User Interface
PyPI's first UI refresh since 2018 will roll out in phases over the coming months, surfacing more security signals on package pages. The first phase is staged on TestPyPI now and ready for your feedback.
Wagtail CMS News
What our AI guiding principles actually mean
Wagtail unpacks its refreshed AI guiding principles and how they steer adoption in practice, starting with a firm commitment: no AI dependency in Wagtail core, with AI features staying opt-in through packages like Wagtail AI.
Django Software Foundation
DSF Board monthly meeting, July 09, 2026
Minutes from this month's DSF Board meeting: a host for DjangoCon Europe 2027 was approved, a new Google Summer of Code Working Group was chartered, Executive Director hiring continues with guidance from the PSF, and grants went to PyCon Cameroon and PyCon Africa.
Updates to Django
Today, "Updates to Django" is presented by Raffaella from Djangonaut Space! ๐
Last week we had 17 pull requests merged into Django by 11 different contributors - including 6 first-time contributors! Congratulations to Tom Most, CharulL00, Sina Chaichi Maleki, Harvey Bellini, Stephanie and Vismay for having their first commits merged into Django - welcome on board!
News in Django 6.2:
- The
MiddlewareMixinclass moved fromdjango.utils.deprecationtodjango.middleware. The old import path is deprecated in Django 6.2. - Whether to suppress an
ImportErrorescaping from a settings module is configurable by the newBaseCommand.requires_settingsattribute (defaultTrue). In previous versions, such errors were always suppressed. - The minimum supported version of
asgirefis increased from 3.9.1 to 3.12.1.
Thanks to the continuous efforts of the contributors, a SQLite regression test has also been added to inspectdb when a table has a foreign key that references sqlite_master. (#25243)
Support for prefers-color-scheme was also implemented, adding dark mode CSS overrides for the technical 500 (traceback) and 404 debug views. (#35875)
Django Fellow Reports
Django Fellow Report - Natalia
A security-heavy week: two patches for confirmed vulnerabilities, deep-dive reviews of two more, and prep for the August release with CVE metadata and prenotifications, plus continued iteration on EmailValidator improvements.
Django Fellow Report - Sarah
Reviews across Django and djangoproject.com, including the Selenium to Playwright migration and admin widget fixes, plus a new GitHub Action to test djangoproject.com against Django main and engagement on six security issues across Django and djangoproject.com.
Django Fellow Report - Jacob
Sustained attention on a couple of security reports, alongside triage and a long review list covering dark mode error pages, Oracle Test Pilot in CI, and the asgiref 3.12 update that enables free-threading tests.
Python Software Foundation
Get Ready: PSF Board Nominations Opening Soon!
PSF Board nominations open July 28, with voting September 1-15. If you're a voting member, affirm your intent to vote by August 25.
Get Ready: 2026 Python Packaging Council Nominations Opening Soon!
Nominations for the first-ever Python Packaging Council open July 28 and close August 11.
Events
Django Girls Chicago - August 22, 2026
Django Girls returns the Saturday before DjangoCon US in Chicago: build your first website, eat free food, and meet fellow aspiring Django developers. The free workshop is limited to 45 people and applications close August 12, so apply early.
Preparing for sprints as a project leader (at DjangoCon US)
As DjangoCon US approaches in just a few weeks time, here are some good tips on how to make the most out of the sprints following the tutorial talks.
A First-Timer's Guide to Navigating America
If you are attending DjangoCon US, please do follow the news section of the website, as it has helpful articles like this one, as well as info on childcare at the conference, and more.
Sponsored Link
When is it worth paying for a mentor?
Thinking about hiring a mentor to grow as a Django developer? Here are a few honest questions to help you get clarity on whether now's the right time.
Articles
Django: introducing django-crawl
Adam Johnson introduces django-crawl, a new package that crawls your whole site with Django's test client (via links, sitemaps, or a Python API) to surface broken pages before your users do.
Nifty Django Feature: Form Templates
Django's form templates separate a form's HTML from the view that processes it: set template_name on the form for one reusable layout, or on an individual field when a single input needs custom markup.
Some more things about Django I've been enjoying
Building a "2010 style" backend-heavy web app, this writeup highlights Django's readable query builders, handy template filters like querystring and json_script, and the comfort of automatic migrations. It also covers the author's practical performance questions, including a misconfigured cached template loader and why it mattered.
Browser Push Notifications for a Django Website
A step-by-step tutorial on adding browser Web Push notifications to a Django site using VAPID keys, a service worker, and a Huey background task, so you get OS-level notifications even when the admin tab is closed.
Is it time to go back to Django?
Some arguments for Django's opinionated, batteries-included approach in the AI-coding era, since it limits the decisions an AI agent has to make and reduces the chance of it going astray.
Deploying Web Apps in 2026: My EuroPython Conference Talk
The written version of Will Vincent's EuroPython talk, which maps today's hosting landscape and builds a ten-step mental model of everything your dev server quietly handles for you, from WSGI servers and static files to running migrations at release time.
My EuroPython 2026 - Paolo Melchiorre
A day-by-day recap of Paolo Melchiorre's EuroPython 2026 in Krakรณw, compiled from Mastodon posts and photos, from the Python Steering Council update to rethinking asyncio for free-threaded Python and time with the Django community at the booth.
EuroPython 2026 Recap - Will Vincent
Highlights from a packed week in Krakรณw, where the standout theme was agentic AI workflows, with teams split between off-the-shelf tools and heavy internal tooling.
PyCon US 2026 Recap - Katherine Michel
Katherine's famous PyCon recap is here! Security and AI front and center, PSF and PyPI updates, steering council priorities for free-threading, and lots of great pictures.
Events
Django on the Med
Three days of Django development sprints, September 23-25 in Pescara, Italy. The second edition is free to attend and gathers Fellows, board and Steering Council members, and contributors new and experienced to push Django forward.
Django Day Copenhagen 2026
October 2 in Copenhagen. The first three talks are by Marijke Luttekes, Efe รge, and Denny Biasiolli.
Django Job Board
Three new remote openings join the board this week, from AI-native full-stack work at Hive Collective to Django backend engineering for genetic testing at MyOme and Python + TypeScript roles at Fusionbox.
Senior Full Stack Engineer at Hive Collective ๐
Senior Backend Engineer at MyOme ๐
Python + TypeScript Engineers at Fusionbox ๐
Freelance Full-Stack Web App Developer at Mindrift
Projects
adamchainz/django-crawl
An in-process site crawler using Django's test client.
FROWNINGdev/django-orm-lens
See your entire Django schema (every model, field, and relationship) in your editor, terminal, or AI agent, one keystroke away from a live ER diagram.
24 Jul 2026 3:00pm GMT
22 Jul 2026
Django community aggregator: Community blog posts
Tracking Blips
bliptracker was a side project that I happened to produce during June and last week realised I hadn't written about it here, so here goes!
One annoyance I have with Claude.ai (or other web based LLM interfaces), is that I would start multiple conversations across multiple topics such as client work, organising my Todoist, an idea to explore, gifts to research, the list goes on, but I was keeping open tabs for each conversation to not lose track of the active conversations, but this didn't work as I still had those open loops in my head to follow up to move each conversation forwards.
I didn't want a full blown task manager (I pay for Todoist which fits perfectly), but I did want to track the state of each conversation in Claude from both the web app and the mobile. The result is a two fold solution, first there is a system prompt telling Claude to end each respond with either a ๐ด, along with the next action required from me, or a โ which tells me the conversation is resolved. The second part of the solution is a Chrome extension which then automatically updates the title of any conversation with the red dot or green check mark, so I can tell at a glance which chats need work and which are done.
I do have a couple more features planned such as supporting other LLMs and a possible snooze feature. But for now it's a small working project that keeps my chats organised. It's available at bliptracker.xyz.
One final point on this project, I hope that eventually it gets replace by Anthropic building a better native product for tracking the status of chats, it's very limited right now. More widely this highlights that while new models are powerful and can do more, it still requires us as engineers to build products that solve actual problems in novel, tasteful and well designed solutions. That is what we pay for when buy a tool and what our users expect from us and something that no model as far as I can see will ever replace.
22 Jul 2026 5:00am GMT
Django: introducing django-crawl
I recently migrated one of my client projects from the legacy django-csp package to Django 6.0's built-in Content Security Policy (CSP) support (release note). This security header is a powerful tool for preventing unwanted content from being loaded on your site, so configuration correctness is paramount. The migration was fairly straightforward, but a few pages had complicated overrides, so I wanted to be sure that no CSP headers had been changed by my swapping of CSP implementations.
I had the idea to verify no page had changed its content-security-policy header by crawling the site with Django's test client, outputting URL and header contents during the process. By diffing the output from crawls before and after the migration, I could check for changes and track down which pages had been affected.
The core loop of that script looked something like this:
from collections import deque
from django.test import Client
client = Client()
client.force_login(superuser)
queue: deque[str] = deque(["/", "/admin/"])
...
while queue:
url = queue.popleft()
...
response = client.get(url, follow=False)
...
print(f"{url}\t{response.headers.get('content-security-policy')}")
...
for anchor in BeautifulSoup(response.content, "html.parser").find_all(
"a", href=True
):
# Enqueue these found links
...
This simple crawl of the site ended up flushing out seven non-CSP bugs, despite the project having 100% test coverage and a full suite of integration tests. Those bugs were due to incorrect link generation, admin features not being disabled, and regular old broken code.
I was pretty impressed with the power of this technique for finding broken stuff! Given this experience, I wanted to expand the script into a reusable tool, which I have now done with django-crawl.
To use django-crawl, install it, add it to INSTALLED_APPS, and you can run the crawl management command:
$ ./manage.py crawl -v 2
๐ Crawling up to 1000 URLs, logged in as Ad Min
/
/about/
/blog/
/contact/
/dev/
/blog/2026/
/blog/2025/
/blog/2026/07/22/introducing-django-crawl/
...
๐ฆ Crawled 1000 URLs, encountered 0 errors, stopped due to reaching max URL limit of 1000.
The command reports any errors it encounters, from broken links to exceptions. The output uses Rich for pretty formatting and a live spinner while it runs. Adding -v 2 prints the URLs as they are crawled.
The crawler discovers links in various forms in HTML responses (<a href>, <link href>, <script src>, <img src>, etc.), sitemaps, and feeds. If you have a sitemap, you can start your crawl with a simple:
$ ./manage.py crawl /sitemap.xml
The HTML parsing is done with a custom Rust extension built with html5ever, the HTML parser from the Servo project, so it's very fast. And with no overhead from real HTTP requests or inter-process communication, the crawl is limited only by how fast your application code can run.
django-crawl also provides a Python API that you can use to make a mega-test that crawls your whole site with example data, raising an ExceptionGroup if any errors are encountered:
from django.contrib.auth.models import User
from django.test import TestCase
import django_crawl
class CrawlTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.admin = User.objects.create_superuser(username="admin")
def test_crawl(self):
client = django_crawl.CrawlClient()
client.force_login(self.admin)
django_crawl.crawl("/", "/admin/", client=client)
I am not sure if this is a good fit for most projects, since it will leave you with one long test that exercises many views. But it might be good for building a "safety net" on untested projects, something I know Jeff Triplett likes to do (ref Django Chat #24).
Fin
Please try out django-crawl today and let me know how it goes.
May your site not slow to a crawl,
-Adam
22 Jul 2026 4:00am GMT