2012-08-16 77 views
1

Understanding django.shortcuts.redirect我開始了一個關於reverseredirect_to的帖子。undertading django.shortcuts.reverse,第2部分

當第一個參數是一個字符串時,我仍然有一些理解reverse如何工作的問題。我多次閱讀https://docs.djangoproject.com/en/1.4/topics/http/shortcuts/#django.shortcuts.redirect,與reverse對應的部分。但我仍然遇到了一個例外情況。

在我ROOT_URLCONF我有

urlpatterns = patterns('', 
    url(r'^$', redirect_to, {'url': '/monitor/'}), 
    url(r'^monitor/', include('monitor.urls')), 
) 

monitor.urls

urlpatterns = patterns('monitor.views', 
    (r'^$', 'index'), 
    (r'^list', 'listall'), 
) 

monitor.urls我爲這兩種功能,indexlistall定義的代碼。在listall我添加下面幾行:

def listall(request): 
    <more code goes here> 
    print "reversing 1 index: %s " % reverse(index) 
    print "reversing 2 index: %s " % reverse('index') 
    render_to_response("monitor/list.htmld", params) 

如果我訪問本地主機:3000 /監視/列表,然後我可以看到

reversing 1 index: /monitor/ 

,沒有別的,第二reverse拋出一個異常。爲什麼?我錯過了什麼?

我追蹤到djangos代碼django.core.urlresolvers.callabledjango.core.urlresolvers.get_mod_funcget_mod_func似乎期望類似「a.b」,這就是爲什麼在callable第一行返回func_name的「索引」,但mod_name空字符串。我改變了我的第二行

print "reversing 2 index: %s " % reverse('monitor.views.index') 

和它的工作如預期。那麼,爲什麼我需要使用完整的模塊和函數名稱(當我使用字符串時)調用reverse並且文檔沒有?我錯過了什麼?

感謝

+0

據我所知,反向期望能夠通過它的'name'參數找到一個URL模式,或者被調用函數的全限定路徑。 – Brandon 2012-08-16 11:14:37

+0

使用'url()'作爲'monitor.urls'中的一個urlpatterns項(與'ROOT_URLCONF'相同) - 'url()'具有可選的'name'屬性,它是可以用作字符串參數的字符串對'reverse' – yedpodtrzitko 2012-08-16 11:17:41

+0

@yedpodtrzitko:我無法完全理解你的意思:( – Pablo 2012-08-16 11:36:02

回答

2

我不知道你是什麼掛文件的一部分了,但reverse的第一個參數是獲得一個視圖的一些識別方法:它可以是一個URLPATTERN名稱,視圖的完整虛線路徑或視圖本身

因此,根據您的示例,第一種方法已經過期,因爲您沒有爲您的urlpattern定義名稱。你的第一次嘗試,reverse(index)工作,因爲你從字面上通過它的觀點。第二次嘗試reverse('index')不起作用,因爲它需要完整的導入上下文,即'monitor.views.index'。兩者之間的區別在於,當它是一個字符串時,Django必須解釋該字符串以爲視圖創建一個導入 - 而'index'不足以確定導入路徑的信息。

但是,如果打算反轉它們,只需命名您的視圖就好多了,而且您還應該爲包含的urlpatterns命名空間,以便兩個不同的應用程序不會最終發生衝突。因此,在項目級urls.py:

urlpatterns = patterns('', 
    url(r'^$', redirect_to, {'url': '/monitor/'}), 
    url(r'^monitor/', include('monitor.urls', namespace='monitor', app_name='monitor')), 
) 

然後,在顯示器/ urls.py:

urlpatterns = patterns('monitor.views', 
    (r'^$', 'index', name='index'), 
    (r'^list', 'listall', name='listall'), 
) 

然後,倒車是reverse('monitor:index')一樣簡單。

+0

感謝您的解釋。 – Pablo 2012-08-16 17:52:31

2

你應該做一些像

reverse('monitor:index') 

ROOT_URLCONF

urlpatterns = patterns('', 
    (r'^$', redirect_to, {'url': '/monitor/'}), 
    (r'^monitor/', include('monitor.urls'),namespace='monitor'), 
) 

monitor.url.py

urlpatterns = patterns('monitor.views', 
    url(r'^$', 'index',name='index'), 
) 

瞭解詳情看https://docs.djangoproject.com/en/1.4/topics/http/urls/#django.core.urlresolvers.reverse

+0

'(r'^ $','index',name ='index'),'產生和語法錯誤:(編輯後的 – Pablo 2012-08-16 11:39:38

+0

,答案,試試吧。 – Vignesh 2012-08-16 11:59:11