根据 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
我有一个 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