如何在Django中将object_id传递给通用视图object_detail

2 投票
3 回答
2163 浏览
提问于 2025-04-16 02:41

我在使用django.views.generic.list_detail.object_detail这个功能。

根据文档,这个视图需要一个叫做object_id的变量。为此,我在我的网址配置中添加了以下内容:

(r'^(?P<object_id>\d+)$', list_detail.object_detail, article_info),

上面的代码是在一个单独的网址配置中,这个配置被包含在主网址配置里。

如果我在模式的开头保留'^'这个字符,然后尝试访问这个地址:

.../?object_id=1

这样是无法工作的。如果我去掉'^'字符,访问这个地址:

.../?object_id=1

依然无法工作。不过如果我使用:

.../object_id=1(没有问号)

这个视图就能接受object_id变量,并且正常工作。我对此有两个问题。

第一个:在一个被包含的网址配置中,'^'字符能否用来限制模式,只匹配基本网址模式加上'^$'之间的确切字符串?

第二个:为什么问号字符会阻止视图接收'object_id'变量?我以为问号是用来表示网址中的GET变量的。

谢谢

3 个回答

1

首先,字符串前面的“r”表示这是一个正则表达式,而“^”代表字符串的开始,“$”代表字符串的结束。在Python中,当你写 (?P<'something>a_regular_expression) 时,Python会在这个字符串中找到符合 a_regular_expression 的部分,并把它作为一个名为 something 的变量返回。这里的 \d+ 表示数字,它会找到一个数字并通过你指定的函数(这里是 article_info)传递给它,变量名是 object_id。

其次,你不需要担心 GET 请求的 URL,只需设置主 URL,Django 会自动处理 GET 变量。例如,如果你的 URL 模式中有 (r'^/post/$, my_app.views.show_post),而你发送了这个 GET 请求 ../post/?id=10,Django 会使用你的 my_app.views.show_post 函数,你可以在 request.GET 中访问 GET 变量。如果你想获取 id,可以使用 request.GET[id]

2

这个urlconf告诉Django如何处理类似于.../1.../123这样的链接(...是这个urlconf的前缀)。(?P<object_id>\d+)的意思是让Django把\d+捕获到的值赋给一个叫object_id的变量。想了解更多,可以查看Python关于正则表达式的文档,以及Django关于URL调度器的文档。

3

我先回答你的第二个问题。在这个情况下,?这个字符是用来表示正则表达式中的一个命名组。这是Python对正则表达式的一种自定义扩展。(你可以查看这个教程来获取例子)

要传递一个object_id,你需要把它附加到网址上(在你的例子中)。比如这样:../foo/app/3,其中3就是object_id

撰写回答