【问题标题】:Capture an arbitrary number of values from url从 url 捕获任意数量的值
【发布时间】:2020-12-23 16:57:41
【问题描述】:

我在 Django 中创建了一个 url 模式,它在 url 中捕获一个类别并将其传递到视图中。例如 url mysite.com/category/shoes/ 匹配路径:

path('category/<category>/', views.Feed.as_view(), name='feed'),

它会向视图传递一个名为category 的变量,其值为"shoes"

现在我还想捕获子类别。类别和子类别将被组织成一个树形结构,一个子类别中可能有更多的子类别。我如何编写一个 url 路径模式来捕获 任意数量 的嵌套子类别,例如:

mysite.com/category/shoes/winter/leather/...

以及如何将其传递给视图?

【问题讨论】:

  • 恕我直言,在你的情况下,使用查询参数,而不是路径参数
  • 查询参数不会被搜索引擎索引为单独的 url,这对 SEO 很重要

标签: django url django-urls


【解决方案1】:

这很简单。使用此语法:

path('category/<category>/<int:year>/<str:type>', views.Feed.as_view(), name='feed')
path('category/<category>/<str:type>/<int:size>', views.Feed.as_view(), name='feed-shoes')

您也可以使用查询参数并在视图中添加逻辑来提取它们。

path('category/$', views.Feed.as_view(), name='feed')

在你看来:

if request.GET.get('category', None) == 'shoes':
    # check other params

另一个更好的做法是根据不同的类别拆分视图,编写一个可以接受任意数量的参数的视图是不好的做法。写出你的 URL 和拆分你的视图会更简单更好。

Django docs

【讨论】:

  • 但这仅捕获您定义的两个变量,年份和类型。我想捕获任意数量的子类别(网址可能带有两个嵌套类别或五个),并将其传递给视图(可能在数组中?)
  • @FernandoJesusGarciaHipola 如果你想命名 url 参数,你可能需要编写一个自定义路由器
  • @FernandoJesusGarciaHipola 使用查询参数也会更容易,你愿意接受吗?
  • 查询参数是个好主意,但我希望在不同的 url 中为 SEO 索引类别
  • @FernandoJesusGarciaHipola 不同的类别应该有不同的看法,看我更新的答案
猜你喜欢
  • 2017-09-17
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多