2016-06-09 121 views
1

你好,我有一个Django的问题,我有这个错误:403 - CSRF令牌丢失或不正确

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

你在中间件设置中有''django.middleware.csrf.CsrfViewMiddleware'吗? –

+0

是的,我有CsrfViewMiddleware –

回答

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) 
+0

不,没有什么变化 –

+0

我编辑了视图,再试一次 –

+1

请不要推荐'render_to_response',它已被'render'废弃多年了。 – Alasdair

2

对于CSRF令牌才能正常工作,你需要包括RequestContext当您使用的模板。

为了避免额外的样板,这涉及到django自带的一个快捷方式功能,它可以在渲染模板时自动添加。这是django.shortcuts.render

要使用此更改您的视图是。

from django.shortcuts import render 

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

欲了解更多信息this page的Django文档是非常有用的。

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

西蒙建议在他的回答,更容易使用render快捷方式,而不是手动加载和渲染的模板。

from django.shortcuts import render 

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

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