Существует сложное приложение (невозможно просто вставить код).Попытка объяснить.
Django
Существует файл urls.py
из собственного приложения Django.urlpatterns
определяет и регистрирует свои URL.^foo/
определяет группу связанных URL-адресов и foonamepsace
.
urlpatterns = patterns('',
...
url(r'^foo/', include('foo.urls', namespace='foonamespace')),
...
Теперь есть метод generate_report
, который выполняет некоторую логику внутри, а затем использует render_to_string
для возврата HTML:
def generate_report(..):
...
return render_to_string('foo/foo_report.html', args)
Все работает внутри приложения, URL успешно изменен на обратный.
Django Rest Framework (DRF)
Теперь есть реализация DRFи один из его ресурсов должен возвращать отчет в двоичном формате.
class PDFReportViewSet(APIView):
renderer_classes = (BinaryFileRenderer, )
def get(..):
...
pdf = generate_report() # <-- fails with NoReverseMatch
...
return response
Проблема
ViewSet
вызывает generate_report
, однако при попытке проанализировать HTML появляется ошибка:
NoReverseMatch: foonamespace'не является зарегистрированным пространством имен
Вопрос
Есть какие-либо подсказки, почему DRF не может стереть namespcae / url из ядра приложения Django?Как убедиться, что DRF может обратить пространство имен из ядра urls.py
urlpattern
?
Добавлено
После расследования, внутри foo_report.html
любое использование URL, например {% url 'foonamespace:123' %}
или {% url 'barnamespace:123' %}
выдает ошибку - только если запускается с DRF (работает та же страница с использованием нативного Django, работает нормально).
URLS
foo.urls.py
from django.conf.urls import patterns, url
from foo.views import (FooListView, FooDetailView...)
urlpatterns = patterns('',
url(r'^$', FooListView.as_view(), name='foo_list'),
url(r'^(?P<pk>\d+)/$', FooDetailView.as_view(), name='foo_details'),
Важное примечание.Приложение обслуживается на some.domain.com / , тогда как REST подается с some.domain.com / rest .Так может быть так: /rest
просто ничего не включайте, потому что он является родителем корня (который включает foo.urls.py
)