/ / Django Видання щодо POST у видах - django, python-2.7, django-views

Django POST видає уявлення - django, python-2.7, django-views

Я намагаюся дозволити користувачеві оновити булеву системузмінна модель, але, здається, у мене виникають проблеми із збереженням змін у db, а потім рендерінгом змін у шаблон. модель - "Pic", а булева змінна - "Good".

У шаблоні (проміжок часу "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>

У URL-адресах програми:

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

та в 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))

Якщо я роздрукую pic.Good до терміналу наприкінці спробу: оператор, я можу побачити, що він відображає змінений, але pic.save (), схоже, не зберігає його в db, і я також отримую

Неправильно налаштовано на / фотографії / 4 /

Включений urlconf 4 не має в ньому ніяких візерунків

при рендерінгу. Це, мабуть, вказує на щось, що не вистачає в URL-адресах проекту чи програми. Як правильно зберегти зміни та надати зміни?

Відповіді:

1 для відповіді № 1

За джанго документація про зворотну функцію, другий параметр - аргумент urlconf.

Аргумент urlconf - це модуль URLconf, що містить шаблони URL-адреси, які слід використовувати для реверсування.

Щоб поставити параметр для побудови URL-адреси, потрібно використовувати аргс або kwargs названі аргументи.

Спробуйте змінити свою заяву про повернення на щось подібне:

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

Я не знаю про проблему збереження бази даних, але спробуйте перенести свій дзвінок збереження pic ближче до коду оновлення pic для налагодження:

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...",
})

Редагувати 1

Щодо помилки NoReverseMatch, яку ви використовуєте простори імен URL ("картинки: рис"). Я не дуже знайомий з цим, але я гадаю, що зворотний функція шукає перегляд за допомогою name = "pic" всередині конфігурації URL для фотографії додаток

Ви впевнені, що такий перегляд існує у вашому файлі конфігурації URL?


-1 для відповіді № 2

не відповідь на ваше запитання, але хороша порада - замінити це:

<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>

з цим:

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