【发布时间】:2010-09-09 21:42:19
【问题描述】:
我发现在 Django 1.2.1 中使用反向非常奇怪。
我有:
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')
当我将 reverse 方法放在视图方法之外的任何地方(浏览 - 在这种情况下)时,我在每次进一步使用 reverse 或 {% url %} 标记时都会遇到异常。
NoReverseMatch at /
Reverse for 'myapp.views.browse' with arguments '()'
and keyword arguments '{}' not found.
WTF?当我评论/删除 browse() 外的打印行时, browse() 内的第二个打印行神奇地开始工作!
最基本的情况是:
class MyForm(forms.Form):
field = forms.CharField(default=reverse(....))
def some_view(request):
print reverse(...)
....
1) 我在主作用域中定义了一个在 django 初始化时初始化的类(并反向运行) 2) 当请求到来时, some_view 函数已被触发,它再次评估 reverse 函数(并因异常而失败)。
我在这种方法中根本没有看到任何不好的。为什么不用 reverse() 函数的结果初始化 django 主作用域中的一些值?
【问题讨论】: