在 Django 中创建等效路径 urls.py

Create equivalent paths in Django urls.py

我正在尝试创建 2 个 url 前缀,它们在我的应用程序中是等效的(这是由于某些审美用户要求),但我不确定解决此问题的最佳方法。最直接的选择是使用备用前缀创建另一组 urlpatterns。然而,这将是重复的并且使维护更加困难。有没有更简单的方法让 foo/<str:key>/ 等同于 bar/<str:key>staff/<str:key>/ 等同于 foo/<str:key>/staff/

当前网址

urlpatterns = [
    path('foo/<str:key>/welcome/', views.welcome),
    path('foo/<str:key>/dashboard/', views.dashboard),
    path('foo/<str:key>/staff/dashboard/', views.staff_dashboard),
]

想要的模式

urlpatterns = [
    # Original paths
    path('foo/<str:key>/welcome/', views.welcome),
    path('foo/<str:key>/dashboard/', views.dashboard),
    path('foo/<str:key>/staff/dashboard/', views.staff_dashboard),

    # Alternate paths to the same pages
    path('bar/<str:key>/welcome/', views.welcome),
    path('bar/<str:key>/dashboard/', views.dashboard),
    path('staff/<str:key>/dashboard/', views.staff_dashboard),
]

您可以定义一组路径,然后再包含两次:

from django.urls import include, path

<b>sub_paths</b> = [
    path('welcome/', views.welcome),
    path('dashboard/', views.dashboard),
    path('staff/dashboard/', views.staff_dashboard),
]

urlpatterns = [
    path('foo/<str:key>/', <b>include(sub_paths)</b>),
    path('bar/<str:key>/', <b>include(sub_paths)</b>),
    path('staff/<str:key>/dashboard/', views.staff_dashboard),
]

因此,我们在单个列表中定义 foo/bar 一次 的路径,然后多次重复使用这些路径。

也就是说,建议每个视图(带有参数)映射到单个路径,反之亦然。明确了两条不同的路径会走向不同的视图,当视图反转时,结果是什么一目了然。