<int:pk> 和 <pk> 有什么区别?

What is the difference between <int:pk> and <pk>?

假设我们正在使用 django 实现一个简单的博客,并且可以使用 /posts/1//posts/2/ 等 URL 访问博客文章

当我们在urlpatterns数组中定义路径变量时,使用
的主要区别是什么 path('post/<int:pk>/', ..., ...)path('post/<pk>/', ..., ...)?

这只是个好习惯吗?有实际好处吗?

Is it just good practice? Are there actual benefits?

。它使路径更加具体,并允许编写没有重叠模式的其他路径。

int: 部分是 path converter [Django-doc]。如果您没有指定路径转换器,将使用 str 路径转换器。

它指定将使用的正则表达式。例如 IntConverter [GitHub] 有正则表达式:

class IntConverter:
    <b>regex = '[0-9]+'</b>

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return str(value)

StringConverter [GitHub] 使用:

class StringConverter:
    <b>regex = '[^/]+'</b>

    def to_python(self, value):
        return value

    def to_url(self, value):
        return value

因此,这些是替换路径中的 <int:pk><str:pk> 的正则表达式。如果你因此简单地写 <pk>,那么它也会为 post/foobar 触发。你本身并不想要这个。例如,如果您以后有另一条路径:

    path('post/<b><int:pk></b>/', some_view),
    path('post/new/', other_view),

如果你写 <pk> 那么 post/new 路径也会触发 some_view 视图,而不是 other_view,因为 str: 路径转换器也匹配 new.