Django 和查询字符串参数

49 投票
2 回答
84484 浏览
提问于 2025-04-16 04:08

假设我有一个叫做 'get_item' 的视图,我该如何写出一个符合以下 PHP 风格的 URL 模式呢?

http://example.com/get_item/?id=2&type=foo&color=bar

(我不想使用标准的那种“好看”的 URL,比如:http://example.com/get_item/2/foo/bar,因为这样不太实际)

具体来说,我该如何让这个视图在用户在浏览器中输入上面的 URL 时能够响应,并且如何收集这些参数并在我的视图中使用呢?

我尝试过至少把 ID 部分弄对,但没有成功。当我在浏览器中输入 http://example.com/get_item?id=2 时,视图并没有运行。

我的 URL 模式是:

(r'^get_item/id(?P<id>\d+)$', get_item)

我的视图是:

def get_item(request):
    id = request.GET.get('id', None)
    xxxxxx

总之,我该如何在 Django 中实现 PHP 风格的 URL 模式,并使用查询字符串参数呢?

2 个回答

22

你只需要把你的网址格式改成:

(r'^get_item/$', get_item)

这样你的视图代码就能正常工作了。在Django中,网址格式匹配是针对实际的路径,而不是查询字符串。

73

把你的模式设置成这样:

(r'^get_item/$', get_item)

然后在你的视图中:

def get_item(request):
    id = int(request.GET.get('id'))
    type = request.GET.get('type', 'default')

Django会自动处理查询字符串,并把参数和对应的值提供给视图。你不需要做额外的配置。URL模式只涉及基本的URL,查询字符串是隐含的。

不过,按照正常的Django风格,你应该把id或slug放在基本的URL中,而不是放在查询字符串里!查询参数可以用来过滤列表视图、确定当前页面等等……

撰写回答