Вызовы оболочки на 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%}
И это сбивает с толку.