2015-06-09 47 views
1

我正在使用模型表單一次添加模型的多個實例。我正在使用基於類的視圖。這是我創建「庫」modelformset_factory和csrf標記丟失或不正確

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

views.py一部分,這是我的模板

<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令牌丟失或不正確」而被禁止。我不明白爲什麼這不起作用,它變得非常令人沮喪。

+0

你有CSRF中間件裝? django.middleware.csrf.CsrfViewMiddleware – professorDante

+0

middleware已經在settings.py @professorDante – user3567826

回答

0

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

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

已經有了。它只在最後從settings.py中刪除'django.middleware.csrf.CsrfViewMiddleware'時才起作用。不知道這是否會有任何副作用 – user3567826

+0

不要刪除中間件 - 這會讓您的網站的用戶容易受到csrf攻擊。模板上下文處理器設置的價值是什麼? – Alasdair

0

您缺少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屬性)

相關問題