【问题标题】:generating paths with django and python, what is the request object用django和python生成路径,请求对象是什么
【发布时间】:2021-06-21 14:00:02
【问题描述】:

这是我第一次使用 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)
    })

其中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()
    })

网址路径

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

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

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

【问题讨论】:

    标签: python django path request


    【解决方案1】:

    此时不要太担心请求对象。你是对的 - 视图需要它,但只要你将它包含在函数定义中,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 标记链接到您的视图;

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

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2012-07-01
      • 2011-11-23
      • 1970-01-01
      相关资源
      最近更新 更多