如何使用命名空间调用Django Rest Framework URL?

时间:2014-12-15 16:07:23

标签: django namespaces django-rest-framework

我的urls.py看起来像这样:

router = SimpleRouter()
router.register(r'meetings', MeetingViewSet, 'meetings-list')

urlpatterns = patterns('clubs.views',
    url(r'^(?P<pk>\d+)/', include(router.urls)),
    url(r'^amazon/$', AmazonView.as_view(), name="amazon"),)

我想使用'meetings-list'引用reverse网址,如:

url = reverse('meetings-list')

但是当我尝试这个时,我得到NoReverseMatch: Reverse for 'MeetingViewSet' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

有没有办法使用Django Rest Framework做到这一点?

2 个答案:

答案 0 :(得分:21)

使用路由器注册视图时,可以将base_name作为第三个参数传递。此基本名称用于生成单个URL名称,这些名称生成为[base_name]-list[base_name]-detail

在您的情况下,您将视图集注册为

router.register(r'meetings', MeetingViewSet, 'meetings-list')

因此base_namemeetings-list,视图名称为meetings-list-listmeetings-list-detail。听起来您正在寻找meetings-listmeetings-detail,这需要base_name meetings

router.register(r'meetings', MeetingViewSet, 'meetings')

您还使用现已弃用的patterns语法来定义网址,但您实际上并未使用适用于它的正确url调用。我建议只更换patterns并使用标准Python列表/元组([]())包装您的网址列表。

这应该可以解决您的问题,并且reverse的调用应该为您解决。

答案 1 :(得分:3)

我认为这对你来说看起来更好,更干净:

router_urls = patterns(
    '',
    url(r'^meetings/$', MeetingViewSet.as_view(), 'meetings-list'),
)

urlpatterns = patterns(
    '',
    url(r'^(?P<pk>\d+)/', include(router_urls, namespace='router')),
)

然后,你会做reverse('router:meetings-list', args=(pk, ))

我认为MeetingViewSet是CBV