/ / Verifica CSRF di Django non riuscita. Richiesta interrotta: django, django-forms, django-views, csrf, django-csrf

Verifica Django CSRF fallita. Richiesta abortita - django, django-forms, django-views, csrf, django-csrf

Ho un modello:

class Tour(models.Model):

owner_id = models.ForeignKey(User)
name = models.CharField(max_length=50)
location = models.ManyToManyField(Location)
subscribers = models.ManyToManyField(User, related_name="sub")
tour_date = models.DateField(null=True)
description = models.CharField(max_length=300, null=True)

E un modello che include questo modulo:

 <form method="post" action="/mytours/">
{% csrf_token %}
<input name="name" value="{{ name }}" class="pull-left" type="text" placeholder="Type the tour name... "></br>
<input name="tour_date" value="{{ tour_date }}" type="text" id="datepicker" placeholder="Pick a tour date..."/>
<button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
<button type="submit" class="btn btn-primary">Save</button>
</form>

E nelle mie opinioni sto cercando di aggiungere al mio database ciò che è compilato nel modulo:

if request.method == "POST":
location = Location.objects.get(id=1)
name = request.POST.get("name", "")
tour_date = request.POST.get("tour_date", "")
tour = Tour()
tour.owner_id = user.pk
tour.name = name
tour.tour_date = tour_date
tour.location = location
tour.save()
c = {"name":name, "tour_date":tour_date, "tour":tour}
c.update(csrf(request))
return render_to_response("myTours.html", c)

Sono nuovo in Django e non so dov'è il problema.

risposte:

4 per risposta № 1

Stai fraintendendo cosa fare con il CSRFgettone. Lo stai creando su POST, ma il punto è crearlo per la visualizzazione originale del modulo sulla richiesta GET. Viene controllato dal middleware su POST, quindi non è necessario aggiungerlo lì.

Dovresti usare il render chiamare come raccomandato da surfeurX, ma sulla chiamata che mostra il modulo in primo luogo.


1 per risposta № 2

Quello che faccio quando implemento i form in django è scrivere una classe di form e crearne un'istanza nella vista. Quindi passa l'istanza al modello.

# form class eg. in models.py
from django import forms

class TourForm(forms.Form):
name = forms.CharField(max_length=50)

# in the view
if request.method == "POST":
form = TourForm(request.POST)
if form.is_valid():
# do your stuff here with form data
else:
form = TourForm() # An unbound form

return render(request, "myTours.html", {
"form": form,
})

nel tuo modello puoi visualizzare il modulo generato in questo modo:

<form action="/mytours/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" class="btn btn-primary" />
</form>

per ulteriori informazioni basta guardare all'interno del funzionario documentazione dei moduli django


0 per risposta № 3

Probabilmente devi aggiungere django.middleware.csrf.CsrfViewMiddleware a MIDDLEWARE_CLASSES e aggiungi un RequestContext alla tua risposta:

return render_to_response("myTours.html", c, context_instance=RequestContext(request))

https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/


0 per risposta № 4

Come rendi il tuo modello ??? Penso che il tuo csrf_token non stampa alcun input nascosto, aggiungi "richiesta" nel contesto del tuo modello come:

return render(request, "template.html", {"var": var})

https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render