Make HTMX integration more flexible
This commit is contained in:
parent
8a98f1ac33
commit
7f3bd159cb
3 changed files with 14 additions and 6 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
from servala.frontend.forms.renderers import InlineFormRenderer
|
from servala.frontend.forms.renderers import InlineFormRenderer
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,8 +9,6 @@ class HtmxMixin:
|
||||||
Useful when sending single fields with htmx.
|
Useful when sending single fields with htmx.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
default_renderer = InlineFormRenderer
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.single_field = kwargs.pop("single_field", None)
|
self.single_field = kwargs.pop("single_field", None)
|
||||||
|
|
||||||
|
@ -18,3 +18,8 @@ class HtmxMixin:
|
||||||
field = self.fields[self.single_field]
|
field = self.fields[self.single_field]
|
||||||
self.fields.clear()
|
self.fields.clear()
|
||||||
self.fields[self.single_field] = field
|
self.fields[self.single_field] = field
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def default_renderer(self):
|
||||||
|
if self.single_field:
|
||||||
|
return InlineFormRenderer
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<td>
|
<td>
|
||||||
{{ request.user.email }}
|
{{ request.user.email }}
|
||||||
<button class="btn btn-primary"
|
<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-target="closest td"
|
||||||
hx-swap="outerHTML">{% translate "Edit" %}</button>
|
hx-swap="outerHTML">{% translate "Edit" %}</button>
|
||||||
</td>
|
</td>
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
<td>
|
<td>
|
||||||
{{ request.user.company|default:"–" }}
|
{{ request.user.company|default:"–" }}
|
||||||
<button class="btn btn-primary"
|
<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-target="closest td"
|
||||||
hx-swap="outerHTML">{% translate "Edit" %}</button>
|
hx-swap="outerHTML">{% translate "Edit" %}</button>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -25,8 +25,11 @@ class HtmxMixin(TemplateView):
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
result = super().get_form_kwargs()
|
result = super().get_form_kwargs()
|
||||||
if self.is_htmx and (field_name := self.request.POST.get("hx-single-field")):
|
if self.is_htmx:
|
||||||
result["single_field"] = field_name
|
data = (
|
||||||
|
self.request.POST if self.request.method == "POST" else self.request.GET
|
||||||
|
)
|
||||||
|
result["single_field"] = data.get("hx-single-field")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue