DRF не меняет шаблон URL Django: NoReverseMatch - PullRequest
0 голосов
/ 05 марта 2019

Существует сложное приложение (невозможно просто вставить код).Попытка объяснить.

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)

1 Ответ

1 голос
/ 05 марта 2019

Мне удалось решить мою проблему с помощью @dirkgroten.Было трудно увидеть проблему, не глядя на исходный код.

Решение

Обновлен файл routers.py:

urlpatterns = router.urls
urlpatterns += patterns('',
                        url(r'^foo/', include('foo.urls', namespace='foonamespace')),
                        )

Объяснение

По сути, приложение обслуживалось с корневого URL /, а остальные - с /rest.Маршрутизатор DRF просто не включает ни одного корневого маршрута.Добавление их вручную, как показано в solution, решило проблему и сделало foonamespace видимым для всех элементов DRF.

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