Make HTMX integration more flexible

This commit is contained in:
Tobias Kunze 2025-03-20 12:05:22 +01:00
parent 8a98f1ac33
commit 7f3bd159cb
3 changed files with 14 additions and 6 deletions

View file

@ -1,3 +1,5 @@
from django.utils.functional import cached_property
from servala.frontend.forms.renderers import InlineFormRenderer
@ -7,8 +9,6 @@ class HtmxMixin:
Useful when sending single fields with htmx.
"""
default_renderer = InlineFormRenderer
def __init__(self, *args, **kwargs):
self.single_field = kwargs.pop("single_field", None)
@ -18,3 +18,8 @@ class HtmxMixin:
field = self.fields[self.single_field]
self.fields.clear()
self.fields[self.single_field] = field
@cached_property
def default_renderer(self):
if self.single_field:
return InlineFormRenderer

View file

@ -15,7 +15,7 @@
<td>
{{ request.user.email }}
<button class="btn btn-primary"
hx-get="{% url 'frontend:profile' %}?fragment=user-email-edit"
hx-get="{% url 'frontend:profile' %}?fragment=user-email-edit&hx-single-field=email"
hx-target="closest td"
hx-swap="outerHTML">{% translate "Edit" %}</button>
</td>
@ -24,7 +24,7 @@
<td>
{{ request.user.company|default:"" }}
<button class="btn btn-primary"
hx-get="{% url 'frontend:profile' %}?fragment=user-company-edit"
hx-get="{% url 'frontend:profile' %}?fragment=user-company-edit&hx-single-field=company"
hx-target="closest td"
hx-swap="outerHTML">{% translate "Edit" %}</button>
</td>

View file

@ -25,8 +25,11 @@ class HtmxMixin(TemplateView):
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
if self.is_htmx:
data = (
self.request.POST if self.request.method == "POST" else self.request.GET
)
result["single_field"] = data.get("hx-single-field")
return result
def form_valid(self, form):