【问题标题】:modelformset_factory and csrf token missing or incorrectmodelformset_factory 和 csrf 令牌丢失或不正确
【发布时间】:2015-08-24 17:45:11
【问题描述】:

我正在使用模型表单集一次添加模型的多个实例。我正在使用基于类的视图。这是我用于创建“库”的 views.py 部分

class LibraryCreate(View):
model = Library

def post(self, request, *args, **kwargs):
    LibraryFormSet = modelformset_factory(
        Library, form=create_library, extra=2)
    if request.method == 'POST':
        formset = LibraryFormSet(request.POST, request.FILES)
        if formset.is_valid():
            # do something with the formset.cleaned_data
            pass
    else:
        formset = LibraryFormSet()
    return render_to_response(
        'trial1/library_form.html', {'formset': formset})

def get(self, request, *args, **kwargs):
    LibraryFormSet = modelformset_factory(
        Library, form=create_library, extra=2)
    formset = LibraryFormSet(queryset=Library.objects.none())
    return render_to_response(
        'trial1/library_form.html', {'formset': formset})

这是我的模板

<form method="post" action="{% url "library_create" %}">
{% csrf_token %}
{{ formset.management_form }}
<table>
    {% for form in formset %}
    {{ form }}
    {% endfor %}
</table>
<input type="submit" value="create" />

现在由于某种原因,当我尝试提交表单时,它返回 403 禁止,因为“CSRF 令牌丢失或不正确。”。我不明白为什么这不起作用并且它变得非常令人沮丧。

【问题讨论】:

  • 你有加载csrf中间件吗? django.middleware.csrf.CsrfViewMiddleware
  • middleWare 已经存在于 settings.py @professorDante

标签: python django django-forms formset


【解决方案1】:

使用render 而不是render_to_response,以便将请求包含在模板上下文中。

return render(request, 'trial1/library_form.html', {'formset': formset})

【讨论】:

  • 已经试过了。当我从 settings.py 中删除 'django.middleware.csrf.CsrfViewMiddleware' 时,它最终才起作用。不知道会不会有什么副作用
  • 不要删除中间件 - 这会使您网站的用户容易受到 csrf 攻击。您的模板上下文处理器设置的价值是什么?
【解决方案2】:

您缺少 RequestContext 对象。 CSRF 令牌由 CsrfMiddleware 添加到 RequestContext 对象。当您不包含对象时,令牌将为空(检查浏览器中的表单元素,您会发现它丢失了)。

https://docs.djangoproject.com/en/1.8/ref/templates/api/#django.template.RequestContext

使用 render 方法或将 RequestContext 添加到您的视图中

 return render_to_response('trial1/library_form.html',
                          {'formset': formset},
                          context_instance=RequestContext(request))

https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render-to-response(见context_instance属性)

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2011-12-26
    • 2014-03-29
    • 1970-01-01
    • 2014-12-25
    • 2014-02-26
    • 2021-10-01
    • 2021-11-13
    • 2012-04-20
    相关资源
    最近更新 更多