代码之家  ›  专栏  ›  技术社区  ›  Almad

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

  •  24
  • Almad  · 技术社区  · 15 年前

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

    现在,Ella应用程序有这样的URL:

    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'})
    

    .

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

    3 回复  |  直到 12 年前
        1
  •  7
  •   Narendra Kamma    15 年前

    因为您有名称间隔的url配置,您需要提到名称空间:视图名称模式为了正确地反转它(尤其是从视图)。

    但是,如果您想避免这种情况,也可以将namespace/appname作为当前的\u app参数传递。 当您在模板中时,有多种方法可以指定当前的应用程序。但如果你在视图中,你需要像以前一样硬编码,或者传递到当前的\u 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

        2
  •  1
  •   Scott    15 年前

    可以用两种方法指定URL名称空间。

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

    这是从 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") . 我不值得开枪,但我不会成功的。

        3
  •  0
  •   Augusto Destrero mglart    11 年前

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

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

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