Django 2.1 - Что делает namespace = при включении в urls.py - PullRequest
0 голосов
/ 23 апреля 2019

У меня в значительной степени есть app_name и пространства имен работают хорошо, но у меня есть простое пояснение - и я думаю, что это может быть то, что в моем 2.1 Django, которое могло отличаться в более ранних версиях Django.

У меня есть приложение с именем route и в его urls.py у меня есть:

app_name = 'route'  
urlpatterns = [
    path('first', views.FirstView.as_view(), name='first-view'),
]

В моих views.py и файлах шаблонов я использую route:first-view в моих reverse() вызовах и {% url .. %} вызовах, и все это работает.

Моя путаница в моем широком проекте urls.py, где я говорю что-то вроде:

urlpatterns = [
    path('route/', include('route.urls', namespace='route')),
]

То, что сводит меня с ума, это то, что кажется, что параметр namespace= абсолютно ничего не делает. Мой код работает так же, если я пропущу его или даже скажу namespace='abc' - он кажется на 100% проигнорированным Django 2.1.

Также, если я использую namespace='route' без установки app_name, я получаю ошибку: Specifying a namespace in include() without providing an app_name is not supported.

Если namespace= игнорируется - тогда я рад просто установить app_name - я оставлю это - Просто кажется, что у него должна быть цель, которую я просто не могу понять. Или, может быть, это что-то ненужное и из более ранней версии Django.

Примечание: я посмотрел на аналогичный вопрос и ответ , но этот пример не объясняет, как работает пространство имен при использовании path. Я стараюсь избегать шаблонов URL / регулярных выражений и максимально использую более простой шаблон path.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Использование namespace в include() позволяет включать одно и то же приложение более одного раза с различным пространством имен для каждого экземпляра.

Вы можете увидеть пример в документации , где приложение polls включено дважды с двумя различными пространствами имен.

Если вы включаете route.urls только один раз в свой проект, тогда namespace='route' не требуется и может быть удален.

0 голосов
/ 23 апреля 2019

Используя пространство имен, вы можете сделать это в своем шаблоне:

<a href="{% url 'portal:changepass' %}">Change pass</a>

Если у вас есть другой URL с таким же именем «changepass» в другом приложении, вы можете сделать то же самое, изменив только пространство имен:

<a href="{% url 'system:changepass' %}">Change pass</a>

Надеюсь, это поможет ^^

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...