Я неправильно использую return render(request, url) в django? (CS50)
В проекте 1 по веб-разработке на Python и Javascript в CS50 я создал класс формы, который должен создавать новую страницу вики.
Предполагается, что функция получает входные данные, прежде чем использовать свое "действие" для запуска функции, которая вернется на главную страницу со страницы addpage после завершения работы. Но использование return render() для отправки ввода и другой необходимой информации при перенаправлении на главную страницу (то, что прекрасно работало в других функциях), похоже, не сработает и в этот раз. Происходит короткая перезагрузка, и ввод просто исчезает, перенаправления нет, а функция util.save_entry() не создала новую страницу.
Может ли кто-нибудь подсказать мне, где я мог ошибиться?
Спасибо.
Страница для добавления новых страниц
{% extends "encyclopedia/layout.html" %}
{% block title %}
Encyclopedia
{% endblock %}
{%block head%}
<link rel="stylesheet" href="styles.css">
{%endblock%}
{% block body %}
<h1>New Page</h1>
<div class="formwrapper">
<form action = "{% url 'addpage' %}" method="post">
{% csrf_token %}
{{title}}
<input type="submit">
</form>
</div>
{% endblock %}
Мои урлы:
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("<str:page>", views.getpage, name="page"),
path("addpage", views.addpage, name="addpage")
]
Функция добавления страницы в представлениях:
def addpage(request):
if request.method=="POST":
title=NewTitle(request.POST)
if title.is_valid():
newtitle = title.cleaned_data["title"]
util.save_entry(newtitle, "This is a new entry")
return render(request, "encyclopedia\index.html", {
"entries": util.list_entries(),
"form":Search()
})
#make index change when it receives newtitle
else:
return render(request, "encyclopedia/addpage.html", {
"form":Search(),
"title":NewTitle()
})
Я пробовал изменить его на HttpResponseRedirect, но то, как это делается в лекции по CS50, похоже, здесь не работает.
Я также возился со многими другими вещами, такими как содержание самой формы, проверяя, был ли запрос проблемой, спрашивая другие сайты. Основная проблема в том, что не происходит перенаправления на индексную страницу.
Насколько я понимаю, вы хотите создать экземпляр страницы и перенаправить на эту страницу.
from django.shortcuts import get_object_or_404
from django.shortcuts import render, redirect
from django.urls import reverse
def getpage(request, page):
page = get_object_or_404(Page, link=page)
enter code here
return render(request, "encyclopedia/page.html", {
"page":page,
enter code here
})
def addpage(request):
if request.method=="POST":
page=PageForm(request.POST)
if page.is_valid():
page.save()
return redirect(reverse("page", kwargs={"page": page.link})
else:
return render(request, "encyclopedia/addpage.html", {
"form":PageForm(),
})
А также path("str:page", views.getpage, name="page")
следует помещать в самый конец ваших URL. Это связано с тем, что URL страницы может совпадать с некоторыми из ваших статических URL и переопределять основные URL.
И обязательно установите поле link
на unique=True