首页 文章

如何在django 2中注册DRF路由器URL模式

提问于
浏览
6

我的DRF路由器指定了一个名称空间,以便我可以 reverse 我的网址:

urls.py:

router = DefaultRouter()
router.register('widget/', MyWidgetViewSet, base_name='widgets')
urlpatterns =+ [
    url(r'/path/to/API/', include(router.urls, namespace='widget-api'),
]

在升级到django 2时,它给出:

django.core.exceptions.ImproperlyConfigured:不支持在include()中指定名称空间而不提供app_name . 在包含的模块中设置app_name属性,或者传递包含模式列表和app_name的2元组 .

Django 2 now requires app_name 如果在使用 include 时指定了 namespace kwarg . 当url模式由DRF url路由器构建时,指定 app_name 的正确方法是什么?我不认为the documentation是关于这个主题的django 2的最新版本 .

3 回答

  • 9

    您需要将 app_name = 'x' 放在应用程序的 url.py 文件中 . 这有点埋没在文档中:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/#id5

    例如,如果在 /project/project/urls.py 中您有:

    path('', include('app.urls', namespace='app'))
    

    然后在相应的url文件中(在 /project/app/urls.py 中),你需要指定 app_name 参数:

    app_name = 'app'  #the weird code
    urlpatterns = [
        path('', views.index, name = 'index'), #this can be anything
    ]
    
  • 0

    您需要将router.urls包含为元组并将应用程序名称添加到元组而不是仅包含router.urls

    根据你的例子你应该尝试类似的东西:

    router = DefaultRouter()
    router.register('widget/', MyWidgetViewSet, base_name='widgets')
    urlpatterns =+ [
        url(r'/path/to/API/', include((router.urls, 'my_app_name'), namespace='widget-api'),
    ]
    
  • 0

    推荐的方法是

    from django.conf.urls import url, include
    from rest_framework import routers
    
    router = routers.DefaultRouter()
    router.register(r'widget/', MyWidgetViewSet)
    
    urlpatterns = [
        url(r'^path/to/API/', include('rest_framework.urls', namespace='widget-api'))
    ]
    

    http://www.tomchristie.com/rest-framework-2-docs/tutorial/quickstart#urls

相关问题