2010-12-28 21 views
20

Recibo un mensaje de error de verificación de CSRF al intentar crear un formulario simple a partir de un tutorial. Hice un poco de investigación en lo que la verificación CSRF que realmente es, y que yo sepa, con el fin de usarlo necesita una de esas etiquetas csrf_token en su html, pero no tiene queDjango - Falló la verificación de CSRF

Aquí es mi plantilla:

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

bastante sencillo, situado en contact.html

Aquí es mi URLconf: de django.conf.urls.defaults importar *

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

El nombre de la aplicación es testapp1. Cuando escribo mi url (http: // localhost: 8000/testapp1/contact), voy correctamente al formulario. Luego, cuando envío el formulario, obtengo el error de verificación.

Aquí es mi punto de vista, aunque no creo que sea relevante:

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

Respuesta

30

. incluya {% csrf_token %}dentro de la etiqueta del formulario en la plantilla.

. utilizar un RequestContext en render_to_response

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

[Actualización]

Hoy en día utilizo render en lugar de render_to_response (mismo efecto con menos de mecanografía):

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

Ya que acababa de gotte n a trabajar haciendo eso. Creo que pensé que la protección de CSRF era opcional. Aparentemente, si envía un formulario NECESITA usar CSRF o no funcionará. Oh bien. Gracias – JPC

+2

@JPC: depende de su configuración. Si usa el middleware CSRF de lo requerido a menos que use el decorador 'csrf_excempt'. Si no lo usa, no es necesario a menos que use el decorador 'csrf_protect'. – Wolph

+1

también necesitará 'importar desde django.template import RequestContext' – northben

2

Para Django 1.4

configuración. 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> 
3

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 %} 
Cuestiones relacionadas