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

时间:2010-08-26 19:49:57

标签: python django django-urls

考虑我包含命名空间可重用的应用程序:

urlpatterns = patterns('',
    # ella urls
    url('^ella/', include('ella.core.urls', namespace="ella")),
)

现在,Ella应用程序的网址是这样的:

urlpatterns = patterns( '',
    url( r'^(?P<category>[a-z0-9-/]+)/$', category_detail, name="category_detail" ),
    # object detail
    url( r'^(?P<category>[a-z0-9-/]+)/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<content_type>[a-z0-9-]+)/(?P<slug>[a-z0-9-]+)/$',
        object_detail, name="object_detail" )
)

现在,调用{% url ella:category_detail category="cat" %}可以正常工作。但是,当对象尝试生成指向其详细信息的链接时,它会调用

from django.core.urlresolvers import reverse
url = reverse('object_detail', kwargs={'required' : 'params'})

这不起作用,除非重写为

from django.core.urlresolvers import reverse
url = reverse('ella:object_detail', kwargs={'required' : 'params'})

因此,如果我理解正确,包括可重用的应用程序进入命名空间会破坏给定应用程序内的所有内部reverse()

这是真的吗?我错过了什么?有什么办法吗?

3 个答案:

答案 0 :(得分:6)

由于你有名称间隔的url配置,你需要提到namespace:view-name模式以便正确地反转它(特别是从视图中)。

但是,如果你想避免这种情况,你也可以将namespace / appname作为current_app参数传递。 当您在模板中时,有多种方法可以指定current_app。但是如果你在视野中,你需要像你一样进行硬编码,或者传递给current_app参数

url = reverse('object_detail', 
              kwargs={'foo':'bar'}, 
              current_app=app_name_or_name_space)

参考:http://docs.djangoproject.com/en/dev/topics/http/urls/#reverse

答案 1 :(得分:0)

  

URL命名空间可以通过两种方式指定。

     

首先,在构造URL模式时,可以将应用程序和实例名称空间作为include()的参数提供。例如,:

     

(r'^ help /',include('apps.help.urls',namespace ='foo',app_name ='bar')),

这是http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces

尝试将include('ella.core.urls', namespace="ella")更改为include('ella.core.urls', namespace="ella", app_name="ella")。我不是100%这会起作用,但值得一试。

答案 2 :(得分:0)

至少在Django 1.8中你可以这样写:

url = reverse('%s:object_detail' % request.resolver_match.namespace, kwargs={'required' : 'params'})

request.resolver_match.namespace是一个包含当前正在运行的视图的命名空间的字符串。