Как мне использовать django.core.urlresolvers.reverse со ссылкой на функцию вместо именованного шаблона URL?

StackOverflow https://stackoverflow.com/questions/134629

  •  02-07-2019
  •  | 
  •  

Вопрос

В моем 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 по этому вопросу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top