403 - CSRF令牌丢失或不正确

时间:2016-06-09 15:32:50

标签: 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>
    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))

请一些帮助,我搜索了其他问题,但没有解决我的问题。

谢谢!

3 个答案:

答案 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)

问题是requesttemplate.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)