Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 403-CSRF令牌丢失或不正确_Python_Django - Fatal编程技术网

Python 403-CSRF令牌丢失或不正确

Python 403-CSRF令牌丢失或不正确,python,django,Python,Django,你好,我对Django有问题,我有一个错误: CSRF令牌丢失或不正确 我的代码是: <h1>Registro de llamadas</h1> <form action="{% url 'registro:guardar' %}" method="post"> {% csrf_token %} Duracion: <input type="text" name="duracion" /> </br>

你好,我对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 %}
请帮忙,我搜索了其他问题,但没有解决我的问题

谢谢

更改视图.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)

要使CSRF令牌正常工作,您需要在使用模板时包含一个

from django.shortcuts import render

def index(request):
    return render(request, 'registro/index.html', {})

def guardar(request):
    return render(request, 'registro/index.html', {})
为了避免额外的样板文件,django附带了一个快捷功能,在呈现模板时自动为您添加此功能。这是

若要使用此选项,请将视图更改为

from django.shortcuts import render

def guardar(request):
    return render(request, 'registro/index.html', {})

有关Django文档的更多信息非常有用。

问题在于
request
是该方法的第二个参数,但您将其作为第一个参数传递

您可以按如下方式修复视图:

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', {})

不,没有任何更改我编辑了该视图,请重新尝试。请不要推荐
render\u to\u response
,它已被
render
淘汰多年。谢谢,我不知道它
render
快捷方式使用模板名称(例如“registro/index.html”)。您有
'django.middleware.csrf.CsrfViewMiddleware',
在您的中间件设置中?是的,我有CsrfViewMiddleware