【问题标题】:Create equivalent paths in Django urls.py在 Django urls.py 中创建等效路径
【发布时间】:2021-03-25 09:52:55
【问题描述】:

我正在尝试创建 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),
]

【问题讨论】:

    标签: python python-3.x django django-urls


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 太棒了!这正是我所需要的。希望这只是一个临时修复,因为我们迁移到不同的域名并且必须跨越两个域内的用户一段时间。将 2 条路径映射到同一个视图时,我们应该注意哪些具体风险?
    • @wraasch:好吧,您可能希望将参数命名为相同的名称,而不是foo/&lt;str:a&gt;/bar/&lt;str:b&gt;/,因为从那时起您使用具有不同名称的参数调用相同的视图。此外,如果您使用reverse(..){% url ... %} 反转视图,它通常会采用第一个匹配项,因此在这种情况下,通过foo/
    • 这是有道理的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2021-03-23
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    相关资源
    最近更新 更多