Создание эквивалентных путей в Django urls.py

#python #python-3.x #django #django-urls

#python #python-3.x #django #django-urls

Вопрос:

Я пытаюсь создать 2 префикса url, которые были бы эквивалентны в моем приложении (это связано с некоторыми эстетическими требованиями пользователя), и я не уверен, как лучше всего это сделать. Самым простым вариантом было бы создать другой набор urlpatterns с альтернативным префиксом. Однако это будет повторяющимся и усложнит обслуживание. Есть ли более простой способ сделать foo/<str:key>/ эквивалентным bar/<str:key> и staff/<str:key>/ эквивалентным foo/<str:key>/staff/ ?

Текущие URL-адреса

 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),
]
 

Ответ №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 раз в одном списке, а затем повторно используем их несколько раз.

При этом желательно, чтобы каждое представление (с параметрами) отображалось на один путь и наоборот. Это дает понять, что два разных пути будут вести к разным представлениям, и при изменении представления становится ясно, каким будет результат.

Комментарии:

1. Блестяще! Это именно то, что мне было нужно. Мы надеемся, что это просто временное исправление, которое требуется, поскольку мы переходим на другое доменное имя и должны немного распределить пользователей в двух доменах. Каковы конкретные риски, на которые мы должны обратить внимание, если 2 пути отображаются на один и тот же вид?

2. @wraasch: ну, вы, вероятно, хотите назвать свои параметры одинаково, поэтому не foo/<str:a>/ и bar/<str:b>/ , с тех пор вы вызываете одно и то же представление с параметрами, которые имеют другое имя. Кроме того, если вы измените представление с reverse(..) помощью, или {% url ... %} , как правило, оно будет первым, которое соответствует, поэтому в данном случае, через foo/ .

3. Это имеет смысл. Спасибо за вашу помощь!