Django Неверная форма

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

Как мне просто вернуться на экран, если пост не удался.

def index(request):
    context = {}
    if request.method == "POST":
        print(request.POST)
        form = UserProfileForm(request.POST or None, request.FILES or None,instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('home') 
    else:
        form = UserProfileForm()
    context['form']= form
    return render(request, "home.html", context)

modal

{% block content %}
 
    <div class="modal fade" id="editProfile" tabindex="-1" role="dialog" aria-labelledby="editProfilelCenterTitle" aria-hidden="true">
        <div class="modal-dialog modal-dialog-centered" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="editProfileLongTtitle">Edit Profile</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    {% include 'form.html' %}
                </div>
            </div>
        </div>
    </div>

{% endblock %} 

form.html

{% block content %}

    <form method = "POST" action='.' enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>
    </form>

{% endblock %}

home.html

{% extends 'base.html' %}

{% block title %}Home{% endblock %}

{% block content %}
  {% if user.is_authenticated %}
  <div class="container"> 
    {% include 'editProfileModal.html' %} 
    <div class='row'>  
      {% include 'sidebar.html' %}
    </div> 
  </div> 
  {% else %}
    <p>You are not logged in</p>
    <a href="{% url 'login' %}">Log In</a>
    <a href="{% url 'signup' %}">Sign up</a>
    
  {% endif %}

{% endblock %}

Вы можете просто возвращать HttpResponse при ошибках формы.

from django.http import HttpResponse

if form.is_valid():
   ...
else:
   return HttpResponse(form.errors.as_json())

Попробуйте это:

def index(request):
context = {}
if request.method == "POST":
    print(request.POST)
    form = UserProfileForm(request.POST or None, request.FILES or None,instance=request.user)
    if form.is_valid():
        form.save()
        return redirect('home') 
context['form']= form
return render(request, "home.html", context)

Вам нужно показать модальное окно во время отправки POST-запроса и не отправлять редирект. Вы можете попробовать следующее плохое решение. Оно уродливо, но может работать:


def index(request):
    context = {'is_post': False}
    if request.method == "POST":
        context['is_post'] = True
        form = UserProfileForm(request.POST or None, request.FILES or None,instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('home') 
    else:
        form = UserProfileForm()
    context['form']= form
    return render(request, "home.html", context)

{% block content %}
 
    <div class="modal fade" id="editProfile" tabindex="-1" role="dialog" ... >
        <!-- your content ... -->
    </div>
    <!-- Do this after jQuery loaded -->
    {% if is_post %}
    <script type="text/javascript">
        $(window).on('load', function() {
            $('#myModal').modal('show');
        });
    </script>
    {% endif %}
{% endblock %}
Вернуться на верх