繁体   English   中英

DRF不反转Django网址格式:NoReverseMatch

[英]DRF does not reverse Django url pattern: NoReverseMatch

有一个复杂的应用程序(无法仅粘贴代码)。 要尝试解释。

Django的

本地Django应用有一个urls.py文件。 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框架(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应用程序的核心反转名称pcae / url? 如何确保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可能就是这样/rest只是不包含任何内容,因为它是root的父级(包括foo.urls.py

我在@dirkgroten的帮助下得以解决我的问题。 不查看源代码就很难发现问题。

更新了routers.py文件:

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

说明

基本上,该应用程序是从根url / ,其余的是从/rest DRF路由器根本不包含任何根路由。 solution所示的那样手动添加它们可以解决问题,并使foonamespace对所有DRF元素可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM