2010-09-09 29 views
2

我發現很奇怪有關在Django 1.2.1中使用反向的事情。Django奇怪的問題,使用反向和URL標記

我:

myapp/ 
    views.py 
    urls.py 

在urls.py

from django.conf.urls.defaults import * 
urlpatterns = patterns('myapp.views', 
url(r'^$', 'browse'), 
) 

在views.py

from django.shortcuts import render_to_response 
from django.core.urlresolvers import reverse 

print reverse('myapp.views.browse')  # <----- this will print correct value 

def browse (request): 
    print reverse('myapp.views.browse') # <----- this fails with exception 
    return render_to_response('myapp/browse.html') 

當我把反向方法在任何地方視圖方法外(瀏覽 - 中這種情況)我在每次進一步使用反向或{%url%}標記時都會遇到異常。

NoReverseMatch at/
Reverse for 'myapp.views.browse' with arguments '()' 
and keyword arguments '{}' not found. 

WTF?當我在瀏覽器()外面評論/刪除打印行時,瀏覽器()內的第二個打印行神奇地開始工作!


最基本的例子是:

class MyForm(forms.Form): 
    field = forms.CharField(default=reverse(....)) 

def some_view(request): 
    print reverse(...) 
    .... 

1)I定義主範圍的一類當Django初始化(和反向運行被初始化) 2)當一個請求到達的some_view函數已被觸發,並且它再次評估反向函數(並且失敗,但異常)。

我根本沒有看到任何東西在這種方法。爲什麼不使用reverse()函數的結果初始化django主範圍中的某些值?

回答

0

首先,您應該命名您的URL以反向使用。這是AFAIK的正確方法。

其次,你爲什麼要從FormField中調用反向?我真的不明白。

也許你可以通過發佈完整的代碼,而不是一套精心策劃的代碼片段來啓發我們。

# urls.py 

url(r'^/$', 'home_view', name='home'), 
url(r'^login/$', 'login_view', name='login'), 


# views.py 
from django.shortcuts import render_to_response 
from django.template import RequestContext 
from django.http import HttpResponseRedirect 

def login_view(request): 
    # do login stuff and redirect to home 
    return HttpResponseRedirect(reverse('home')) 

def home(request): 
    # do home stuff 

    return render_to_response("home.html", locals(), context_instance=RequestContext(request)) 
1

在調用reverse()之後調用reverse()函數後,您可能需要傳遞'request'作爲第二個參數。

def browse(request): 
    print reverse('myapp.views.browse', args=[request]) 

這確實是很奇怪的行爲,但這可能是現在的解決方案。

+0

爲什麼這會影響url被逆轉的方式?如果它在視圖外部工作,我會認爲完全相同的調用可以在視圖內部工作。 – 2010-11-02 13:06:28

+1

我相信它與變量作用域和導入視圖有關。你的反向呼叫被緩存在不同的範圍內,所以它不能在瀏覽功能中工作......很可能。 – Scott 2010-11-02 13:56:00

+0

聽起來像是我最可能的場景,謝謝 – 2010-11-02 16:39:04