【问题标题】:Django CSRF verification failed on post methodDjango CSRF验证在post方法上失败
【发布时间】:2013-01-31 21:51:35
【问题描述】:

这个我看不懂……

令牌在模板中,'django.middleware.csrf.CsrfViewMiddleware' 在 MIDDLEWARE_CLASSES 中定义

views.py:

from django.shortcuts import render_to_response
from ezmapping.models import *
from django.forms.models import modelformset_factory

def setMapOptions(request):
    ezMapFormSet = modelformset_factory(ezMap, fields=('map_name', 'zoom_level', 'center_lat', 'center_long', 'map_width', 'map_height'))
    if request.method == 'POST':
        formset = ezMapFormSet(request.POST, request.FILES)
    if formset.is_valid():
        formset.save()

    else:
        formset = ezMapFormSet(queryset=ezMap.objects.filter(map_name ='first test'))
    return render_to_response("ezmapping/manage_mapOptions.html", {'formset': formset,})

模板:

<html>
<head>
    <title>Manage Map Options</title>
</head>
<body>
    <h1>Define map options</h1>
    <form method="post" action="">{% csrf_token %}
        {{ formset.management_form }}
        {% for form in formset %}
            {{ form.as_p }} 
        {% endfor %}
        <input type="submit" value="Submit" />
    </form>
</body>
</html>

【问题讨论】:

    标签: django django-forms django-templates django-views


    【解决方案1】:

    您需要使用RequestContext 才能使用 CSRF 标签。

    https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

    context = RequestContext(request, {
            'foo': 'bar',
        })
    
    # or
    
    render_to_response('foo.html', {}, context_instance=RequestContext(request))
    

    RequestContext 获取请求对象并自动加载各种变量,包括 CSRF。

    【讨论】:

    • 确实.. 就个人而言,自从去 CBV 以来,我打赌一整年都没有使用过这些..
    猜你喜欢
    • 2012-09-08
    • 2015-06-02
    • 1970-01-01
    • 2012-01-19
    • 2017-03-29
    • 2011-06-14
    相关资源
    最近更新 更多