2016-09-29 15 views
1

加載我想在Django上的所有URL模式表演魔術:信號時,所有的URL在Django

如果他們沒有一個名字,然後我想給他們一個自動的名字。

不幸的是,django似乎懶惰地加載了url模式。

實現這個magic-add-name方法很簡單,不是這個問題的一部分。

問題:在哪裏調用這個方法?我需要在所有的url已經被加載並且在第一個請求被處理之前調用這個方法。

代碼應該適用於Django 1.9和Django 1.10。

背景

Django的棄用這樣使用進口的字符串(Deprecate the ability to reverse by dotted path)

reverse('myapp.views.my_view') 

我有一個大的遺留代碼基礎,而且我不喜歡打字和維護冗餘字符。

我希望沒有名稱的所有網址都具有相應導入字符串的名稱。

urls.p中的示例y:

url(r'^.../.../(?P<pk>[^/]+)/$', views.my_view)) 

我想將此網址的名稱自動設置爲'myapp.views.my_view'。

+0

當你不能在你的代碼中使用這些名字時,命名URL模式有什麼意義? –

+0

@NilsWerner我更新了問題,揭示了我的背景。 – guettli

回答

1

我不會用信號更改創建網址事後而是寫django.conf.urls.url在更換包裝下降:

def url(*args, **kwargs): 
    if 'name' not in kwargs: 
     kwargs['name'] = modulename(args[1]) # Returns something like 'polls.indexview' 

    return django.conf.urls.url(*args, **kwargs) 

,你可以像

# from django.conf.urls import url # Removed to enable auto-naming 
from autonameroutes.urls import url 

from . import views 

app_name = 'polls' 
urlpatterns = [ 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'), 
    ... 
] 

的再使用邏輯應該與在更改系統中的所有路由時基本相同,但是當您想要使用它時,您將擁有更多的控制權,並且對於稍後維護代碼的開發人員而言,這種更改會更加明顯。

+0

是的,這可以工作。我會用這個新的代碼。但我有一個很大的遺留代碼庫,我想更新,而不用做太多的搜索+替換。這就是爲什麼我仍然在尋找一種方法在django的初始啓動期間掛鉤到匹配點。 – guettli