【发布时间】:2021-10-26 22:12:00
【问题描述】:
- 为什么在某些情况下在 urls.py 中使用 str:slug,而在其他情况下 蛞蝓:蛞蝓?有什么区别?哪个选项更好 用吗?
- 我可以在一个类别中使用一个类别 slug 然后一个文章 slug 路线?
【问题讨论】:
标签: python django django-models django-views django-templates
【问题讨论】:
标签: python django django-models django-views django-templates
为什么在某些情况下在 urls.py 中使用
str:slug,而在其他情况下使用slug:slug?有什么区别?
path converter [Django-doc] 不同。实际上,<str:slug> 将接受与 <slug:slug> 将接受的字符串不同的字符串集(在本例中为严格超集)。
文档解释了将匹配的内容:
str- 匹配任何非空字符串,不包括路径分隔符“/”。如果转换器不包含在 表达。
slug- 匹配任何由 ASCII 字母或数字以及连字符和下划线字符组成的 slug 字符串。例如, 构建你的第一个 django 站点。
str 将因此匹配任何非空字符串,因此它将接受 'foo'、'straße'、'foo bar',而 slug 路径转换将仅作为非空 ASCII 序列存在字母和数字以及连字符和下划线。
我们也可以在implementation of the StringConverter [GitHub] 和implementation of the SlugConverter [GitHub] 中看到这一点:
class StringConverter: regex = '[^/]+' def to_python(self, value): return value def to_url(self, value): return value # ⋮ class SlugConverter(StringConverter): regex = '[-a-zA-Z0-9_]+'
StringConverter 将因此使用 [^/]+ 正则表达式,而 slug 转换器将匹配 [-a-zA-Z0-9_]+ 正则表达式。
通常,如果您使用 slug,最好使用 slug 路径转换器,因为这将不与非 slug 匹配,通常与 slug 匹配,而不是与字符串匹配。
引入了一个 slug 来处理一个漂亮的 URL。 URL 参数包含空格的 URL 将被替换为 ugly 百分比编码,即foo%20bar,而 slug 通常使用连字符,即foo-bar。
我可以在一个路径中使用一个类别 slug 然后一个文章 slug 吗?
当然你可以定义一个路径:
path('<strong><slug:category_slug></strong>/<strong><slug:article_slug></strong>/', some_view)
some_view 在这种情况下会接受三个参数,所以:
def some_view(request, category_slug, article_slug):
# …
pass
【讨论】: