假设一个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
然后必须处理它所做的事情根本不需要。
答案 0 :(得分:1)
不,没有,也不是简单的django方式。 Django不知道用[^ /] +知道你的意思,在你的情况下,它是一个应该被动态添加到反向url查找的前缀。
我想知道你为什么要将中间件特定信息添加到网址中,甚至不作为GET参数,做这样的事情就是jsut要求麻烦imho。如果你说前缀是特定于中间件的,那么在中间件之外的某个地方搞乱是没有意义的。
可以工作的解决方案(没有测试它)是在中间件中设置一个请求上下文变量,如environment_prefix
,然后在url之前手动附加。所以像这样:
/{{ environment_prefix }}{% filter slice:"1:" %}{% url shopview %}{% endfilter %}
另一种可能性是尝试实现自己的url模板标记(从url templatetag继承)以始终包含当前前缀,该前缀也可以是中间件设置的上下文变量。