Я нашел очень странную вещь об использовании реверса в 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 ()?