簡體   English   中英

如何在Django命名空間可重用的應用程序中進行反向URL搜索

[英]How to do reverse URL search in Django namespaced reusable application

考慮我包含命名空間可重用的應用程序:

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()

這是真的嗎? 我錯過了什么? 有什么辦法嗎?

由於你有名稱間隔的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

至少在Django 1.8中你可以寫這樣的東西:

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

request.resolver_match.namespace是一個包含當前運行視圖的命名空間的字符串。

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%這會起作用,但值得一試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM