#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. Это имеет смысл. Спасибо за вашу помощь!