如何在Django中将object_id传递给泛型视图object_detail

时间:2010-08-12 11:28:27

标签: python regex django django-urls

我正在使用django.views.generic.list_detail.object_detail。

根据文档,视图采用变量object_id。为此,我将以下内容添加到我的urlconf:

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

以上行位于主urlconf中包含的单独urlconf中。

如果我在模式的开头留下'^'字符,然后尝试转到地址:

... /?的object_id = 1

它不起作用。如果我删除地址的'^'字符:

... /?的object_id = 1

仍然无效。但是,如果我使用:

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

视图接受object_id变量并且没有问题。我有两个问题。

首先:包含的urlconf中的'^'字符是否可以用来限制模式只匹配基本网址模式加上包含在urlconf中的^ $之间的确切字符串?

第二:为什么问号字符会阻止视图接收'object_id'变量?我以为'?'用于在URL中指定GET变量。

感谢

3 个答案:

答案 0 :(得分:3)

我先解决你的第二个问题。此上下文中的?字符用于表示正则表达式中的命名组。这是regular expressions provided by Python的自定义扩展程序。 (有关示例,请参阅howto

传递object_id将其附加到网址(在您的情况下)。像这样:../foo/app/3其中3object_id

答案 1 :(得分:2)

urlconf告诉Django将.../1.../123类型的URL映射到给定视图(...作为该urlconf的前缀)。 (?P<object_id>\d+)告诉django将\d+捕获的值分配给变量object_id。另请参阅关于regular expressions的Python文档和关于URL dispatcher的django文档。

答案 2 :(得分:1)

首先,字符串前面的“r”表示它是正则表达式,^表示字符串的开头,$表示字符串的结尾。在python中放置(?P<'something>a_regular_expression) 时,python会在该字符串中找到a_regular_expression的匹配表达式,并将其作为变量返回,其名称为:something。这里\ d +表示数字,它会找到一个数字并将其传递给你在那里指定的函数(article_info),其名称为object_id。

第二,你不应该担心GET网址,你只需设置主网址,django将自己管理GET变量。例如,如果您的网址格式中有(r'^/post/$, my_app.views.show_post)并且您发送此获取请求../post/?id=10,则django将使用您的my_app.views.show_post函数,您可以访问request.GET中的get变量,如果如果您想获取ID,可以使用此request.GET[id]