您好我有Django的问题,我有一个错误:
CSRF令牌丢失或不正确。
我的代码是:
<h1>Registro de llamadas</h1>
<form action="{% url 'registro:guardar' %}" method="post">
{% csrf_token %}
Duracion: <input type="text" name="duracion" /> </br>
Tipo de llamada:
<select name="tipo" form="carform">
<option value="1">Local</option>
<option value="2">Nacional</option>
<option value="3">Internacional</option>
</select>
</br>
<input type="submit" value="Grabar" />
</form>
{% if llamadas %}
<ul>
{% for ll in llamadas %}
<li><a href="a">{{ ll.duracion }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No tenemos ninguna llamada</p>
{% endif %}
和views.py我有:
from django.http import HttpResponse
from django.template import loader
def index(request):
template = loader.get_template('registro/index.html')
return HttpResponse(template.render(request))
def guardar(request):
template = loader.get_template('registro/index.html')
return HttpResponse(template.render(request))
请一些帮助,我搜索了其他问题,但没有解决我的问题。
谢谢!
答案 0 :(得分:2)
要使CSRF令牌正常工作,您需要在使用模板时加入RequestContext
。
为了避免额外的样板,这涉及到django带有一个快捷功能,可以在渲染模板时自动为您添加。这是django.shortcuts.render
。
要使用此功能,请将视图更改为。
from django.shortcuts import render
def guardar(request):
return render(request, 'registro/index.html', {})
有关Django文档的this page的更多信息非常有用。
答案 1 :(得分:1)
问题是request
是template.render()
方法的第二个参数,但是你将它作为第一个传递。
您可以按如下方式修改视图:
def index(request):
template = loader.get_template('registro/index.html')
return HttpResponse(template.render(request=request))
def guardar(request):
template = loader.get_template('registro/index.html')
return HttpResponse(template.render(request=request))
正如Simon在回答中所说,使用render
快捷方式而不是手动加载和呈现模板更容易。
from django.shortcuts import render
def index(request):
return render(request, 'registro/index.html', {})
def guardar(request):
return render(request, 'registro/index.html', {})
答案 2 :(得分:0)
更改你的view.py:
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render
@csrf_exempt
def guardar(request,username=None, errmsg=None):
template = 'registro/index.html'
ctx = {}
render(request, template, ctx)