我试图在URL中使用的路由器中有几个视图,并且URL似乎根本不起作用。我按照http://www.django-rest-framework.org/api-guide/routers/上的说明进行操作,但我的代码似乎不起作用。
我的意图是能够通过这些网址访问视图:
/rest-api/clubs/
/rest-api/users/
/rest-api/token/
/rest-api/docs/
from django.conf.urls import url
from django.contrib import admin
from . import views
from rest_framework.documentation import include_docs_urls
from django.conf.urls import include
from rest_framework.authtoken import views as rest_views
from rest_framework import routers
# These urls don't work at all. But if I put them directly in urlpatterns,
# instead of a router, they work.
router = routers.DefaultRouter()
router.register(r'clubs', views.ClubViewSet)
router.register(r'users', views.UserViewSet)
router.register(r'token', rest_views.obtain_auth_token, base_name="User Token (login)")
router.register(r'docs', include_docs_urls(), base_name="API Documentation")
urlpatterns = [
url(r'^$', views.index, name="Homepage"),
url(r'^admin/', admin.site.urls),
url(r'^rest-api/', include(router.urls)),
]
from .models import Club, Token, Calendar
from django.contrib.auth.models import User
from rest_framework import viewsets
class ClubViewSet(viewsets.views.APIView):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = Club.objects.all()
serializer_class = ClubSerializer
class UserViewSet(viewsets.views.APIView):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
问题是在views.py中使用APIView
。将其更改为ModelViewSet
解决了这个问题。
from rest_framework.viewsets import ModelViewSet
class ClubViewSet(ModelViewSet):
queryset = Club.objects.all()
serializer_class = ClubSerializer
class UserViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
Router
只适用于ViewSet
。这意味着:
router.register(r'clubs', views.ClubViewSet) # OK
router.register(r'users', views.UserViewSet) # OK
router.register(r'token', rest_views.obtain_auth_token, base_name="User Token (login)") # NOK, it's not a viewset
router.register(r'docs', include_docs_urls(), base_name="API Documentation") # NOK, includes don't work.
最后两行应该直接进入urlpatterns。
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
urlpatterns = [
……,
url(r'^register_route', include(router.urls),name='register_route'), //this is important
url(r'^ap_auth/', include('rest_framework.urls'),name='ap_auth')
]