CSRF-проверка не удалась: токен не сохраняется между GET и POST? Django
Я проверил много старых вопросов по CSRF, но они, похоже, были заданы 5+ лет назад, и многие решения не применимы, поскольку теперь они обрабатываются с помощью render() или других встроенных методов. Итак, вот мой вопрос:
Я отображаю шаблон формы из представления на основе класса. Он загружается нормально, когда я выполняю начальный GET-запрос, но когда я пытаюсь отправить форму, она выдает ошибку 403: CSRF verification failed.
Я не уверен, почему это происходит - мне кажется, что я все делаю правильно. Может ли это быть связано с тем, что сохраненные cookies, которые переопределяют CSRF токен, изменяются каждый раз, когда вызывается render? Вот мой код:
class Intake(View):
form_class = IntakeFormSimple
template_name = "intake.html"
def get(self, req: HttpRequest):
form = self.form_class(None)
return render(req, self.template_name, {"form": form})
def post(self, req: HttpRequest):
form = self.form_class(req.POST)
if form.is_valid():
return HttpResponse("submitted form!")
return render(req, self.template_name, {"form": form})
и шаблон формы (шаблон удален для ясности):
<body>
<section class="section">
<div class="container">
<form action="" method="post" novalidate>
{% csrf_token %} {{ form.non_field_errors }} {% for field in form %}
<div class="field">
<label class="label" for="{{field.id_for_label}}"
>{{field.label}}</label
>
<div class="control">{{field}}</div>
{% if field.help_text %}
<p class="help">{{field.help_text}}</p>
{% endif %}
<ul class="errorlist">
{% for error in field.errors %}
<li class="is-danger help">{{error}}</li>
{% endfor %}
</ul>
</div>
{% endfor %}
<input type="submit" />
</form>
</div>
</section>
</body>
Вы можете использовать следующее:
#in views.py
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def myView(request):
#your code