2015-09-29 66 views
1

我正在嘗試創建一個客戶端驗證,以查看用戶名是否在註冊時被採用。驗證應該在用戶提交表單之前進行。如何在jQuery驗證插件中傳遞Django csrf標記?

爲了實現這一目標,我使用jQuery驗證插件:http://jqueryvalidation.org/

我遇到的問題是,我得到一個403錯誤:

POST example.com/check-username 403 (FORBIDDEN) 

這是代碼客戶端驗證: $(文件)。就緒(函數(){

 $('#register-form').validate({ // initialize the plugin 
     rules: { 
      username: { 
      required: true, 
      remote: { 
       url: "/check-username", 
       type: "post", 
       data: { 
       csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value, 
       username: function() { 
        return $("#id_username").val(); 
       } 
       } 
      } 
      } 
     } 
     }); 
}); 

這裏是我的驗證功能views.py:

def check_username(request): 
    username = request.POST.get('username', None) 

    if not username: 
     return HttpResponseBadRequest("Invalid username") 
    return User.objects.exists(username=username) 

我懷疑這是一個csrf錯誤,但我不太確定如何做到這一點與jQuery驗證插件一起工作。我會如何去做這件事?

+1

你看了[docs](https://docs.djangoproject.com/en/1.8/ref/csrf/)嗎? – Sayse

+0

特別是關於[Ajax](https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax)的部分,它提供了示例代碼,顯示瞭如何執行此操作。 –

回答

0

您是否肯定將CSRF令牌輸出到您的表單中?

{% csrf_token %} 

需要在你的<形式>標記之間。

您的代碼爲我工作,一旦我做到了這一點,並修改您的check_username視圖返回一個正確的HTTP響應。

from django.http import HttpResponse 
def check_username(request): 
    username = request.POST.get('username', False) 

    if not username: 
     return HttpResponseBadRequest("Invalid username") 
    return HttpResponse(User.objects.filter(username=username).exists()) 
+0

我的表單標記之間有csrf標記。有趣的是,你沒有在ajax調用中傳遞csrf標記就可以工作 –