【问题标题】:The difference between <str:slug> and <slug:slug> in urls.py of Django applicationDjango应用的urls.py中<str:slug>和<slug:slug>的区别
【发布时间】:2021-10-26 22:12:00
【问题描述】:
  1. 为什么在某些情况下在 urls.py 中使用 str:slug,而在其他情况下 蛞蝓:蛞蝓?有什么区别?哪个选项更好 用吗?
  2. 我可以在一个类别中使用一个类别 slug 然后一个文章 slug 路线?

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    为什么在某些情况下在 urls.py 中使用str:slug,而在其他情况下使用slug:slug?有什么区别?

    path converter [Django-doc] 不同。实际上,&lt;str:slug&gt; 将接受与 &lt;slug:slug&gt; 将接受的字符串不同的字符串集(在本例中为严格超集)。

    文档解释了将匹配的内容:

    • 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
    
    # &vellip;
    
    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>&lt;slug:category_slug&gt;</strong>/<strong>&lt;slug:article_slug&gt;</strong>/', some_view)

    some_view 在这种情况下会接受三个参数,所以:

    def some_view(request, category_slug, article_slug):
        # …
        pass

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 2020-06-07
      • 1970-01-01
      • 2016-12-04
      • 2015-09-12
      • 2017-06-11
      • 2012-02-14
      • 2016-10-22
      相关资源
      最近更新 更多