Подтвердить что ты не робот

Ошибка Django - CSRF

Я получаю сообщение об ошибке проверки CSRF при попытке сделать простую форму из учебника. Я сделал небольшое исследование того, что проверка CSRF на самом деле, и, насколько мне известно, для ее использования вам нужен один из тегов csrf_token в вашем html, но у меня нет этого

Здесь мой шаблон:

<form action="/testapp1/contact/" method="post">
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>

Довольно простой, расположенный в contact.html

Здесь мой urlconf: from django.conf.urls.defaults import *

urlpatterns=patterns('testapp1.views',
    (r'^$', 'index'),
    (r'^contact/$','contact')
)

Имя приложения - testapp1. Когда я печатаю свой url (http://localhost: 8000/testapp1/contact), я правильно перехожу к форме. Затем, когда я отправляю форму, я получаю ошибку проверки.

Вот мой взгляд, хотя я не думаю, что это важно:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            cc_myself = form.cleaned_data['cc_myself']
            recipients = ['[email protected]']
            if cc_myself:
                recipients.append(sender)
            print 'Sending Mail:'+subject+','+message+','+sender+','+recipients
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })
4b9b3361

Ответ 1

1. включите {% csrf_token %} внутри тег формы в шаблоне.

2. используйте RequestContext в render_to_response

return render_to_response('contact.html', {'form': form},
                   context_instance=RequestContext(request))

[обновление]

В настоящее время я использую render вместо render_to_response (тот же эффект при меньшем наборе текста):

return render(request, 'contact.html', {form: form})

Ответ 2

views.py:

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view(request):
    return render_to_response('mytemplate.html', context_instance=RequestContext(request)) 

mytemlate.html:

<form action="/someurls/" method="POST">{% csrf_token %}

Ответ 3

Для Django 1.4

settings.py

MIDDLEWARE_CLASSES = (
...
'django.middleware.csrf.CsrfViewMiddleware',
)

view.py

from django.template.defaulttags import csrf_token
from django.shortcuts import render

@csrf_token
def home(request):
    """home page"""
    return render(request,
        'template.html',
            {}
    )

template.html

<form action="">
    {% csrf_token %}
....
</form>