2015-06-09 11 views
1

Я использую модели форм, чтобы сразу добавить несколько экземпляров модели. и я использую представления на основе классов. Это моя views.py часть для создания «библиотеки»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}) 

и это мой шаблон

<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 уже существует в настройках.py @professorDante – user3567826

ответ

0

Используйте render вместо render_to_response, чтобы запрос был включен в контекст шаблона.

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

уже пробовал это. он работал только в конце, когда я удалил 'django.middleware.csrf.CsrfViewMiddleware' из settings.py. Не знаю, будет ли это иметь какие-либо побочные эффекты. – 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 атрибут)

Смежные вопросы