Как мне использовать django.core.urlresolvers.reverse со ссылкой на функцию вместо именованного шаблона URL?
Вопрос
В моем urls.py
файл, у меня есть:
from myapp import views
...
(r'^categories/$', views.categories)
Где categories
есть ли функция просмотра внутри myapp/views.py
.Никаких других ссылок на строки URLconf нет views.categories
.
В файле модульного тестирования я пытаюсь получить этот URL-адрес, используя django.core.urlresolvers.reverse()
, вместо того, чтобы просто копировать '/categories/' (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
.
Есть какие-нибудь идеи, что я делаю не так?
Решение 2
После дальнейшего расследования выяснилось, что это была проблема с тем, как я импортировал модуль views:
Как мне успешно передать ссылку на функцию функции reverse() от Django?
Но все же спасибо за помощь, ребята:вы вдохновили меня взглянуть на это должным образом.
Другие советы
Пример Джека М. почти верен.
Это должна быть функция URL, а не кортеж, если вы хотите использовать именованные URL-адреса.
url(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
Это действительно работает, и весь код, который вы вставили, правильный и работает нормально (я просто скопировал его в чистое приложение для тестирования / проекта, и оно изменило URL-адрес без каких-либо проблем).Значит, здесь происходит что-то еще, чего вы нам не показали.Упростите до элементарных основ, пока это не сработает, затем снова начните добавлять сложность и посмотрите, где она ломается.
Кроме того, вы можете выполнить "./manage.py оболочка", а затем интерактивно импортировать функцию reverse и вашу функцию view и попробовать обратное.Это удалит тестовую настройку как возможную причину.
Обратная функция фактически использует "имя" URL-адреса.Это определяется примерно так:
urlpatterns = patterns('',
(r'^no_monkeys/$', 'views.noMonkeys', {}, "no-monkeys"),
(r'^admin/(.*)', admin.site.root),
)
Теперь вы должны вызвать reverse со строкой "no-monkeys", чтобы получить правильный URL.
Ниндзя Править: Вот ссылка к документам django по этому вопросу.