Различные URL на основе условия в Django
У меня есть такой url:
app_name = 'vineyards'
urlpatterns = [
path('<str:parent>/<str:region>/<slug:slug>/',
vineyard_detail, name="detail"),
]
Это абсолютный url в модели:
def get_absolute_url(self):
return reverse('vineyards:detail', kwargs={'parent': self.region.region_parent, 'region': self.region.slug, 'slug': self.slug})
<str:parent>/
является необязательным, он может быть null. Я хочу игнорировать <str:parent>/
, если он None
Например, я хочу, чтобы url был примерно таким: .../something/
Вместо этого: .../Не/что/
Как я могу это сделать? Возможно ли это?
Самым простым решением будет добавить второй путь к шаблонам URL:
имя_приложения = 'виноградники'
urlpatterns = [
path('<str:parent>/<str:region>/<slug:slug>/',
vineyard_detail, name="detail"),
path('<str:region>/<slug:slug>/',
vineyard_detail, name="detail-without-parent"),
]
А затем используйте второй путь в методе get_absolute_url
, когда родитель не определен:
def get_absolute_url(self):
if self.region.region_parent is not None:
return reverse('vineyards:detail', kwargs={'parent': self.region.region_parent, 'region': self.region.slug, 'slug': self.slug})
else:
return reverse('vineyards:detail-without-parent', kwargs={'region': self.region.slug, 'slug': self.slug})
Но из того, что у вас здесь, похоже, что вы пытаетесь создать некую древовидную структуру. Может быть, стоит использовать для этого что-то вроде django-mptt
.
Возможно получить то, что вам нужно, создав две детали (пожалуйста, обратите внимание на порядок)
urlpatterns = [
path('<str:region>/<slug:slug>/', vineyard_detail, name="detail_no_parent"),
path('<str:parent>/<str:region>/<slug:slug>/', vineyard_detail, name="detail"),
]
и затем убедитесь, что значение parent
является необязательным в представлении (это можно сделать, установив значение по умолчанию)
def vineyard_detail(request, slug, region, parent=None):
pass