2015-09-26 75 views
1

Django的版本:1.8或1.9如何製作當前應用程序實例的反向URL?

重新使用myapp幾次基於不同的URL在mysite/urls.py有:

url(r'^myapp_1/', include('myapp.urls')), 
url(r'^myapp_2/', include('myapp.urls')), 

myapp/urls.py是:

url('^rev/$', views.rev, name='rev'), 

所以我需要做一個反向的URL,如reverse('rev'),它在同一個myapp instan中創建一個反向URL CE,這對於不同的網址看起來微不足道:

  • .../myapp_1 /轉/ => .../myapp_1 /轉/
  • .../myapp_2 /轉/ => .../myapp_2 /轉/

,我發現了一些相關的問題都沒有一個很好的解決方案,像thisthis,但他們似乎是更老的Django版本比1.8/1.9,並且看起來相反的URL計劃已經改變。然而,我還沒有能夠破譯Django documentation on Reversing namespaced URLs來提供這個功能,我認爲這是微不足道的,所以任何幫助表示讚賞。

回答

1

可以包括myapp.urls兩次,使用相同的應用程序的命名空間,但不同的實例命名空間:

url(r'^myapp_1/', include('myapp.urls', namespace='myapp1', app_name='myapp')), 
url(r'^myapp_2/', include('myapp.urls', namespace='myapp2', app_name='myapp')), 

然後,在你的代碼,使用應用程序的命名空間反向鏈接,並通過當前實例命名空間在current_app參數:

reverse('myapp:rev', current_app=request.resolver_match.namespace) 

當使用在模板中{% url %}標籤,你不能直接傳遞當前的命名空間,但是你可以設置current_app屬性Ø n請求相同的效果:

# in your view 
request.current_app = request.resolver_match.namespace 

# in your template 
{% url 'myapp:rev' %} 

在1.9中,這個已經稍微改變了。您可以指定在包含URL配置app_name,並在呼叫namespaceinclude(),像這樣:

mysite/urls.py

url(r'^myapp_1/', include('myapp.urls', namespace='myapp1')), 
url(r'^myapp_2/', include('myapp.urls', namespace='myapp2')), 

myapp/urls.py

app_name = 'myapp' 
urlpatterns = [ 
    url('^rev/$', views.rev, name='rev'), 
] 

在1.9另一個變化是, {% url %}模板標籤現在默認使用當前請求的名稱空間。如果您需要在相同的名稱空間中反轉網址,則不必再明確設置request.current_app。如果您使用reverse(),您仍然需要傳遞當前的應用程序。

+0

感謝您的詳細描述。我在Django ver上試過這個。 1.8.4,並且適用於'reverse'和'{%url%}'。看起來像版本。 1.9更新是合理的,所以應用程序本身可以定義應用程序。名稱空間,它將在內部使用反向或URL調用。 – EquipDev

0

在你的urls.py中使用namespaces

編輯:你鏈接的答案看起來不錯。這些具體問題是什麼?如果有差異,我將版本1.8的文檔鏈接起來。

+0

像'url(r'^ myapp_1 /',包括('myapp.urls',namespace ='myapp_1'))這樣的命名空間如何能夠根據視圖中相同的代碼生成不同的反向URL ? – EquipDev

相關問題