【问题标题】:Django-Rest-Framework: No Attribute HelloViewSetDjango-Rest-Framework:没有属性 HelloViewSet
【发布时间】:2020-08-21 10:56:15
【问题描述】:

我正在尝试构建一个简单的 REST API。 我尝试添加一个视图集,但不知何故我得到一个错误,即没有这样的属性。 如果我删除视图集并使用 APIView 运行,它加载就好了。我被困住了。可能是什么问题呢?我应该怎么做才能让它发挥作用?

这是 rest_profiles.views.py 文件:

from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import HelloSerializer
# Create your views here.


class HelloApiView(APIView):
    '''Test API View'''

    serializer_class = HelloSerializer

    def get(self, request, format=None):
        '''Returns a list of API features'''
        an_apiview = [
            'Uses HTTP methods as functions (get, psot, put, patch, delete)',
            'Similar to Django View',
            'Mapped manually to URLs'
        ]

        return Response({'message': 'Hello from HelloAPIVIew', 'an_apiview': an_apiview})

    def post(self, request):
        '''Create Hello Message'''
        serializer = HelloSerializer(data=request.data)

        if serializer.is_valid():
            name = serializer.data.get('name')
            message = 'Hello {0}'.format(name)
            return Response({'message': message})

        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def put(self, request):
        '''Handles Updates'''
        serializer = HelloSerializer(data=request.data)
        return Response({'message': 'put'})

    def patch(self, request, pk=None):
        '''Handles partial Updates'''
        serializer = HelloSerializer(data=request.data)
        return Response({'message': 'patch'})

    def delete(self, request, pk=None):
        '''Handles deleting items'''
        serializer = HelloSerializer(data=request.data)
        return Response({'message': 'delete'})

    class HelloViewSet(viewsets.ViewSet):
        '''Test API Viewset'''

        def list(self, request):
            '''Return Hello Message'''

            a_viewset = [
                'Uses Actions (list, create, retrieve, update, partial_update)',
                'automatically maps to URLs using Router',
                'More functionality with less code'
            ]

            return Response({'message': 'Hello', 'a_viewset': a_viewset})

这是 urls.py 文件:

from django.conf.urls import url
from django.conf.urls import include
from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()
router.register('hello-viewset', views.HelloViewSet,
                base_name='hello-viewset')


urlpatterns = [
    url('hello-view/', views.HelloApiView.as_view()),
    url('', include(router.urls))
]

可能是什么问题?以及可能的解决方法?

【问题讨论】:

  • 你能把错误添加到问题中吗?

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:

如果您的代码粘贴正确,您的HelloViewSet 看起来就像是您的HelloApiView 中。

缩进在 Python 中很重要。您需要取消缩进此代码:

class HelloViewSet(viewsets.ViewSet):
    '''Test API Viewset'''

    def list(self, request):
        '''Return Hello Message'''

        a_viewset = [
            'Uses Actions (list, create, retrieve, update, partial_update)',
            'automatically maps to URLs using Router',
            'More functionality with less code'
        ]

        return Response({'message': 'Hello', 'a_viewset': a_viewset})

这会将其直接放入您的 views 模块中,以便可以导入。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 2019-04-30
    • 2017-03-04
    • 2021-05-02
    • 2018-09-13
    • 2020-12-24
    • 2021-07-15
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多