HTML-форма в Django: ошибки, не обновляющиеся в DOM после неудачной проверки
Я использую HTML с Django для отправки контактной формы без обновления страницы. Когда в форме появляются ошибки, мой сервер корректно возвращает шаблон contact_messages.html, но ошибки не отображаются на странице после запроса.
Я вижу правильный ответ на вкладке Сеть и contact_messages.html содержит ожидаемые сообщения о проверке. Однако HTML не обновляет div#contact-сообщения в моем файле contact.html.
Прежде чем пытаться использовать HTML, проверьте, работает ли встроенная в Django проверка форм безукоризненно. Однако, как всем известно, процесс является синхронным, и я хочу сделать его асинхронным с помощью HTML.
Это мой взгляд:
class ContactView(FormView):
    template_name = 'contact/contact.html'
    form_class = ContactForm
    success_url = reverse_lazy('contact')
    def form_valid(self, form):        
        messages.success(self.request, "Your message has been sent. We will be in touch with you as soon as possible.")
        return redirect(self.success_url + '#contact-section')
    def form_invalid(self, form):
        messages.error(
            self.request,
            "There were some errors in your submission. Please review the highlighted fields and try again",
            extra_tags="danger")
        if self.request.headers.get("HX-Request"):
            return render(self.request, "contact/contact_messages.html", {"form": form}, content_type="text/html", status=400)
        return super().form_invalid(form)
Это моя анкета в contact.html:
<form id="contact-form" method="post" hx-post="{% url 'contact' %}"
                         hx-target="#contact-messages"  hx-swap="innerHTML" novalidate>
                        {% csrf_token %}
                        <div id='contact-messages'>
                            {% include 'contact/contact_messages.html' %}
                        </div>
                        <div class="form-group mb-0">
                            <button class=" btn btn-primary w-100">
                                <span>Send Message</span>
                            </button>
                        </div>
                       
                    </form>
Это мой дополнительный шаблон contact_messages.html:
% if messages %}
    {% for message in messages %}
        <div class="alert alert-{{ message.tags }}" role="alert">
            {{ message }}
            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                <span aria-hidden="true">×</span></button>
        </div>
    {% endfor %}
{% endif %}
{% for field in form %}
    <div class="form-group">
        {{ field }}
        {% if form.errors %}
            <div class="invalid-feedback d-block">
                {% for error in field.errors %}
                    {{ error }}
                {% endfor %}
            </div>
        {% endif %}
    </div>
{% endfor %}
Здесь вы можете видеть, что Django возвращает правильный ответ, но я не могу отразить его в contact.html.
По замыслу HTML не меняет содержимое при возврате ответа об ошибке (4xx).
Вот один из способов обойти это:
https://gist.github.com/lysender/a36143c002a84ed2c166bf7567b1a913
Другой способ - просто вернуть 200 вместо 400.
