Django возвращает старые данные формы в HTML-ответе

Я изменил UpdateView, чтобы он также мог обрабатывать запросы на создание, если 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())

В моем View Я проверяю, было ли обновлено поле price, и если да, обновите также поле price_date:

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)

Я вызываю htmx из своего шаблона:

<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>

Проблема в том, что, несмотря на успешное обновление price_date в базе данных, он все равно возвращает форму со старым значением, и теперь, если я снова нажму "Сохранить", предыдущее изменение будет перезаписано. Почему это происходит?

Это потому, что вы используете старый экземпляр формы для повторного отображения, в котором значение даты цены не изменено.

Чтобы исправить это, вам следует снова создать экземпляр формы, прежде чем передавать его в контекст шаблона, например,

form = PartForm(instance=self.object)
return self.render_to_response(self.get_context_data(form=form))
Вернуться на верх