当前,我使用以下命令将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')),
]
greeter / 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')),
]
greeter / 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)),
]
与此:
我认为这尽我所能。再次感谢您的所有帮助:)
答案 0 :(得分:2)
正如我之前对您所说,路由器需要一个前缀。您需要从主要网址中删除该前缀,并在路由器本身中使用它。
主要:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('greeter.urls')),
]
app:
ROUTER = routers.DefaultRouter()
ROUTER.register(r'^greeter/', GreeterViewSet)
urlpatterns = ROUTER.urls
(由于路由器路由器没有其他URL,因此不需要在其中使用include,您可以直接使用路由器URL。)
还请注意,这几乎可以肯定不是您想做的全部;这意味着除了视图集的URL之外,您再也没有其他任何URL。
答案 1 :(得分:0)
从正则表达式中删除 ^
(Caret符号)即可完成
# greeter/urls.py
# your code
urlpatterns = [
url(r'', include(ROUTER.urls)),
]