Обратное для '*' с аргументами '()' и аргументами ключевого слова '{}' не найдено
Показ исключения при рендеринге:
Обратный для 'products.views.'filter_by_led' с аргументами '()' и аргументы ключевого слова '{}' не найдены.
Мне удалось успешно импортировать products.views.filter_by_led
из оболочки, и он работал, поэтому путь должен быть правильным.
Вот urls.py:
(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):
Я не понимаю, почему Django думает, что функция не сможет найти Reverse для этой функции.
Я удалил все файлы *.pyc
и перезапустил Apache.
Что я делаю неправильно?
Ответы
Ответ 1
Есть три вещи, которые я могу придумать с головы:
- Просто использовал named urls, он более надежный и поддерживающий в любом случае
-
Попробуйте использовать django.core.urlresolvers.reverse
в командной строке для (возможно) лучшей ошибки
>>> from django.core.urlresolvers import reverse
>>> reverse('products.views.filter_by_led')
-
Проверьте, есть ли у вас более одного URL-адреса, указывающего на это представление
Ответ 2
Отклики Shell на обратные (как упоминалось выше) очень хорошо отлаживают эти проблемы, но есть два критических условия:
- вы должны поставлять аргументы, которые соответствуют всем аргументам, которые необходимо просмотреть,
- эти аргументы должны соответствовать шаблонам regexp.
Да, это логично. Да, это тоже запутывает, потому что реверс будет только бросать исключение и не даст вам никаких дальнейших намеков.
Пример шаблона 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%}
И этот запутан.
Ответ 3
Вам нужны одинарные кавычки вокруг имени представления
{% url 'viewname' %}
вместо
{% url viewname %}
Ответ 4
У меня была аналогичная проблема, и решение было в правильном использовании символа '$' (end-of-string):
Мой главный 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-адресов имеют решающее значение!
Ответ 5
Я не думаю, что вам нужна косая черта в записи URL. То есть, вместо этого поставьте это:
(r'^led-tv$', filter_by_led ),
Предполагается, что вы включили завершающие слэши, который по умолчанию.
Ответ 6
{% url 'polls:create' poll.id %}