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

时间:2010-07-28 11:21:33

标签: django django-templates django-urls lookup reverse

假设一个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"),
)  

我现在想在{% url %}模板中使用shop。推翻此计划的原因是生成的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 个答案:

答案 0 :(得分:1)

不,没有,也不是简单的django方式。 Django不知道用[^ /] +知道你的意思,在你的情况下,它是一个应该被动态添加到反向url查找的前缀。

我想知道你为什么要将中间件特定信息添加到网址中,甚至不作为GET参数,做这样的事情就是jsut要求麻烦imho。如果你说前缀是特定于中间件的,那么在中间件之外的某个地方搞乱是没有意义的。

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

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

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