用django和python生成路径,请求对象是什么

generating paths with django and python, what is the request object

这是我第一次使用 Django,所以可能有一个我不知道的明显解决方案。

我的任务是创建一个类似百科全书的网站,objective 正在为我拥有的每篇文章创建页面。 我在“视图”文件中创建了一个函数:

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

其中 util.list_entries() 是提供文章名称列表的函数,util.get_entry 是提供所述文章名称的内容的函数。

在我的“urls”文件中,我有一个包含我所有路径的 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:

TypeError: title_page() missing 1 required positional argument: 'title'

我想 title_page 函数需要请求对象,但我不确定如何访问它以及如何通过路径函数传递它,而且在 index 函数之类的函数中不需要其他位置参数:

def index(request):
    return render(request, "encyclopedia/index.html", {
        "entries": util.list_entries()
    })

url路径

path("", views.index, name="index")

似乎在没有请求对象作为参数的情况下也能工作,所以我不明白为什么在第一种情况下它不能。

任何想法都会有很大帮助,在此先感谢您。

此时不要太担心请求 object。你是对的——视图需要它,但只要你将它包含在函数定义中,django 就会处理它。

您的错误是因为您的视图希望收到标题,但您的 URL 没有传递它。

从django中拿这个例子URL docs;

# 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 的默认值用于 num 变量。

所以您的观点 title_page 可能会有 URL 赞;

urlpatterns = [
    path('page/<str:title>/', views.title_page, name='page'),
]

然后标题将在您当前不可用的视图中可用。

然后您可以使用以下来自 django 的 HTML 标签 link 到您的视图;

<a href="{% url 'page' 'News' %}">News</a>