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?

Вернуться на верх