我发现在Django 1.2.1中使用reverse的非常奇怪。
我有:
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方法放在view方法之外的任何地方时(浏览 - 在这种情况下),我在每次进一步使用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()函数的结果初始化django主范围中的某些值?
答案 0 :(得分:1)
在调用后,在视图函数中调用reverse()之后,你可能需要传递'request'作为第二个参数。
def browse(request):
print reverse('myapp.views.browse', args=[request])
这确实是奇怪的行为,但这可能是现在的解决方案。
答案 1 :(得分:0)
首先,您应该命名您的网址以使用反向。这是AFAIK的正确方法。
其次,为什么要在FormField中调用reverse?我真的不明白。
也许你可以通过发布完整的代码而不是精选的片段来启发我们。
# 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))
答案 2 :(得分:0)
问题是由python中的import hell引起的。 reverse取决于其他内容,初始化时无法使用。
解决方案是使用延迟反向。例如。使用这个: http://djangosnippets.org/snippets/499/