Различные 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
Вернуться на верх