反向 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/&lt;path:object_id&gt;/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?

如何在 DJango 管理界面中显示 ForeignKey 反向查找列表?

k8s部署nginx的url反向代理初探

Django,在管理员中显示和编辑反向外键关系

Django之URL反向解析