关于Django ajax表单:Django ajax表单-表单验证后重定向到主页

Django ajax form - redirect to main page after form validation

我有一个sidenav_form,它是使用ajax帖子提交到名为form_validation的视图的。正确显示了空白字段或无效电子邮件的验证错误,因为提交表单并将其传递到视图时,视图将呈现显示错误的表单。这是控制台输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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

但是,通过验证器重复发送电子邮件时的行为是不同的。错误像以前一样发送到请求,但是用户看不到它,因为似乎请求已重定向到另一个视图...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{% load i18n %}
{% load crispy_forms_tags %}

<!-- sideNav -->

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





    $(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');
                },

            });
        });
    });

form_validation视图检查表单是否正确。它看起来如下:

1
2
3
4
5
6
7
8
9
10
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具有以下验证器:

1
2
3
4
5
6
7
8
9
10
11
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

您是否知道为什么与空白字段或无效电子邮件相关的错误会正确呈现表单错误,但重复的电子邮件会重定向到另一页?


实际上出现问题是因为调用ajax的按钮具有定义为submit的属性type。因此,当按下按钮时,它实际上又发出了另一个post request,因此django开始同时处理两个请求。