Маркер CSRF отсутствует или неверен, хотя у меня {% csrf_token%} - PullRequest
9 голосов
/ 07 мая 2011

Я получаю эту ошибку, ссылаясь на этот метод в моем файле views.py:

def AddNewUser(request):
    a=AMI()
    if(request.method == "POST"):
        print(request.POST)
       # print(request['newUser'])
       # print(request['password'])
    return render_to_response("ac/AddNewUser.html", {})

Но остальные мои функции работают просто отлично. Просто эта кнопка в моем HTML-файле не работает.

<form name="AddNewUser" action="/ac/AddNewUser" method="post"> {% csrf_token %} <input type="submit" name="addNewUser" id="addNewUser" value="Create User"></form>

Как видите, у меня есть {% csrf_token%}, но он все еще не работает. Я также знаю, что у некоторых людей есть эта проблема, если у них нет MIDDLEWARE_CLASSES в их settings.py, но я вставил это правильно. Что может быть причиной этой проблемы? Единственная другая строка в сообщении об ошибке гласит: «Функция представления использует RequestContext для шаблона, а не Context». Но я не знаю, что это могло бы значить.

Ответы [ 2 ]

11 голосов
/ 07 мая 2011

Вы должны использовать объект RequestContext , чтобы получить контекст, а затем передать результаты в вашу функцию render_to_response () . RequestContext добавляет необходимый токен CSRF.

from django.template import RequestContext
from django.shortcuts import render_to_response

csrfContext = RequestContext(request)
return render_to_response(some_template, csrfContext)

В качестве дополнительного примечания вы также можете использовать RequestContext для добавления контекстов / словарей, предназначенных для шаблона.Например, я часто использую:

initialData = {'form': theForm, 'user_status': 'online'}
csrfContext = RequestContext(request, initialData)
return render_to_response(show_template, csrfContext)

В качестве (краткого) объяснения того, что делает RequestContext : большинство промежуточного ПО создает нечто, называемое процессор контекста , которыйпросто функция, которая предоставляет контекст (словарь) переменных. RequestContext ищет все доступные контекстные процессоры, получает их контексты и добавляет их все в один (гигантский) контекст.

2 голосов
/ 30 декабря 2011

ПРИМЕЧАНИЕ. RequestContext должен использоваться как в представлении, которое обслуживает форму, так и в представлении, которое получает сообщение.Если вы следуете инструкциям выше и все еще не работает, это может быть проблемой!Это было для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...