Как использовать django.core.urlresolvers.reverse со ссылкой на функцию вместо именованного шаблона URL? - PullRequest
8 голосов
/ 25 сентября 2008

В моем файле urls.py есть:

from myapp import views
...
(r'^categories/$', views.categories)

Где categories - функция просмотра внутри myapp/views.py. Нет ссылок на другие строки URLconf views.categories.

В файле модульного теста я пытаюсь захватить этот URL-адрес, используя django.core.urlresolvers.reverse(), вместо того, чтобы просто копировать «/ category /» (DRY и все такое). Итак, у меня есть:

from django.core.urlresolvers import reverse
from myapp import views
...

url = reverse(views.categories)

Когда я запускаю свои тесты, я получаю ошибку NoReverseMatch:

NoReverseMatch: Reverse for '<function categories at 0x1082f30>' with arguments '()' and keyword arguments '{}' not found.

Это очень хорошо подходит, если я сделаю шаблон URL именованным шаблоном, например:

url(r'^categories/$', views.categories, 'myapp-categories')

И используйте имя шаблона, чтобы соответствовать ему:

url = reverse('myapp-categories')

Но, насколько я могу судить по документации reverse , мне не нужно указывать шаблон URL, чтобы использовать reverse.

Есть идеи, что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 28 сентября 2008

После дальнейшего расследования выяснилось, что проблема была связана с тем, как я импортировал модуль представлений:

Как успешно передать ссылку на функцию reverse () в Django?

Спасибо за помощь, ребята: вы вдохновили меня посмотреть на это правильно.

2 голосов
/ 26 сентября 2008

Пример Джека М. почти верен.

Это должна быть функция URL, а не кортеж, если вы хотите использовать именованные URL.

url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
0 голосов
/ 26 сентября 2008

Это работает, и весь код, который вы вставили, является правильным и работает нормально (я просто скопировал его в чистое приложение для тестирования / проекта, и он без проблем перевернул URL). Так что здесь происходит что-то еще, что вы не показали нам. Упростите до базовых основ, пока он не заработает, затем начните добавлять сложность обратно и посмотрите, где она ломается.

Кроме того, вы можете выполнить «./manage.py shell», а затем в интерактивном режиме импортировать функцию реверса и функцию просмотра и попробовать реверс. Это уберет настройку теста как возможную причину.

0 голосов
/ 25 сентября 2008

Функция реверса фактически использует «имя» URL. Это определяется так:

urlpatterns = patterns('',
    (r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
    (r'^admin/(.*)', admin.site.root),
)

Теперь вы должны вызывать reverse со строкой "no-monkeys", чтобы получить правильный URL.

Ninja Edit: Вот ссылка на документы Django по теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...