Использовать весь набор представлений в двух разных URL-адресах в Django - PullRequest
0 голосов
/ 21 июня 2020

Я создаю веб-приложение, которое отображает ТВ Shows и Episodes. Все мои URL-адреса ориентированы на телешоу, являющиеся концепцией верхнего уровня:

  • mysite.com / tv-show-name / episode-name
  • mysite.com / tv-show- имя / название-эпизода / состав
  • mysite.com / tv-show-name / название-эпизода / обзоры

Я получил интерес от Networks за объединенные страницы с их шоу в виде подкаталогов

  • mysite.com / network-name / tv-show-name / Episode-name
  • mysite.com / network-name / tv-show-name / имя-эпизода / состав
  • mysite.com / network-name / tv-show-name / Episode-name / reviews

Мне нужно будет поддерживать оба, и, очевидно, я не хочу повторять все мои несетевые URL-адреса. Есть ли простой способ сделать это?

Ответы [ 3 ]

2 голосов
/ 21 июня 2020

Вы можете включать одни и те же шаблоны URL более одного раза. В вашем случае вы можете включать их с префиксом сетевого имени и без него

from django.urls import path, include

episode_patterns = [
    path('<str:tv_show_name>/<str:episode_name>/', episode_detail),
    path('<str:tv_show_name>/<str:episode_name>/cast/', episode_cast),
    path('<str:tv_show_name>/<str:episode_name>/reviews/', episode_reviews),
]

urlpatterns = [
    path('<str:network_name>/', include(episode_patterns)),
    path('', include(episode_patterns)),
]

Возможно, вы захотите подумать о включении «префиксов» в свои пути, чтобы они были более явными. В существующем виде это может быть довольно запутанным относительно того, какой URL-адрес соответствует

from django.urls import path, include

episode_patterns = [
    path('show/<str:tv_show_name>/episode/<str:episode_name>/', episode_detail),
    path('show/<str:tv_show_name>/episode/<str:episode_name>/cast/', episode_cast),
    path('show/<str:tv_show_name>/episode/<str:episode_name>/reviews/', episode_reviews),
]

urlpatterns = [
    path('network/<str:network_name>/', include(episode_patterns)),
    path('', include(episode_patterns)),
]

Это даст вам URL-адреса, такие как

  • mysite.com / show / tv-show-name / эпизод / имя-эпизода /
  • mysite.com / сеть / имя-сети / шоу / имя-ТВ-шоу / эпизод / имя-эпизода /
0 голосов
/ 21 июня 2020

Как насчет чего-то вроде этого:

urlpatterns = [
    path('<tv-show-name>', render_your_view, name='tv-show'),
    path('<network-name>/<tv-show-name>', render_your_view, name='network'),
]

Итак, независимо от того, находится ли запрошенный URL на уровне телешоу или на уровне сети, он запускает соответствующие представления.

0 голосов
/ 21 июня 2020

Перебрать список urlpatterns снова после определения.

Затем str.replace() для URL-адреса и добавить к существующему списку?

Чтобы ключевое слово name=<your_url_name> в URL-адресе оставалось уникальным , Добавьте префикс для отделения сети от телевизора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...