如何在Django中将object_id传递给通用视图object_detail
我在使用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 个回答
首先,字符串前面的“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]
。