2015-09-29 9 views
1

Я пытаюсь создать проверку на стороне клиента, чтобы узнать, было ли имя пользователя принято при регистрации. Эта проверка должна произойти до того, как пользователь представит форму.Как вы переносите токен Django csrf в плагин проверки jquery?

Для достижения этой цели я использую плагин проверки JQuery: http://jqueryvalidation.org/

Проблема у меня в том, что я получаю 403 ошибку:

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

Это код для на стороне клиента проверки: $ (документ) .ready (функция() {

 $('#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(); 
       } 
       } 
      } 
      } 
     } 
     }); 
}); 

Вот моя функция Validate в 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 между моими тегами формы. Интересно, что вы получили его для работы без передачи токена csrf в вызове ajax –

Смежные вопросы