2014-01-29 58 views
0

我知道有些人会认为这是一个重复的,但我已经花了整个下午堆栈溢出寻找答案.. 我有一个页面的项目列表,与,for每一个,我想在数据库中触发一个小更新的按钮。我不知道这是否有任何关系,但包括含有该按钮的HTML文件:Django csrf错误HttpResponseRedirect

{% include "accueil/impasse.html" with l=l only %} 

文件“impasse.html”本身是:

<a {% if l.impasse %} class="impasse" {% endif %} href="{% url "index" %}lecon/{{l.numero}}"> {{l.numero}} : {{l.titre}} </a> 
{% if l.impasse %} 
    {% include "accueil/boutonDesImpasse.html" %} 
{% else %} 
    {% include "accueil/boutonImpasse.html" %} 
{% endif %} 

和文件“ACCUEIL/boutonImpasse”,这是触发错误的一个是:

<form action="{% url "index" %}lecon/{{l.numero}}/impasse" method="post"> 
{% csrf_token %} 
<div class="form-actions"> 
<button type="submit" class="btn btn-primary">Je fais l'impasse sur cette leçon</button> 
</div> 
</form> 

相应的看法是:

@login_required() 
def impasse(request,numero): 
id = numeroAId(numero) 
if id==None: 
    return HttpResponse("Erreur, cette leçon n'existe pas.") 
else: 
    imp = Impasse(user=request.user,lecon=id) 
    imp.save() 
    return HttpResponseRedirect('/lecon',context_instance=RequestContext(context)) 

现在,在这一点上,我有一个CSRF错误(在else分支中)。我知道,许多具有相同类型错误的人被建议使用render_to_response与相应的模板,但我不能,因为与URL“lecon”相关联的视图“lecon”在投掷页面之前做了复杂的事情,所以我真的想要加载视图“lecon”。请注意,在我收到错误后,如果我再次尝试失败的网址,则会按照要求加载。我该怎么办?

回答

1

这与render_to_response或重定向无关。

通过使用include标签中的“only”,您特别排除了排除模板上下文中的csrf标记变量。不要这样做。

(和HttpResponseRedirect不采取context_instance参数,所以不知道你在那里干什么。)

+0

非常感谢您的回答,那当然非常有意义!我不记得为什么我必须把它摆在首位。至于context_instance,这是试图通过模仿SO上建议的内容来强制确认csrf标记。 – user3078439