Django:使用任意 URL 组件进行反向 URL 查找

Posted

技术标签:

【中文标题】Django:使用任意 URL 组件进行反向 URL 查找【英文标题】:Django: Reverse URL lookup with arbitrary URL components 【发布时间】:2011-03-22 02:32:48 【问题描述】:

假设一个 Django 应用 shop,其 urls.py 包含在主 urls.py 中:

# main urls.py
urlpatterns = patterns('',
    (r'^[^/]+/shop/', include('shop.urls')),
)

注意,/shop 之前有一个任意前缀。 shop 应用程序对此没有兴趣,它只对某些中间件感兴趣。

shop.urls 可能如下所示:

# shop's urls.py
urlpatterns = patterns('',
    url(r'^$', index, name="shop_index"),
    url(r'^product/(?P<id>[^/]+)$', product, name="shop_product"),
)  

我现在想在我的shop 模板中使用% url %。推翻这个计划的是,生成的 URL 不包含来自全局 urls.py 的前缀。生成的 URL 看起来更像,例如

/^/shop/product/1

问题: 现在,是否有可能(在 Django 1.2 或 svn trunk 中)启用反向查找以使用当前 URL 中的相同前缀?例如,如果request.path/foo/shop/,则% urls shop_product id=1 % 返回

/foo/shop/product/1

我想出的唯一方法是接受前缀并将其发送到 shop 应用程序视图,但这是一个非常糟糕的解决方案,因为 shop 然后必须处理它不需要的东西全部。

【问题讨论】:

【参考方案1】:

不,没有,无论如何都不是直接的 django 方式。 Django 不知道您对 [^/]+ 的含义,在您的情况下,它是应动态添加到反向 url 查找的前缀。

我还想知道为什么您将中间件特定信息添加到 url 甚至不作为 GET 参数,做这样的事情就是自找麻烦恕我直言。如果你说前缀是特定于中间件的,那么在中间件之外的地方乱用它是没有意义的。

一个可行的解决方案(没有测试它)是在你的中间件中设置一个请求上下文变量,比如environment_prefix,然后在url之前手动附加这个变量。所以是这样的:

/ environment_prefix % filter slice:"1:" %% url shopview %% endfilter %

另一种可能性是尝试实现自己的 url 模板标签(继承自 url 模板标签)以始终包含当前前缀,该前缀又可以是中间件设置的上下文变量。

【讨论】:

嗯,我很担心(并开始在心里实现一个 url 模板标签扩展)。感谢您的回答。

以上是关于Django:使用任意 URL 组件进行反向 URL 查找的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中使用主键对 url 进行反向操作

Django - 在设置中使用反向 url 映射

Django之url反向解析

接收错误:使用参数“()”和未找到关键字参数反向

Django:提要的反向查找URL?

如何在 Django 命名空间可重用应用程序中进行反向 URL 搜索