首页 > 解决方案 > DRF 不反转 Django url 模式:NoReverseMatch

问题描述

有一个复杂的应用程序(不可能只粘贴代码)。打算解释一下。

姜戈

有一个urls.py来自原生 Django 应用程序的文件。定义并注册其urlpatterns网址。^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 休息框架 (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 不能从 Django 应用程序的核心反转名称空间/URL 的任何线索?如何确保 DRF 可以从核心反转命名空间urls.py urlpattern

添加

经过调查,在foo_report.htmlURL 的任何使用中,例如{% url 'foonamespace:123' %}{% url 'barnamespace:123' %}产生错误 -仅当从 DRF运行时(使用本机 Django 运行相同的页面工作正常)。

网址

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

标签: pythondjangodjango-rest-framework

解决方案


在@dirkgroten 的帮助下,我设法解决了我的问题。不看源代码很难看出问题。

解决方案

更新了routers.py文件:

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

解释

基本上,该应用程序是从根 url 提供的,/而其余的则是从/rest. DRF 路由器根本不包括任何根路由。像显示的那样手动添加它们solution解决了问题并且foonamespace对所有 DRF 元素可见。


推荐阅读