2008-10-03 45 views
6

我有一個漂亮的標準django應用程序,並且想知道如何設置url路由,以便我不必將每個url明確映射到視圖。Django:如何創建一個通用的URL路由到視圖?

例如,假設我有以下視圖:Project, Links, Profile, Contact。我寧願沒有我的urlpatterns看起來像這樣:

(r'^Project/$', 'mysite.app.views.project'), 
(r'^Links/$', 'mysite.app.views.links'), 
(r'^Profile/$', 'mysite.app.views.profile'), 
(r'^Contact/$', 'mysite.app.views.contact'), 

等等。在Pylons,它將如此簡單:

map.connect(':controller/:action/:id') 

它會自動抓住正確的控制器和功能。 Django中有類似的東西嗎?

+0

等等,你想要'^鏈接/ $',指向'mysite.app.views.links'? – 2008-10-03 18:12:16

+0

是的,複製/粘貼錯誤是相當甜蜜的。 – swilliams 2008-10-03 18:43:02

回答

5
mods = ('Project','Links','Profile','Contact') 

urlpatterns = patterns('', 
    *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods) 
) 
+0

這給了我一個錯誤「生成器」對象沒有「解析」。我想我知道你想做什麼(爲元組中的每個字符串寫一個路由),但是它創建了一個django無法解析的生成器。 – swilliams 2008-10-03 19:04:44

5

除非你有一個非常龐大的意見,寫下來明確是不是太糟糕,從風格的角度。

您可以縮短你的榜樣,但是,通過使用patterns功能的prefix參數:

urlpatterns = patterns('mysite.app.views', 
    (r'^Project/$', 'project'), 
    (r'^Links/$', 'links'), 
    (r'^Profile/$', 'profile'), 
    (r'^Contact/$', 'contact'), 
) 
5

您可能能夠繼續沿着這條使用一個特殊的功能:

def router(request, function, module): 
    m =__import__(module, globals(), locals(), [function.lower()]) 
    try: 
     return m.__dict__[function.lower()](request) 
    except KeyError: 
     raise Http404() 

然後這樣一個urlconf:

(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}), 

這段代碼沒有經過測試,但是即使你應該記住:e總體思路應該起作用:

顯式比隱式更好。

相關問題