Обратный Для ' * 'с аргументами' () 'и аргументами ключевого слова' {} ' не найден


поймал исключение при визуализации:

обратный для продуктов.просмотр.'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 56

7 ответов:

есть 3 вещи, которые я могу думать с верхней части моей головы:

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

    >>> from django.core.urlresolvers import reverse
    >>> reverse('products.views.filter_by_led')
    
  3. проверьте, есть ли у вас более одного 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 'viewname' %}

вместо

{% url viewname %}

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

мой главный 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-адресов имеют решающее значение!

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

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

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

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

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

это при условии, что у вас есть конечные слеши включен по умолчанию.

{% url 'polls:create' poll.id %}