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 № 1Stai 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