Я работаю над старым проектом Django с множеством шаблонов URL а>. Иногда мне не ясно, какое представление было запущено диспетчером. Есть ли способ узнать, какой шаблон URL соответствует конкретному запросу в Django?
Как в Django узнать, какой шаблон URL соответствует запросу?
Ответы (1)
Вы можете использовать функцию resolve(..)
[Django-doc ] для этого.
Если мы определим как urlpatterns
:
from django.urls import path
from app.views import some_view
urlpatterns = [
path('some/<slug:name>', some_view, name='some_view')
]
Он вернет нам:
>>> resolve('/some/view/')
ResolverMatch(func=app.views.some_view, args=(), kwargs={'name': 'view'}, url_name=some_view, app_names=[], namespaces=[], route=some/<slug:name>/)
Таким образом, он возвращает нам ResolverMatch
объект [Django-doc]. Мы можем запросить этот объект следующим образом:
>>> result = resolve('/some/view/')
>>> result.func
<function some_view at 0x7fc09facf0d0>
>>> result.args
()
>>> result.kwargs
{'name': 'view'}
>>> result.url_name
'some_view'
>>> result.app_names
[]
>>> result.namespaces
[]
>>> result.route
'some/<slug:name>/'
Таким образом, здесь func
содержит ссылку на функцию, которая будет запущена, args
и kwargs
содержат позиционный и именованный параметры в пути соответственно, url_name
имя представления и т. д.
Если путь неясен, вы можете вместо этого использовать функцию reverse.
urlpatterns = [
path('some/view', some_view_func, name='some_new_view'),
path('some/<int:pk>', some_view_with_id, name='some_with_id'),
]
Без аргументов
Примечание. Это работает только для конфигураций URL без аргументов.
In [1]: reverse('some_new_view')
Out[1]: 'some/view'
Чтобы сопоставить имена представлений URL с аргументами
In [1]: reverse('some_with_id', kwargs={'pk': 1})
Out[1]: 'some/1'
person
Willem Van Onsem
schedule
11.07.2019
resolve(..)
: docs.djangoproject.com/en/dev/ ссылка/urlresolvers/#resolve - person Willem Van Onsem   schedule 11.07.2019