首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django ajax表单-表单验证后重定向到主页

Django ajax表单-表单验证后重定向到主页
EN

Stack Overflow用户
提问于 2020-02-08 12:34:17
回答 1查看 85关注 0票数 0

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

代码语言:javascript
复制
<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

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

代码语言:javascript
复制
<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如下:

代码语言:javascript
复制
{% 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视图检查表单是否正确。它看起来如下:

代码语言:javascript
复制
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有以下验证程序:

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-12 11:19:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60126827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档