这是我第一次使用Django,所以可能有一个我不知道的明显解决方案。
我的任务是创建一个类似百科全书的网站,目标之一是为我的每一篇文章创建页面。我在我的";视图";文件:
def title_page(request, title):
if title not in util.list_entries():
return render(request, "encyclopedia/error.html")
return render(request, f"encyclopedia/title.html", {
"page_name": title,
"content": util.get_entry(title)
})
其中CCD_ 1是提供物品名称列表的函数,而CCD_。
在我的";url";文件我有一个url模式列表,其中包含我的所有路径:
urlpatterns = [
path("", views.index, name="index")
]
我试图创建一个循环,为我拥有的每一篇文章添加一个路径:
for entry in util.list_entries():
urlpatterns.append(path(f"<str:{entry}>", views.title_page(entry), name=entry))
然而,我得到了一个类型错误:
TypeError: title_page() missing 1 required positional argument: 'title'
我假设title_page
函数需要请求对象,但我不确定如何访问它以及如何通过path函数传递它,此外,在像index
函数这样不需要其他位置参数的函数中:
def index(request):
return render(request, "encyclopedia/index.html", {
"entries": util.list_entries()
})
url路径
path("", views.index, name="index")
似乎在没有请求对象作为参数的情况下工作,所以我不明白为什么在第一种情况下它不工作。
任何想法都会有很大帮助,提前谢谢。
此时不要太担心请求对象。你是对的,视图需要它,但只要你把它包含在函数定义中,django就会处理它。
您的错误是因为您的视图希望收到标题,但您的URL没有通过。
以djangoURL文档为例;
# URLconf
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page<int:num>/', views.page),
]
# View (in blog/views.py)
def page(request, num=1):
# Output the appropriate page of blog entries, according to num.
...
正如您在这里看到的,num
在视图中是预期的,并且给定了一个默认值,它也在上面的URL中定义,对/blog/
和/blog/3
的请求都会碰到相同的视图。
当请求到达/blog/
时,1
的默认值用于util.list_entries()
0变量。
所以你的视图title_page
可能有一个类似的URL;
urlpatterns = [
path('page/<str:title>/', views.title_page, name='page'),
]
然后标题将可用于您的视图,而此时此刻并没有。
然后,您可以使用django中的以下HTML标记链接到您的视图;
<a href="{% url 'page' 'News' %}">News</a>