В Django, как узнать, какой шаблон URL соответствует запросу? - PullRequest
2 голосов
/ 11 июля 2019

Я работаю над старым проектом Django с большим количеством шаблонов URL . Иногда мне непонятно, каким видом руководил диспетчер. Есть ли способ узнать, какой шаблон URL соответствует определенному запросу в Django?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вы можете использовать для этого функцию 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'
0 голосов
/ 11 июля 2019

Да, посмотрите на оператор include, затем перейдите в этот каталог и проверьте файлы views.py и urls.py.

...