Обратный Для ' * 'с аргументами' () 'и аргументами ключевого слова' {} ' не найден
поймал исключение при визуализации:
обратный для продуктов.просмотр.'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 будет думать, что функция не сможет найти обратный для этой функции.
Я удалил все *.pyc
файлы и перезапустить Apache.
что я делаю не так?
7 ответов:
есть 3 вещи, которые я могу думать с верхней части моей головы:
- просто использовать имени URL-адреса, это более надежный и ремонтопригодный в любом случае
попробуйте использовать
django.core.urlresolvers.reverse
в командной строке для (возможно) лучшей ошибки>>> from django.core.urlresolvers import reverse >>> reverse('products.views.filter_by_led')
проверьте, есть ли у вас более одного url, который указывает на это представление
Shell вызывает реверс (как упоминалось выше) очень хороши для отладки этих проблем, но есть два критических условия:
- вы должны укажите аргументы, соответствующие любым аргументам, необходимым для представления,
- эти аргументы должны совпадать шаблоны регулярных выражений.
Да, это логично. Да, это также сбивает с толку, потому что реверс будет только бросить исключение и не даст вам любые дальнейшие намеки.
пример шаблона 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(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current_app=None)
как это доходит до url шаблон тег, есть забавная вещь об этом. Джанго документация дает пример использования имени вида в кавычках:
{%url ' новости.просмотр.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 %}
и и сбивает с толку.
у меня была аналогичная проблема, и решение было в правильном использовании символа ' $ ' (конец строки):
мой главный 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-адресов имеют решающее значение!
в случае, если это помогает кто-то, у меня была аналогичная проблема и ошибка была из-за двух причин:
Не использовать пространство имен приложения перед именем url
{% url 'app_name:url_name' %}
отсутствуют одинарные кавычки вокруг имени url (как указано здесь Чарли)
Я не думаю, что вам нужна конечная косая черта в записи URL. Т. е., поставьте это вместо:
(r'^led-tv$', filter_by_led ),
это при условии, что у вас есть конечные слеши включен по умолчанию.