目前,我将url配置导入到我的Django项目中:
from django.conf.urls import include
from django.contrib import admin
from django.urls import path, re_path
from rest_framework import routers
from greeter.views import GreeterViewSet
ROUTER = routers.DefaultRouter()
ROUTER.register(r'greeters', GreeterViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^', include(ROUTER.urls)),
]
有没有办法可以移动代码的这些部分:
ROUTER = routers.DefaultRouter()
ROUTER.register(r'greeters', GreeterViewSet)
进入greeter/urls.py
的单独文件?
并保留这些网址:
我试过了:
MY_PROJECT / urls.py
from django.conf.urls import include
from django.contrib import admin
from django.urls import path, re_path
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^greeters/', include('greeter.urls')),
]
招待员/ urls.py
from django.conf.urls import url, include
from rest_framework import routers
from .views import GreeterViewSet
ROUTER = routers.DefaultRouter()
ROUTER.register(r'^', GreeterViewSet)
urlpatterns = [
url(r'^', include(ROUTER.urls)),
]
但得到了:
$ curl -H 'Accept: application/vnd.api+json; indent=2' -X POST http://localhost:8000/greeters/
{
"errors": [
{
"detail": "Method \"POST\" not allowed.",
"source": {
"pointer": "/data"
},
"status": "405"
}
]
}
如果它有帮助,这是我原来的问题已经解决:Method "POST" not allowed with Django Rest Framework
更新:
在答案的帮助下,我能够得出这个解决方案:
MY_PROJECT / urls.py
from django.conf.urls import include
from django.contrib import admin
from django.urls import re_path
urlpatterns = [
re_path('admin/', admin.site.urls),
re_path('greeters/', include('greeter.urls')),
]
招待员/ urls.py
from django.conf.urls import include
from django.urls import re_path
from rest_framework import routers
from .views import GreeterViewSet
ROUTER = routers.DefaultRouter()
ROUTER.register(r'', GreeterViewSet)
urlpatterns = [
re_path(r'', include(ROUTER.urls)),
]
有了这个:
我认为这和我能得到的一样好。再次感谢所有的帮助:)
正如我之前所说,路由器需要一个前缀。您需要从主URL中删除该前缀,并在路由器本身中使用它。
主要:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('greeter.urls')),
]
应用:
ROUTER = routers.DefaultRouter()
ROUTER.register(r'^greeter/', GreeterViewSet)
urlpatterns = ROUTER.urls
(由于除路由器之外没有任何URL,因此您不需要在那里使用包含,您可以直接使用路由器URL。)
还要注意,这整件事几乎肯定不是你想要做的;这意味着除了视图集之外,您永远不会有任何URL。
从正则表达式中删除^
(Caret符号)将完成这项工作
# greeter/urls.py
# your code
urlpatterns = [
url(r'', include(ROUTER.urls)),
]