<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
.
假设我们正在使用 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
.