В чем разница между и <pk>? - PullRequest
2 голосов
/ 09 июля 2020

Допустим, мы реализуем простой блог с django и что сообщения в блоге доступны по URL-адресам, например /posts/1/, /posts/2/ et c.

Когда мы определяем переменные пути в массив urlpatterns, в чем основное различие между использованием
path('post/<int:pk>/', ..., ...) и path('post/<pk>/', ..., ...)?

Это просто хорошая практика? Есть ли реальные преимущества?

1 Ответ

3 голосов
/ 09 июля 2020

Это просто хорошая практика? Есть ли реальные преимущества?

Да . Это делает путь более конкретным c и позволяет записывать другие пути, не имеющие перекрывающихся шаблонов.

Часть int: представляет собой преобразователь пути [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, поскольку * Конвертер пути 1046 * также соответствует new.

...