/ / Problemi di POST Django nelle viste - django, python-2.7, django-views

Problemi di POST di Django in viste: django, python-2.7, viste di django

Sto cercando di consentire a un utente di aggiornare un valore booleanovariabile di un modello, ma mi sembra che stia riscontrando problemi nel salvare la modifica nel db e nel renderizzare la modifica nel modello. il modello è "Pic" e la variabile booleana è "Buono".

Nel modello (spazio dei nomi "single_picture"):

<form action="" method="POST">
{% csrf_token %}
{% if Pic.Good %}
<input type="submit" name="choice" id="{{ Pic.id }}" value="False" />
{% else %}
<input type="submit" name="choice" id="{{ Pic.id }}" value="True" />
{% endif %}
</form>

Negli URL dell'app:

url(r"^(?P<Pic_id>d+)/$", views.single_picture, name="single_picture"),

e in views.py:

def single_picture(request, Pic_id):
# "detail" in tutorial
if request.method == "GET":
pic = get_object_or_404(Pic, pk=Pic_id)
latest_pictures_list = Pic.objects.all()
return render(request, "pictures/single_picture.html", {"Pic": pic, "latest_pictures_list": latest_pictures_list})
elif request.method == "POST":
pic = get_object_or_404(Pic, pk=Pic_id)
latest_pictures_list = Pic.objects.all()
try:
pic.Good=request.POST["choice"]
except (KeyError, Pic.DoesNotExist):
return render(request, "pictures/single_picture.html", {"Pic": pic, "error_message": "uhhhh...",
})
else:
pic.save()
return HttpResponseRedirect(reverse("pictures:pic", pic.id))

Se stampo pic.Good sul terminale alla fine del tentativo: istruzione posso vedere che sta mostrando quello cambiato, ma pic.save () non sembra salvarlo sul db, e ottengo anche

Impropriamente configurato in / pictures / 4 /

Urlconf 4 incluso non contiene alcun pattern

nell'istruzione render. Ciò sembra indicare qualcosa che manca negli URL del progetto o dell'app. Come salvare correttamente le modifiche e renderle?

risposte:

1 per risposta № 1

Secondo Django documentazione sulla funzione inversa, il secondo parametro è l'argomento urlconf.

L'argomento urlconf è il modulo URLconf che contiene i pattern url da utilizzare per l'inversione.

Per fornire i parametri per la costruzione dell'URL è necessario utilizzare args o kwargs argomenti denominati.

Prova a cambiare la tua dichiarazione di ritorno in qualcosa del genere:

return HttpResponseRedirect(reverse("pictures:pic", args=[pic.id]))

Non conosco il problema di salvataggio del database, ma provo a spostare la tua chiamata di salvataggio delle immagini più vicino al codice di aggiornamento delle immagini a scopo di debug:

elif request.method == "POST":
pic = get_object_or_404(Pic, pk=Pic_id)
latest_pictures_list = Pic.objects.all()
try:
pic.Good=request.POST["choice"]
pic.save()
return HttpResponseRedirect(reverse("pictures:pic", args=[pic.id]))
except (KeyError, Pic.DoesNotExist):
return render(request, "pictures/single_picture.html", {"Pic": pic,     "error_message": "uhhhh...",
})

Modifica 1

Per quanto riguarda l'errore NoReverseMatch, si sta utilizzando spazi dei nomi url ( "Immagini: pic"). Non ne ho molta familiarità, ma immagino che il inverso la funzione cerca vista con name = "pic" all'interno della configurazione dell'URL per immagini app.

Sei sicuro che tale vista esista nel tuo file di configurazione dell'URL?


-1 per risposta № 2

non una risposta alla tua domanda, ma un buon consiglio è quello di sostituire questo:

<form action="" method="POST">
{% csrf_token %}
{% if Pic.Good %}
<input type="submit" name="choice" id="{{ Pic.id }}" value="False" />
{% else %}
<input type="submit" name="choice" id="{{ Pic.id }}" value="True" />
{% endif %}
</form>

con questo:

<form action="" method="POST">
{% csrf_token %}
<input type="submit" name="choice" id="{{ Pic.id }}" value={% if Pic.Good %}"True"{% else %} "False" {% endif %} />
</form>