Django奇怪的问题是使用reverse和url标签

时间:2010-09-09 21:42:19

标签: django url tags reverse

我发现在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主范围中的某些值?

3 个答案:

答案 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/