【问题标题】:Django ajax form - redirect to main page after form validationDjango ajax 表单 - 表单验证后重定向到主页
【发布时间】:2020-05-24 09:07:06
【问题描述】:

我有一个sidenav_form,它使用 ajax 帖子提交到名为form_validation 的视图。 empty fieldsinvalid email 的验证错误会正确显示,因为当表单提交并传递给视图时,视图会呈现显示错误的表单。这是控制台输出:

<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 view 检查表单是否正确。它看起来如下:

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

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

【问题讨论】:

    标签: django ajax forms


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2011-09-15
      • 2013-02-17
      • 1970-01-01
      • 2013-11-05
      • 2020-12-20
      相关资源
      最近更新 更多