Ho letto Django - CSRF verification failed e diverse domande (e risposte) relative al metodo django e al metodo POST. Uno dei migliori-ma-non-lavoro-per me-risposta è https://stackoverflow.com/a/4707639/755319Il metodo POST restituisce sempre 403 Proibito
Tutte le risposte approvate suggeriscono almeno 3 cose:
- Usa RequestContext come terzo parametro di render_to_response_call
- Add {% csrf_token%} in ogni forma con metodo POST
- Controllare le MIDDLEWARE_CLASSES in settings.py
ho fatto esattamente come suggerito, ma l'errore ancora apparso. Io uso django 1.3.1 (da Ubuntu 12.04 repository) e Python 2.7 (di default da Ubuntu)
Questa è la mia opinione:
# 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)
e questo è il mio modello (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 %}
Ho riavviato il server, ma l'errore 403 vietato è ancora lì, dicendo che la verifica CSRF non è riuscita.
Sono 2 domande:
- come riparare questo errore?
- Perché è così difficile fare un "POST" in django, voglio dire c'è qualche ragione specifica per renderlo così prolisso (vengo da PHP, e non ho mai trovato un problema simile prima)?
di che funziona, grazie per la tua risposta. Ma come e perché? Puoi per favore dare una spiegazione? – goFrendiAsgard
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it - leggi il punto # 3 – zubinmehta
Perché 'csrf_token' deve essere creato nella tua vista in modo che django possa passare al modello. Nella tua situazione, dato che la tua vista di ricerca non crea un token, '{% csrf_token%}' nel tuo modello è 'stringa vuota (Nessuno)' e la pagina dei risultati non riesce sulla verifica – FallenAngel