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

时间:2017-09-08 21:22:55

标签: django django-allauth

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

我在/signup/网址

中使用此视图
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编写自己的验证?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

您的代码存在的问题是缺少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个请求都需要此项。