Реверс для '*' с аргументами '()' и ключевыми словами '{}' не найден - PullRequest
59 голосов
/ 03 декабря 2009

При рендеринге произошло исключение:

Обратное для 'products.views.'filter_by_led' с аргументами '()' и Аргументы ключевых слов '{}' не найдены.

Мне удалось успешно импортировать products.views.filter_by_led из оболочки, и это сработало, поэтому путь должен быть правильным.

Вот URL-адрес:

(r'^led-tv/$', filter_by_led ),

Здесь генерируется ошибка:

href="{% url products.views.filter_by_led %}">

Что я не могу понять, потому что это прекрасно работает из того же файла:

{% url products.views.lcd_screen_size screen_size=50 %}

Вот определение функции:

def filter_by_led(request):

Я не понимаю, почему Джанго подумал, что функция не сможет найти реверс для этой функции.

Я удалил все файлы *.pyc и перезапустил Apache.

Что я делаю не так?

Ответы [ 7 ]

53 голосов
/ 03 декабря 2009

Есть три вещи, которые я могу придумать: «1001 *»

  1. Только что использованный по имени urls , в любом случае он более надежный и обслуживаемый
  2. Попробуйте использовать django.core.urlresolvers.reverse в командной строке для (возможно) лучшей ошибки

    >>> from django.core.urlresolvers import reverse
    >>> reverse('products.views.filter_by_led')
    
  3. Проверьте, есть ли у вас несколько URL-адресов, указывающих на это представление

36 голосов
/ 20 февраля 2013

Вызовы оболочки на reverse (как упомянуто выше) очень хороши для устранения этих проблем, но есть два критических условия:

  • вы должны предоставить аргументы, соответствующие любым аргументам, необходимым представлению,
  • эти аргументы должны соответствовать шаблонам регулярных выражений.

Да, это логично. Да, это также сбивает с толку, потому что reverse только сгенерирует исключение и не даст вам дальнейших подсказок.

Пример шаблона URL:

url(r'^cookies/(?P<hostname>[^/]+)/(?P<url_id>\d+)/$', 'register_site.views.show_cookies', name='show_cookies'),

А что происходит в оболочке:

>>> from register_site.views import show_cookies
>>> reverse(show_cookies)
NoReverseMatch: Reverse for 'register_site.views.show_cookies' with arguments '()' and keyword arguments '{}' not found.

Это не работает, потому что я не предоставил аргументов.

>>> reverse('show_cookies', kwargs={'url_id':123,'hostname': 'aaa'})
'/cookies/aaa/123'

Теперь это сработало, но ...

>>> reverse('show_cookies', kwargs={'url_id':'x','hostname': 'www.dupa.com'})
NoReverseMatch: Reverse for 'show_cookies' with arguments '()' and keyword arguments '{'url_id': 'x', 'hostname': 'www.dupa.com'}' not found.

Теперь это не сработало, потому что url_id не соответствовало регулярному выражению (ожидаемое число, предоставленная строка).

Вы можете использовать reverse как с позиционными аргументами, так и с ключевыми словами. Синтаксис:

reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)

Что касается тега шаблона url , в этом есть одна забавная вещь. Django документация дает пример использования имени в кавычках:

{% url 'news.views.year_archive' yearvar%}

Так что я использовал его аналогичным образом в своем HTML-шаблоне:

{% url 'show_cookies' hostname = u.hostname url_id = u.pk%}

Но это не сработало для меня. Но сообщение об исключении дало мне подсказку, что может быть не так - обратите внимание на двойные одинарные кавычки вокруг имени представления:

Реверс для '' show_cookies '' с аргументами ...

Он начал работать, когда я удалил цитаты:

{% url show_cookies hostname = u.hostname url_id = u.pk%}

И это сбивает с толку.

11 голосов
/ 21 ноября 2014

Вам нужны одинарные кавычки вокруг имени представления

{% url 'viewname' %}

вместо

{% url viewname %}
4 голосов
/ 18 ноября 2015

У меня была похожая проблема, и решение было в правильном использовании символа '$' (конец строки):

Мой основной url.py выглядел так (обратите внимание на символ $):

urlpatterns = [
url(r'^admin/', include(admin.site.urls )),
url(r'^$', include('card_purchase.urls' )),
]

и мой url.py для моего приложения card_purchases сказал:

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

Я дважды использовал '$'. Итак, сработало простое изменение:

urlpatterns = [
url(r'^admin/', include(admin.site.urls )),
url(r'^cp/', include('card_purchase.urls' )),
]

Обратите внимание на изменение второго URL! Мой url.py для моего приложения card_purchases выглядит так:

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^purchase/$', views.purchase_detail, name='purchase')
]

Помимо этого, я могу подтвердить, что кавычки вокруг названных URL-адресов имеют решающее значение!

2 голосов
/ 22 февраля 2018

Если кому-то это поможет, у меня возникла похожая проблема, и ошибка произошла по двум причинам:

  1. Не использовать пространство имен приложения перед URL-адресом

    {% url 'app_name:url_name' %}
    
  2. Отсутствуют одинарные кавычки вокруг имени URL (как указано здесь Чарли)

1 голос
/ 18 июня 2017
{% url 'polls:create' poll.id %}
0 голосов
/ 03 декабря 2009

Я не думаю, что вам нужна косая черта в записи URL. Т.е. вместо этого поставьте:

(r'^led-tv$', filter_by_led ),

Предполагается, что у вас включено конечных слешей , что по умолчанию.

...