在使用 CS50 使用 Python 和 Javascript 进行 Web 开发的项目 1 中,我制作了一个表单类,该类应该创建一个新的 wiki 页面。
它应该在使用其“操作”触发一个函数之前获取输入,该函数完成后将从 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