Middleware¶
- class django_htmx.middleware.HtmxMiddleware[source]¶
This middleware attaches
request.htmx, an instance ofHtmxDetails(below). Your views, and any following middleware, can userequest.htmxto switch behaviour for requests from htmx. The middleware supports both sync and async modes.See it action in the “Middleware Tester” section of the example project.
Set the
Varyheader for cacheable responsesIf you set HTTP caching headers, ensure any views that switch content with
request.htmxattributes add the appropriate htmx headers to theVaryheader, per Django’s documentation section UsingVaryheaders. For example:from django.shortcuts import render from django.views.decorators.cache import cache_control from django.views.decorators.vary import vary_on_headers @cache_control(max_age=300) @vary_on_headers("HX-Request") def my_view(request): if request.htmx: template_name = "partial.html" else: template_name = "complete.html" return render(request, template_name, ...)
Hint
If you are type-checking your Django project, declare
request.htmxas below in any customHttpRequestclasses, per the pattern in django-stubs.from django.http import HttpRequest as HttpRequestBase from django_htmx.middleware import HtmxDetails class HttpRequest(HttpRequestBase): htmx: HtmxDetails
- class django_htmx.middleware.HtmxDetails[source]¶
This class provides shortcuts for reading the htmx-specific request headers.
- __bool__()[source]¶
Trueif the request was made with htmx, otherwiseFalse. Detected by checking if theHX-Requestheader equalstrue.This method allows you to change content for requests made with htmx:
from django.shortcuts import render def my_view(request): if request.htmx: template_name = "partial.html" else: template_name = "complete.html" return render(request, template_name, ...)
- Return type:
bool
- boosted: bool¶
Trueif the request came from an element with thehx-boostattribute. Detected by checking if theHX-Boostedheader equalstrue.You can use this attribute to change behaviour for boosted requests:
def my_view(request): if request.htmx.boosted: # do something special ... return render(...)
- current_url: str | None¶
The current URL in the browser that htmx made this request from, or
Nonefor non-htmx requests. Based on theHX-Current-URLheader.
- current_url_abs_path: str | None¶
The absolute-path form of
current_url, that is the URL without scheme or netloc, orNonefor non-htmx requests.This value will also be
Noneif the scheme and netloc do not match the request. This could happen if the request is cross-origin, or if Django is not configured correctly.For example:
>>> request.htmx.current_url 'https://example.com/dashboard/?year=2022' >>> # assuming request.scheme and request.get_host() match: >>> request.htmx.current_url_abs_path '/dashboard/?year=2022'
This is useful for redirects:
if not sudo_mode_active(request): next_url = request.htmx.current_url_abs_path or "" return HttpResponseClientRedirect(f"/activate-sudo/?next={next_url}")
- history_restore_request: bool¶
Trueif the request is for history restoration after a miss in the local history cache. Detected by checking if theHX-History-Restore-Requestheader equalstrue.
- target: str | None¶
The
idof the target element if it exists, orNone. Based on theHX-Targetheader.
- trigger: str | None¶
The
idof the triggered element if it exists, orNone. Based on theHX-Triggerheader.
- trigger_name: str | None¶
The
nameof the triggered element if it exists, orNone. Based on theHX-Trigger-Nameheader.
- triggering_event: Any | None¶
The deserialized JSON representation of the event that triggered the request if it exists, or
None. This header is set by the event-header htmx extension, and contains details of the DOM event that triggered the request.