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 查找的主要内容,如果未能解决你的问题,请参考以下文章