2010-09-09 30 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