CSRF-токен отсутствует или неверен - Django
Я пытаюсь создать Django webapp для тестирования функциональности конвертера Forex, который я установил с помощью pip
. Я создал приложение с помощью django-startapp Converter
и направил url /convert
в представление convert_view()
.
Это мой views.py
файл:
from django.shortcuts import render
from forex_python.converter import CurrencyRates
# Create your views here.
def convert_view(request):
if request.method == "POST":
c = CurrencyRates()
print(c.convert('EUR', 'RON', request.POST.get('eur')))
context = {}
return render(request, "convert.html", context)
Также, поскольку мое представление возвращает шаблон convert.html
, я создал там форму. Это мой convert.html
:
{% csrf_token %}
<form action="." method="POST">
<input type="text" name="eur" placeholder="EUR">
<input type="submit">
</form>
Как вы можете видеть, это простая страница, внутри которой есть форма, перенаправляющая на ту же страницу и использующая POST
для отправки данных. Она также использует тег {% csrf_token %}
, так что проблем быть не должно.
Когда я перехожу на страницу /convert
, все работает нормально. Я ввожу сумму денег, которую хочу перевести из EUR в RON, но когда я отправляю POST-запрос, меня перенаправляют на страницу ошибки, сообщая мне:
CSRF маркер отсутствует или неверен.
Я читал другую статью на stack overflow о том, что нельзя использовать request
в качестве параметра в функции render()
, но я это делаю.
Что не так? Что я могу сделать, чтобы исправить эту ошибку? Спасибо.
Вам нужно поместить {% csrf_token %}
внутри тега <form>
следующим образом:
<form action="." method="POST">
{% csrf_token %}
<input type="text" name="eur" placeholder="EUR">
<input type="submit">
</form>
Пожалуйста, поместите {% csrf_token %}
внутрь тега <form>
. Это решит проблему.
{% csrf_token %}
должен находиться внутри тега формы.
как это
<form action="." method="POST">
{% csrf_token %}
<input type="text" name="eur" placeholder="EUR">
<input type="submit">
</form>
Причина этого в том, что {% csrf_token %}
отображается вот так, а для того, чтобы ввод был отправлен вместе с формой, он должен находиться внутри элемента формы.
<input type="hidden" name="csrfmiddlewaretoken" value="0gdrskkUXOTenFZOWxhzQPZWavohLKrEaOm0aKj8KzOfeLFah9PihEdYG24Fl4F7">```
В вашем файле формы ошибка, ваш csrf_token должен быть внутри вашего тега, потому что django ожидает его вместе с данными формы, чтобы удостовериться, что то, что вы отправляете, безопасно. Попробуйте следующее
`<form action="." method="POST">
{% csrf_token %}
<input type="text" name="eur" placeholder="EUR">
<input type="submit">
</form>`
Так и будет.