2016-12-30 38 views
2

根據django all-auth的文檔,它支持通過AJAX請求登錄。當我對「accounts/login /」發出正常的發佈請求時,內容類型爲響應標題是「text/html」。 但是,當我做一個Ajax調用它是「應用程序/ JSON」。 我無法弄清楚我做錯了什麼,我嘗試在ajax調用中更改contentType和dataType,但它給出了一個400錯誤的請求錯誤。通過Django上的AJAX發佈請求進行登錄All-auth

我還沒有修改默認的Django all-auth應用程序的任何URL或視圖。

我包括JavaScript代碼在這裏 -

<script type="text/javascript"> 
 
    
 
var $button = $('#login_button'); 
 

 
    $button.on('click',function(){ 
 

 
     var data = {"csrfmiddlewaretoken" : document.getElementsByName('csrfmiddlewaretoken')[0].value, 
 
     "login": $('#id_login').val(), 
 
     "password": $('#id_password').val(), 
 
     "remember": $('#id_remember').val() }; 
 

 
     var temp = {'X-CSRFToken': document.getElementsByName('csrfmiddlewaretoken'[0].value }; 
 

 
     $.post({ 
 
      url : "{% url 'account_login' %}", 
 
      headers: temp, 
 
      type: "POST", 
 
      data : data, 
 
      contentType: "application/x-www-form-urlencoded", 
 
      dataType: "text", 
 
      success : function(data) { 
 
      // console.log(data); 
 
      }, 
 

 
     }); 
 

 
    }); 
 

 

 

 
</script>

回答

0

工作對我來說,嘗試:

$.post("{% url 'account_login' %}", { 
    "csrfmiddlewaretoken" : document.getElementsByName('csrfmiddlewaretoken')[0].value, 
    "login": $('#id_login').val(), 
    "password": $('#id_password').val(), 
    "remember": $('#id_remember').val() 
    }, 
    function (data, status) { 
    // console.log(data); 
}); 
+0

我試過你的代碼,但它仍然給出了400BAD請求錯誤 –

+0

在你的settings.py中檢查ALLOWED_HOSTS,我有ALLOWED_HOSTS = ['localhost'],你也可以用*來匹配任何主機:ALLOWED_HOSTS = ['* * '] – Vladimir

+0

仍然沒有幫助,在鉻的網絡標籤是它顯示一個xhr類型的請求或文件?在我的情況下它的xhr。還有什麼建議嗎? –

1

我有類似的問題,工作對我來說這個解決方案(不是一個很好的方式但工作): - 在adapter.py中,您可以看到表單是否無效,狀態400,並且我也更改了數據

def ajax_response(self, request, response, redirect_to=None, form=None): 
     data = {} 
     status = response.status_code 

     if redirect_to: 
      status = 200 
      data['location'] = redirect_to 
     if form: 
      if form.is_valid(): 
       status = 200 
      else: 
       status = 200 
       data['form_errors'] = form._errors 
      if hasattr(response, 'render'): 
       response.render() 
      data = response.content 
     return HttpResponse(json.dumps(data), 
          status=status, 
          content_type='application/json') 
+0

這就是我所做的。幸運的是,您可以擴展'allauth.account.adapter.DefaultAccountAdapter',只更改'def ajax_response'並使用'ACCOUNT_ADAPTER'設置指向您的新適配器。不知道爲什麼他們只是返回一個錯誤而不是固定的表單,但是你有它。 –