【发布时间】:2021-11-13 08:20:11
【问题描述】:
我正在尝试构建一个 Django webapp 来测试我使用pip 安装的外汇转换器的功能。我使用django-startapp Converter 创建了一个应用程序,并将网址/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 令牌丢失或不正确。
我阅读了另一篇关于堆栈溢出的文章,关于不在render() 函数中使用request 作为参数,但我正在这样做。
怎么了?我能做些什么来解决这个错误?谢谢。
【问题讨论】:
-
{% csrf_token %}需要在<form>标签内。请参阅页面源代码 -{% csrf_token %}生成一个<input>,如果您不将此输入放入表单中,则该值不会发送。 -
@yedpodtrzitko 非常感谢!这实际上是我第一次与 Django 合作并且不知道这一点。你能把它放在一个正确的答案中,所以我可以把它标记为正确吗?
标签: python django django-views django-csrf csrf-token