【问题标题】:What is the difference between <int:pk> and <pk>?<int:pk> 和 <pk> 有什么区别?
【发布时间】:2020-10-29 10:08:23
【问题描述】:

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

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

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

【问题讨论】:

  • 你想接受不是整数的pk 值吗?
  • 不,不一定。假设我们所有的pk 值都是整数。
  • 如果你使用&lt;int:pk&gt;,那么你的视图保证会收到一个实际的整数值。否则,您必须担心自己解析整数,并处理传递非整数字符串值时出现的任何错误。

标签: python django django-urls


【解决方案1】:

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

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

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

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

class IntConverter:
    regex = '[0-9]+'

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

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

StringConverter [GitHub] 使用:

class StringConverter:
    regex = '[^/]+'

    def to_python(self, value):
        return value

    def to_url(self, value):
        return value

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

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

如果您要编写&lt;pk&gt;,那么post/new 路径也会触发some_view 视图,而不是other_view,因为str: 路径转换器也与new 匹配。

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多