Django ajax форма - перенаправление на главную страницу после проверки формы - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть sidenav_form, который отправляется с помощью сообщения ajax в представление с именем form_validation. Ошибки проверки для пустых полей или недействительный адрес электронной почты отображаются правильно, так как при отправке формы и передаче в представление, представление отображает форму, отображающую ошибки. Вот вывод консоли:

<ul class="errorlist"><li>email<ul class="errorlist"><li>Required Field</li></ul></li></ul>
[08/Feb/2020 13:26:37] "POST /patients/validate_form/ HTTP/1.1" 200 1253

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

<ul class="errorlist"><li>email<ul class="errorlist"><li>This email has already been taken.</li></ul></li></ul>
[08/Feb/2020 13:26:40] "POST /patient/ HTTP/1.1" 200 7769
[08/Feb/2020 13:26:40] "POST /patients/validate_form/ HTTP/1.1" 200 1279

sidenav_form.html выглядит следующим образом:

{% load i18n %}
{% load crispy_forms_tags %}

<!-- sideNav -->
<div class="inside_sidenav">
        <form class="form" id="form_patient">
            {% csrf_token %}
            {{ form.as_p}}
            </div>
            <div class="form-actions">
                <button type="submit" class="btn btn-primary" id="sidenav-btn-submit" formmethod="post">{% trans 'Guardar'%}
                </button>
            </div>
        </form>
    </div>
</div>



<script>
    $(function () {
        // SUBMIT DATA
        $('#sidenav-btn-submit').click(function () {
            console.log('noinstance')
            var url = "{% url 'patients:validate_form' %}";
            var formb = $('#form_patient');
            console.log(formb.serialize());
            $.ajax({
                url: url,
                data: formb.serialize(),
                type: "POST",
                headers: { "X-CSRFToken": '{{ csrf_token }}' },
                dataType: 'json',
                success: function (data) {
                    $('#mySidenav').html(data);
                    openNav();
                },
                error: function (data) {
                    $('#mySidenav').html(data.responseText);
                    console.log('no ajax2');
                },

            });
        });
    });
</script>

form_validation просмотр проверяет правильность формы или нет. Это выглядит следующим образом:

def validate_form(request, patient_id=None, user_id=None):
    form_initial_data = request.POST
    if request.method == 'POST':
        print(form_initial_data)
        form = UserForm(form_initial_data)
        if form.is_valid():
            print('Form2 is valid')
            # DO SOMETHING
    print(form.errors)
    return render(request, 'patients/sidenav_form.html', {'form1': form})

form имеет следующий валидатор:

def clean_email(self):
        email = self.cleaned_data["email"]

        if not self.instance.pk:
            try:
                User.objects.get(email=email)
            except User.DoesNotExist:
                return email
            print('Repeated email')
            raise ValidationError(_("This email has already been taken."))
        return email

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

1 Ответ

0 голосов
/ 12 февраля 2020

На самом деле проблема возникает потому, что кнопка, которая вызывает ajax, имеет свойство type, определенное как submit. Поэтому, когда кнопка была нажата, она фактически сделала еще один post request, поэтому django начал обрабатывать два запроса одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...