Form and View mixins for HTMX/partials
This commit is contained in:
parent
dcbf98f829
commit
ecf4052819
2 changed files with 51 additions and 0 deletions
15
src/servala/frontend/forms/mixins.py
Normal file
15
src/servala/frontend/forms/mixins.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
class HtmxMixin:
|
||||||
|
"""
|
||||||
|
Form mixin that retains only a single field when specified.
|
||||||
|
Useful when sending single fields with htmx.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.single_field = kwargs.pop("single_field", None)
|
||||||
|
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
if self.single_field and self.single_field in self.fields:
|
||||||
|
field = self.fields[self.single_field]
|
||||||
|
self.fields.clear()
|
||||||
|
self.fields[self.single_field] = field
|
36
src/servala/frontend/views/mixins.py
Normal file
36
src/servala/frontend/views/mixins.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
from django.views.generic import TemplateView
|
||||||
|
|
||||||
|
|
||||||
|
class HtmxMixin(TemplateView):
|
||||||
|
fragments = []
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def is_htmx(self):
|
||||||
|
return self.request.headers.get("HX-Request")
|
||||||
|
|
||||||
|
def _get_fragment(self):
|
||||||
|
if self.request.method == "POST":
|
||||||
|
fragment = self.request.POST.get("fragment")
|
||||||
|
else:
|
||||||
|
fragment = self.request.GET.get("fragment")
|
||||||
|
if fragment and fragment in self.fragments:
|
||||||
|
return fragment
|
||||||
|
|
||||||
|
def get_template_names(self):
|
||||||
|
template_names = super().get_template_names()
|
||||||
|
if self.is_htmx and (fragment := self._get_fragment()):
|
||||||
|
return [f"{template_names[0]}#{fragment}"]
|
||||||
|
return template_names
|
||||||
|
|
||||||
|
def get_form_kwargs(self):
|
||||||
|
result = super().get_form_kwargs()
|
||||||
|
if self.is_htmx and (field_name := self.request.POST.get("hx-single-field")):
|
||||||
|
result["single_field"] = field_name
|
||||||
|
return result
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
result = super().form_valid(form)
|
||||||
|
if self.is_htmx and self._get_fragment():
|
||||||
|
return self.get(self.request, *self.args, **self.kwargs)
|
||||||
|
return result
|
Loading…
Add table
Add a link
Reference in a new issue