如何将object_id传递给Django中的通用视图object_detail
Posted
技术标签:
【中文标题】如何将object_id传递给Django中的通用视图object_detail【英文标题】:How to pass object_id to generic view object_detail in Django 【发布时间】:2011-03-28 21:12:05 【问题描述】:我正在使用 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 中的 '^' 字符将模式限制为仅匹配基本 url 模式以及包含的 urlconf 中的 ^$ 之间的确切字符串?
第二:为什么问号字符会阻止视图接收'object_id'变量?我以为'?用于在 URL 中指定 GET 变量。
谢谢
【问题讨论】:
【参考方案1】:该 urlconf 告诉 Django 将.../1
、.../123
类型的 URL 映射到给定视图(...
是该 urlconf 的前缀)。 (?P<object_id>\d+)
告诉 django 将\d+
捕获的值赋给变量object_id
。另请参阅regular expressions 上的 Python 文档和URL dispatcher 上的 django 文档。
【讨论】:
【参考方案2】:我会先解决你的第二个问题。此上下文中的?
字符用于表示正则表达式中的命名组。这是regular expressions provided by Python 的自定义扩展。 (示例见howto)
要传递 object_id
将其附加到 URL(在您的情况下)。像这样:../foo/app/3
其中3
是object_id
。
【讨论】:
【参考方案3】:首先,字符串前面的“r”表示它是正则表达式,^表示字符串的开头,$表示字符串的结尾。在 python 中,当您输入 (?P<'something>a_regular_expression)
python 时,会在该字符串中找到匹配的 a_regular_expression 表达式,并将其作为变量返回,名称为:something。这里 \d+ 表示数字,它会找到一个数字并通过 object_id 的名称将其传递给您在那里分配的函数 ( article_info )。
其次,您不必担心 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]
。
【讨论】:
以上是关于如何将object_id传递给Django中的通用视图object_detail的主要内容,如果未能解决你的问题,请参考以下文章
将 Pk 或 Slug 传递给 Django 中的通用 DetailView?
如何将额外的 URL 值传递给 Django 通用 DeleteView?
将用户名传递给通用 DetailView 时出错 - django 1.4.3