【问题标题】:Different URL Based On Condition In DjangoDjango中基于条件的不同URL
【发布时间】:2021-11-23 02:34:05
【问题描述】:

我有一个这样的网址:

app_name = 'vineyards'
urlpatterns = [
    path('<str:parent>/<str:region>/<slug:slug>/',
         vineyard_detail, name="detail"),
]

这是模型中的绝对网址:

def get_absolute_url(self):
    return reverse('vineyards:detail', kwargs={'parent': self.region.region_parent, 'region': self.region.slug, 'slug': self.slug})

&lt;str:parent&gt;/ 是可选的,可以为空。如果&lt;str:parent&gt;/ 为无,我想忽略它

例如,我希望 url 是这样的: .../某事/

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

我该怎么做?有可能吗?

【问题讨论】:

    标签: django url django-urls


    【解决方案1】:

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

    app_name = '葡萄园'

    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 之类的东西。

    【讨论】:

    • 感谢您的回答和建议。我稍后会检查。
    【解决方案2】:

    创建两个模式可以得到你需要的东西(请注意顺序)

    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
    

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 2018-08-21
      • 2012-09-11
      • 1970-01-01
      • 2013-05-28
      • 2018-07-18
      • 2013-12-22
      • 2020-12-08
      • 2011-12-01
      相关资源
      最近更新 更多