如何将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&lt;object_id&gt;\d+) 告诉 django 将\d+ 捕获的值赋给变量object_id。另请参阅regular expressions 上的 Python 文档和URL dispatcher 上的 django 文档。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

首先,字符串前面的“r”表示它是正则表达式,^表示字符串的开头,$表示字符串的结尾。在 python 中,当您输入 (?P&lt;'something&gt;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

如何将通用视图传递给 SwiftUI 中的结构

如何将 JSON 传递给 Django 中的 Ajax 请求?

如何将 POST 数据中的 CSRF 令牌传递给 Django?