He leído Django - CSRF verification failed y varias preguntas (y respuestas) relacionadas con el método django y POST. Uno de los mejores-pero-no-trabajo-para-mí respuesta es https://stackoverflow.com/a/4707639/755319Método POST siempre devuelve 403 Prohibido
Todas las respuestas aprobadas sugieren al menos 3 cosas:
- Uso RequestContext como tercer parámetro de render_to_response_call
- Agregar {}% csrf_token% en todas sus formas con el método POST
- Verificar los MIDDLEWARE_CLASSES en settings.py
que he hecho exactamente como se sugiere, pero el error sigue apareció. Yo uso Django 1.3.1 (de ubuntu 12.04 repositorio) y Python 2.7 (por defecto de Ubuntu)
Este es mi punto de vista:
# Create your views here.
from django.template import RequestContext
from django.http import HttpResponse
from django.shortcuts import render_to_response
from models import BookModel
def index(request):
return HttpResponse('Welcome to the library')
def search_form(request):
return render_to_response('library/search_form.html')
def search(request):
if request.method=='POST':
if 'q' in request.POST:
q=request.POST['q']
bookModel = BookModel.objects.filter(title__icontains=q)
result = {'books' : bookModel,}
return render_to_response('library/search.html', result, context_instance=RequestContext(request))
else:
return search_form(request)
else:
return search_form(request)
y este es mi plantilla (search_form.html):
{% extends "base.html" %}
{% block content %}
<form action="/library/search/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
{% endblock %}
He reiniciado el servidor, pero el error prohibido 403 sigue ahí, diciéndome que la verificación de CSRF falló.
He 2 preguntas:
- Cómo corregir este error?
- ¿Por qué es tan difícil hacer un "POST" en django, quiero decir, hay alguna razón específica para hacerlo tan detallado (vengo de PHP, y nunca he encontrado un problema así antes)?
de que funciona, gracias por su respuesta. ¿Pero cómo y por qué? ¿Puedes dar una explicación? – goFrendiAsgard
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it - lea el punto # 3 – zubinmehta
Porque 'csrf_token' se debe crear en su vista para que django pueda pasar a la plantilla. En su situación, dado que su vista de búsqueda no crea un token, '{% csrf_token%}' en su plantilla es 'cadena vacía (Ninguna)' y la página de resultados falla en la verificación – FallenAngel