[英]DRF does not reverse Django url pattern: NoReverseMatch
有一个复杂的应用程序(无法仅粘贴代码)。 要尝试解释。
本地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成功撤消。
现在有一个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的同一页面效果很好)。
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.