Django allauth-如何从Ajax中获取表单错误?

Django allauth-如何从Ajax中获取表单错误?,django,django-allauth,Django,Django Allauth,使用django allauth,如何通过AJAX登录获取表单错误 我将此视图与我的/signup/url一起使用: from allauth.account.views import SignupView 它方便地接受了我的Ajax调用: var signupForm = function(token) { $.ajax({ url:"/signup/", type:"POST", data: { "ema

使用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:请求错误

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


我可以用所有的auth来完成这项工作,还是需要用javascript编写自己的验证?

您的代码的问题是缺少
csrfmiddlewaretoken
。您应该将其包含在表单中(带有标记
{%csrf\u 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()
        },
        ...
$.ajax({url://signup/“,
类型:“POST”,
数据:{
“电子邮件”:$('#user').val(),
“password1”:$('#pass1').val(),
“password2”:$('#pass2').val(),
“csrfmiddlewaretoken”:$('').val()
},
...

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

您的代码的问题是缺少
csrfmiddlewaretoken
。您应该将其包含在表单中(带有标记
{%csrf\u 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()
        },
        ...
$.ajax({url://signup/“,
类型:“POST”,
数据:{
“电子邮件”:$('#user').val(),
“password1”:$('#pass1').val(),
“password2”:$('#pass2').val(),
“csrfmiddlewaretoken”:$('').val()
},
...

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

我找不到支持的解决方案,因此我对其进行了黑客攻击:

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})

我找不到支持的解决方案,因此我对其进行了黑客攻击:

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})

我有另一种交付CSRF cookie的工作方法,但感谢您的关注!我有另一种交付CSRF cookie的工作方法,但感谢您的关注!请注意,我刚刚发现您的帖子似乎是正确的,只是现在我想通过模式(引导)管理您的登录和注册ajax,还可以控制一些上下文变量。你的答案适合我,但只是不完整,而且最重要的是,你没有说我们如何在登录视图中做到这一点。你能为我发布一个更完整的答案,通过ajax注册和登录(当然是Django allauth的答案)?请…您还需要什么其他信息?您可以使用与
LoginView
完全相同的代码。这将把json对象中的错误发送回Ajax例程。请,我刚刚发现您的帖子似乎是正确的,只是现在我想通过模式(引导)管理您的登录和注册ajax,还可以控制一些上下文变量。你的答案适合我,但只是不完整,而且最重要的是,你没有说我们如何在登录视图中做到这一点。你能为我发布一个更完整的答案,通过ajax注册和登录(当然是Django allauth的答案)?请…您还需要什么其他信息?您可以对
LoginView
使用完全相同的代码。这将把json对象中的错误发送回Ajax例程。