Подтвердить что ты не робот

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

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

Обратный для '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.

Что я делаю неправильно?

4b9b3361

Ответ 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 %}