我怎么能看到当前的urlpatterns“反向”正在寻找?

我在一个视图中调用了逆向,我认为这个论证应该成立,但实际上并不成立。有什么办法能让我知道为什么我的图案没有?


当前回答

有一个我使用的插件:https://github.com/django-extensions/django-extensions,它有一个show_urls命令可以帮助。

其他回答

如果你正在使用DRF,你可以通过从router.get_urls()(在你的Django应用的urls.py文件中)打印特定路由器的urlpatterns来打印所有的URL模式。

打开你的apps urls.py,并在文件底部添加打印语句,这样整个文件看起来就像这样:

import pprint

from django.urls import include, path
from rest_framework import routers

from . import views

router = routers.DefaultRouter()
router.register(r"users", views.UserViewSet, basename="User")
router.register(r"auth", views.AuthenticationView, basename="Auth")
router.register(r"dummy", views.DummyViewSet, basename="Dummy")
router.register("surveys", views.SurveyViewSet, basename="survey")

urlpatterns = [
    path("", include(router.urls)),
]

pprint.pprint(router.get_urls())

然后,这些图案会像这样打印出来:

[<URLPattern '^users/$' [name='User-list']>,
 <URLPattern '^users\.(?P<format>[a-z0-9]+)/?$' [name='User-list']>,
 <URLPattern '^users/admins/$' [name='User-admins']>,
 <URLPattern '^users/admins\.(?P<format>[a-z0-9]+)/?$' [name='User-admins']>,
 <URLPattern '^users/current/$' [name='User-current']>,
 <URLPattern '^users/current\.(?P<format>[a-z0-9]+)/?$' [name='User-current']>,
 <URLPattern '^users/(?P<pk>[^/.]+)/$' [name='User-detail']>,
 <URLPattern '^users/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='User-detail']>,
 <URLPattern '^auth/login/$' [name='Auth-login']>,
...
]

这里有一个快速而肮脏的黑客,只需获得你需要的信息,而不需要修改任何设置。

$ pip install django-extensions
$ python manage.py shell -c 'from django.core.management import call_command; from django_extensions.management.commands.show_urls import Command; call_command(Command())'

这是小猪在逃避@robert的回答。虽然是正确的,但我不想让django扩展成为依赖项,哪怕只是一秒钟。

试试这个:

from django.urls import get_resolver
get_resolver().reverse_dict.keys()

或者如果你还在Django 1上。*:

from django.core.urlresolvers import get_resolver
get_resolver(None).reverse_dict.keys()
from django.urls.resolvers import RegexPattern,RoutePattern
from your_main_app import urls

def get_urls():
    url_list = []
    for url in urls.urlpatterns:
        url_list.append(url.pattern._regex) if isinstance(url.pattern, RegexPattern) else url_list.append(url.pattern._route)

    return url_list

这里your_main_app是放置settings.py文件的应用程序名称

有一个我使用的插件:https://github.com/django-extensions/django-extensions,它有一个show_urls命令可以帮助。