路由器中的已注册URL无法正常工作

问题描述 投票:0回答:3

我试图在URL中使用的路由器中有几个视图,并且URL似乎根本不起作用。我按照http://www.django-rest-framework.org/api-guide/routers/上的说明进行操作,但我的代码似乎不起作用。

我的意图是能够通过这些网址访问视图:

/rest-api/clubs/  
/rest-api/users/  
/rest-api/token/  
/rest-api/docs/

urls.py

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)),
]

views.py

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
python-3.x django-rest-framework django-urls
3个回答
1
投票

问题是在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

0
投票

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。


0
投票
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')
]
© www.soinside.com 2019 - 2024. All rights reserved.