似乎没有直接的方法可以做到这一点。尽管我找到了一种更通用的方法,但我会使用与您使用模板标签介绍的类似的解决方案。我利用了这样一个事实:您可以在 url conf 中传递可选参数,这样您就可以跟踪命名空间:
#urls.py
from django.conf.urls import defaults
urlpatterns = defaults.patterns('',
defaults.url(r'^foo/', include('sub_urls', namespace='foo', app_name='myapp'),
kwargs={'namespace':'foo'}),
defaults.url(r'^bar/', include('sub_urls', namespace='bar', app_name='myapp'),
kwargs={'namespace':'bar'}),
)
这也违反了 DRY 原则,但并不严重:)
然后在您看来,您将获得名称空间变量(sub_urls.py 是相同的):
#views.py
from django import shortcuts
def myvew(request, namespace):
context = dict(namespace=namespace)
return shortcuts.render_to_response('mytemplate.html', context)
稍后您只需要一个简单的标记即可将命名空间变量和视图名称传递给:
#tags.py
from django import template
from django.core import urlresolvers
register = template.Library()
def namespace_url(namespace, view_name):
return urlresolvers.reverse('%s:%s' % (namespace, view_name, args=args, kwargs=kwargs)))
register.simple_tag(namespace_url)
并在模板中使用它(确保将视图名称作为字符串传递,而不是作为模板变量传递):
<!-- mytemplate.html -->
{% load tags %}
{% namespace_url namespace "view1"%}
顺便说一句,谢谢你的提示..我一直在寻找某物。像这样。