根据 Django 中的条件不同 URL

Different URL Based On Condition In 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>/是可选的,可以为空。我想忽略 <str:parent>/ 如果它是 None

例如,我希望 url 是这样的: .../东西/

而不是这个:.../None/something/

我该怎么做?可能吗?

最简单的解决方案是为您的 URL 模式添加第二条路径:

app_name = 'vineyards'

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方法中使用第二条路径,当没有定义parent时:

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