Django is a Python web framework used extensively in media, government, research, and enterprise applications. Its template system produces server-rendered HTML, which provides a solid accessibility foundation - screen readers receive complete content without waiting for JavaScript. However, Django's template inheritance, form rendering, and third-party app ecosystem create accessibility patterns that need deliberate attention. Under the EAA, Django applications serving EU consumers must meet EN 301 549 requirements.
Common Django accessibility issues
Default form rendering produces inconsistent markup
Django's form rendering methods ({{ form.as_p }}, {{ form.as_table }}, {{ form.as_div }}) produce different HTML structures with varying accessibility quality. The default renderers may not include proper aria-describedby associations for help text and error messages, and the as_table method produces table-based layouts that are semantically incorrect for forms.
Template inheritance can break heading hierarchy
Django's template inheritance system ({% extends %} and {% block %}) lets child templates override sections of parent templates. Without coordination between parent and child templates, heading hierarchy breaks - a parent template might set h1, while a child template starts its content at h3.
Admin-generated content lacks structure enforcement
Django's admin interface and CMS-like apps (Wagtail, django-cms) let content editors create rich text content. Without editor configuration to restrict available formatting, authors produce content with skipped heading levels, images without alt text, and improperly structured tables.
Third-party apps produce their own HTML
Django's app ecosystem (django-allauth, django-tables2, django-filter, django-crispy-forms) provides pre-built functionality with its own templates. These templates have varying accessibility quality and may not match the accessibility standards of your base templates.
HTMX and Turbo partial updates need live regions
Modern Django applications increasingly use HTMX or Hotwire Turbo for partial page updates. These libraries swap HTML fragments without full page reloads, and the swapped content isn't automatically announced to screen readers.
How Lumi works with Django
Lumi scans your Django application's rendered HTML across all URL patterns - template-rendered pages, form submissions, paginated lists, and dynamically updated content. Our five engines detect issues in Django's template output, form rendering, third-party app markup, and any client-side update mechanism. Monitor continuously to catch regressions from deployments and content changes.
Django-specific WCAG gotchas
Django's server rendering eliminates some SPA problems
Django's traditional request-response model means each page load delivers complete HTML, and the browser announces page changes naturally. This avoids the client-side routing problems of React/Vue SPAs - but only as long as you're not using HTMX, Turbo, or similar partial update tools.
Crispy Forms and form rendering libraries have their own profiles
django-crispy-forms, django-widget-tweaks, and similar libraries override Django's default form rendering. Each produces different HTML with different accessibility characteristics - switching form rendering libraries requires re-validating form accessibility.
Scan your Django site for free
See how your site measures up against WCAG 2.2 and EN 301 549 - in 30 seconds, no signup required.
Frequently asked questions
Is Django accessible by default?
Django's server-rendered model provides a strong foundation, but the framework doesn't enforce accessible HTML in templates. Django's default form rendering has been improving but still has gaps in ARIA attribute usage. Accessibility depends on your templates, form configuration, and content practices.
How do I make Django forms accessible?
Use custom form renderers or django-crispy-forms with an accessible template pack. Ensure each input has a visible label element with a matching 'for' attribute, associate error messages and help text via aria-describedby, group related fields with fieldset and legend, and mark required fields with both visual indicators and the required attribute.
Does the EAA apply to Django web applications?
The EAA applies based on the service provided. Django applications serving EU consumers with in-scope services - government portals, e-commerce, media, financial services - must meet EN 301 549.
How does Wagtail CMS affect accessibility?
Wagtail (a Django-based CMS) has an active accessibility team and has made significant improvements to both its admin interface and its frontend output. Wagtail's StreamField system encourages structured content blocks which can be made accessible, but accessibility still depends on the specific block implementations and theme templates.
Related resources
Last reviewed: April 2026. Content is reviewed quarterly for accuracy.