反向 Django 管理 URL
Posted
技术标签:
【中文标题】反向 Django 管理 URL【英文标题】:Reverse Django admin URLs 【发布时间】:2019-11-04 18:08:46 【问题描述】:如this answer 所述,我们可以使用url
标记来反转Django 管理URL。但是,在此处显示的示例中,您需要传递给url
的字符串中的应用程序名称和模型名称。有没有办法将它们作为参数传递?我想做的是这样的:
% url 'something here' app_name model_name object_id %
'something here'
我要写什么?
【问题讨论】:
我建议你安装django_extensions
并使用它的命令来查找 URL 名称。 python manage.py show_urls
@rabbit.aaron 您应该将其发布为答案。此外,这将有助于展示一个示例来说明该工具将如何回答我的问题。
【参考方案1】:
我建议使用django_extensions
来使用它的show_urls
命令来查找url 名称。
简单地做
pip install django_extensions
然后将django_extensions
添加到您的 INSTALLED_APPS
#settings.py
INSTALLED_APPS = [
#...
'django_extensions',
]
然后就可以运行了
python manage.py show_urls
您可以将它与grep
一起使用,以过滤掉您需要的相关网址。
例如
python manage.py show_urls | grep password
/admin/auth/user/<id>/password/ django.contrib.auth.admin.user_change_password admin:auth_user_password_change
/admin/password_change/ django.contrib.admin.sites.password_change admin:password_change
/admin/password_change/done/ django.contrib.admin.sites.password_change_done admin:password_change_done
假设我们想在模板中使用django.contrib.auth.admin.user_change_password
:
我们可以做到:
% url "admin:auth_user_password_change" user.pk %
附注您的生产环境实际上并不需要 django_extensions
,因此您可能只想在本地安装它以供开发使用。
资源:
django_extensions installation documentation django_extensions commands
【讨论】:
问题:中间列是为该视图注册的函数的名称吗?如果是这样,我可以将此名称与url
标签或reverse()
一起使用吗?
是的,您可以使用带有reverse
的名称。冒号指定一个命名空间,看这里:docs.djangoproject.com/en/2.2/topics/http/urls/#url-namespaces
我指的是中间“列”中的名称,例如django.contrib.auth.admin.user_change_password
。 (我在这里没有看到任何冒号。)
例如,当我运行./manage.py show_urls
时,我看到了/my_app/my_model/<path:object_id>/change/ django.contrib.admin.options.change_view admin:myapp_mymodel_change
这样的路径。要反转 admin:myapp_mymodel_change
路由,我必须硬编码应用程序的名称和模型的名称。我的问题是是否有办法将这两个作为参数传递给reverse()
(或% url %
)。据我所知,没有。当然,我可以通过一些字符串格式轻松构建自己的函数。
我不认为 Django 提供这样的功能。如果你看看django.contrib.admin.options.ModelAdmin.get_urls
。您将看到 URL 是如何生成的。【参考方案2】:
如果您想反转管理员 url,默认的 admin.sites.urls 中有一个 urlpattern,如下所示:
urlpatterns = [
path('', wrap(self.index), name='index'),
path('login/', self.login, name='login'),
path('logout/', wrap(self.logout), name='logout'),
path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'),
path(
'password_change/done/',
wrap(self.password_change_done, cacheable=True),
name='password_change_done',
),
path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
path(
'r/<int:content_type_id>/<path:object_id>/',
wrap(contenttype_views.shortcut),
name='view_on_site',
),
]
查看上面的代码,您可以简单地在reverse('admin:index')
的模板中使用% url 'admin:index' %
,否则管理仪表板网址的位置。与所有其他管理 url 模式相同
【讨论】:
感谢您提供的信息。我最初的问题是关于应用程序中特定模型的管理路由,例如 changeform 视图。我链接到的问题显示了路线名称中包含应用程序和模型名称的示例。但是,我有一种情况,我想将它们作为参数传递。我的问题是问如何做到这一点。以上是关于反向 Django 管理 URL的主要内容,如果未能解决你的问题,请参考以下文章
Django之url上的include,URL命名和反向解析,命名空间 以及图书管理系统删除功能二合一方法
如何从视图生成 Django 管理站点中特定项目的 url?