【问题标题】:Django-allauth - How do I get the form errors from Ajax?Django-allauth - 如何从 Ajax 获取表单错误?
【发布时间】:2017-09-08 21:22:54
【问题描述】:

使用django-allauth,如何通过AJAX登录获取表单错误?

我将这个视图与我的/signup/ url 一起使用:

from allauth.account.views import SignupView

方便的是,它接受我的 Ajax 调用:

var signupForm = function(token) {
   $.ajax({ url:"/signup/",
            type:"POST",
            data: {
                "email": $('#user').val(),
                "password1": $('#pass1').val(),
                "password2": $('#pass2').val()
            },
           success: function (){
                location.href = '/';
                window.location.reload(true);
           },
            error:function (er) {
                alert("signup failure...",er);
            }
        });
};

不方便的是,如果表单有问题,它会返回:

错误 400:错误请求

这让我不知道登录失败的原因。我希望能够向用户传达发生了什么。是不是她的密码有问题?她的电子邮件地址是否已经注册?

我可以使用 all-auth 来完成此操作,还是需要使用 javascript 编写自己的验证?

【问题讨论】:

    标签: django django-allauth


    【解决方案1】:

    我找不到受支持的解决方案,所以我破解了它:

    from django.http import JsonResponse
    from allauth.account.views import SignupView, _ajax_response
    
    class AjaxSignUpView(SignupView):
        def post(self, request, *args, **kwargs):
            form_class = self.get_form_class()
            form = self.get_form(form_class)
            if form.is_valid():
                response = self.form_valid(form)
                return _ajax_response(
                    self.request, response, form=form, data=self._get_ajax_data_if())
            else:
                return JsonResponse({'errors': form.errors})
    

    【讨论】:

    • 拜托,我刚刚发现您的帖子似乎是正确的,只是现在我想在您通过模式(引导程序)ajax 登录和注册时进行管理,并且还可以控制一些上下文变量。您的回答适合我,但只是它不完整,最重要的是您没有说我们如何为登录视图做到这一点。您能否为我发布一个更完整的通过 ajax 注册和登录的答案(当然对于 Django allauth)?请...
    • 您还在寻找什么其他信息?您可以对LoginView 使用完全相同的代码。这会将错误以 json 对象的形式发送回 Ajax 例程。
    • 祝叔叔好运!谢谢
    【解决方案2】:

    您的代码的问题在于它缺少csrfmiddlewaretoken。您应该将其包含在表单中(带有标签{% csrf_token %}),然后将其添加到您的 AJAX 请求中,如下所示:

    $.ajax({ url:"/signup/",
            type:"POST",
            data: {
                "email": $('#user').val(),
                "password1": $('#pass1').val(),
                "password2": $('#pass2').val(),
                "csrfmiddlewaretoken": $('<selector for the csrf token input>').val()
            },
            ...
    

    django 中的所有POST 请求都需要此项。

    【讨论】:

    • 我有另一种交付 CSRF cookie 的工作方法,但感谢您的关注!
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2013-11-01
    • 2020-08-04
    • 1970-01-01
    • 2015-10-23
    • 2017-09-05
    • 2019-12-02
    相关资源
    最近更新 更多