Django returns old form data in HTMX response
I changed UpdateView
do that it can handle create requests as well if pk=0
:
class ObjectView(UpdateView):
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
hx_url = f"{self.model._meta.app_label}:{self.model._meta.model_name}"
context["hx_url"] = reverse(
hx_url, args=[self.object.id if self.object else 0]
)
return context
def get_object(self, queryset=None):
if self.kwargs.get(self.pk_url_kwarg) == 0:
return None
return super().get_object(queryset)
def form_invalid(self, form):
messages.add_message(self.request, messages.ERROR, "Invalid input.")
return super().form_invalid(form)
def form_valid(self, form):
messages.add_message(self.request, messages.SUCCESS, "Data saved.")
if self.request.htmx:
return self.render_to_response(self.get_context_data(form=form))
return redirect(self.object.get_absolute_url())
In my View
I am checking if price
field was updated and if yes update the price_date
field as well:
class PartView(ObjectView):
model = Part
form_class = PartForm
def form_valid(self, form):
if self.object:
old = Part.objects.get(id=self.object.id)
old_price = old.price
self.object = form.save(commit=False)
if self.object.price != old_price:
self.object.price_date = date.today()
self.object.save()
form.save_m2m()
else:
self.object = form.save()
return super().form_valid(form)
I make an htmx
call to it from my template:
<div id="modalContent" hx-target="this">
<form method="post"
hx-post="{{ hx_url }}"
hx-on:htmx:validation:failed="this.reportValidity()"
hx-trigger="click from:#btn-save">
{% csrf_token %}
<div>
{% include "form_field.html" with form_field=form.price %}
{% include "form_field.html" with form_field=form.price_date %}
</div>
</div>
</form>
{% include "btn_save.html" %}
{% include "messages.html" %}
</div>
The problem is even though it successfully updates the price_date
in the DB it still returns the form with the old value, and now if I press "Save" again, it will overwrite the previous change. Why does it happen?