Ajax发布请求返回空querydict

时间:2017-11-19 00:33:46

标签: python ajax django

我正在尝试发送帖子请求并根据该信息对用户进行身份验证。然而,即使我已经检查了$('#sign_in').serialize()的结果并返回username=test&password=test之类的内容,但当我在views.py中运行<QueryDict: {}>时,它仍会返回print(request.POST)。我做错了什么,为什么不传递参数?

ajax功能

function logIn() {
    var username = $('#id_username').val();
    var password = $('#id_password').val();
    console.log($('#sign_in').serialize())
    $('#sign_in_btn').text('Logger ind...');
    $.ajax({
        url: "/account/login/",
        type: "POST",
        dataType: 'json',
        contentType: 'application/json',
        data: $('#sign_in').serialize(),
        success: function (data) {
            console.log(data)

        }, error: function (error) {

        }
    });
}

views.py

def login(request):
    print(request.POST)
    if request.method == "POST":
        form = SignInForm(data=request.POST)
        response_data = {}
        if form.is_valid():
            username = request.POST.get("username", False)
            password = request.POST.get("password", False)
            user = authenticate(username=username, password=password)
            auth_login(request, user)
            if user:
                response_data['success'] = True
                response_data['message'] = 'Brugeren er blevet oprettet!'
        else: #invalid case
            response_data['success'] = False
            response_data['message'] = 'Forkert brugernavn/kodeord. Prøv venligst en anden kombination eller tryk på glemt kodeord!'
            print(form.errors)
        return HttpResponse(json.dumps(response_data), content_type='application/json')
    else:
        form = SignInForm()
    return render(request, 'login.html', {'form': form})

2 个答案:

答案 0 :(得分:1)

您需要将contentType更改为 application / x-www-form-urlencoded ,或将其留空,因为其默认值为 应用程序/ x-WWW窗体-urlencoded;字符集= UTF-8 即可。

  

事情是.serialize()返回表单的内容   URL编码不是JSON。

答案 1 :(得分:0)

lcastillov已经回答了你的问题,但如果你想将json数据发送到服务器,这里有几件你应该注意的事情。

您将在request.data中获取数据,因为您已将contentType设置为 application / json

$ .ajax()函数的data属性也应该是 json 格式

data: {
   "username": "test",
   "password": "test"
} 

现在您可以轻松地在视图中获取数据

request.data["username"]
request.data["password"]
  

request.POST用于具有contentType的表单编码数据   的 应用程序/ x-WWW窗体-urlencoded