Django странная проблема с использованием реверса и URL-тега - PullRequest
2 голосов
/ 10 сентября 2010

Я нашел очень странную вещь об использовании реверса в 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 в любом месте за пределами метода view (в данном случае - browse), я получаю исключение при каждом последующем использовании 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, и она снова вычисляет обратную функцию (и завершается с ошибкой, за исключением).

Я не вижу ничего плохого в этом подходе.Почему бы не инициализировать некоторые значения в основной области django с результатами функции reverse ()?

Ответы [ 3 ]

1 голос
/ 29 октября 2010

Возможно, вам потребуется передать 'request' в качестве второго параметра при вызове reverse () из функции view после того, как она уже была вызвана.

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

Это действительно странное поведение, но этовозможно, будет решением на данный момент.

0 голосов
/ 25 ноября 2012

Проблема вызвана импортом импорта в Python.обратное зависит от других вещей и не может быть использовано во время инициализации.

Решение заключается в использовании отложенного обратного.Например, используя это: http://djangosnippets.org/snippets/499/

0 голосов
/ 22 октября 2010

Во-первых, вы должны назвать свои 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))
...