Django Использование reverse () с несколькими URL-адресами, включающими одно и то же приложение - PullRequest
0 голосов
/ 29 ноября 2018

EDIT: я использую rest_framework.reverse и предоставляю имя приложения, а не пространство имен для обратного просмотра.Пример обратного вызова:

reverse('api_app:system-detail', kwargs={...}, request=self.context.get('request'))

Итак, у меня есть проект django с одним приложением, и у меня есть два разных шаблона URL, привязанных к этому одному приложению.В настоящее время у меня это в основном работает, однако в некоторых случаях использование reverse () приводит к неверному пространству имен.Моя база urls.py выглядит следующим образом:

from django.conf.urls import url, include
from django.views.generic.base import RedirectView


urlpatterns = [
    url(r'^api/', include('api_project.api_app.urls', 
    namespace='api')),
    url(r'^beta/api/', include('api_project.api_app.urls', 
    namespace='beta')),
    url(r'^$', RedirectView.as_view(url='api', permanent=False), 
    name='index')
]

РЕДАКТИРОВАТЬ: api_app.urls выглядит следующим образом:

from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from . import views
from rest_framework.schemas import get_schema_view

schema_view = get_schema_view(title="Schema")


app_name = 'api_app'

urlpatterns = [
url(r'^$', views.APIRoot.as_view(), name='api-root'),
url(r'^schema/$', schema_view, name'api-schema'),
....

В большинстве случаев обратное работает, как ожидалось, например, использование / бета / конечная точка имеетссылки на странице, которые выглядят следующим образом:

/beta/endpoint/example

Однако в некоторых случаях использование / бета / конечная точка имеет ссылки вроде:

/api/endpoint/different-example

Мой вопрос меньше о том, как обратное определение определяет, какиепространство имен для использования, но вместо этого это подходящий способ использовать два пространства имен для одного и того же приложения?Это то, что я должен подходить совершенно по-другому?

Большая часть моих исследований пока не привела к большому успеху, поэтому я думаю, что это может быть в корне неправильным подходом.

Если с этим подходом все в порядке, мне любопытно, почему обратное противоречие в том пространстве имен, которое оно возвращает.

1 Ответ

0 голосов
/ 03 декабря 2018

Документация по обращению URL-адресов с пространством имен показывает, что происходит.В вашем случае вы создаете экземпляр одного и того же приложения дважды, один раз с пространством имен экземпляра api и один с пространством имен экземпляра beta.

Пространство имен вашего приложения - api_app, как определено в app_name переменная в вашем включенном файле urls.py.Таким образом, он не соответствует ни одному из двух пространств имен экземпляров, то есть не существует экземпляра приложения по умолчанию.

Так что в вашем случае преобразователь URL-адресов в основном разрешит вариант 4: если вы не укажете свой current_app в представлении будет преобразован в последний развернутый экземпляр (имеется в виду последний зарегистрированный), который является «бета».

Вы должны указать current_app в своем представлении, оба при использовании reverseи на объекте request (чтобы ваши шаблоны также могли правильно обрабатываться).

...