Django-Rest-Framework(DRF)视图和序列化器可以取代Django本机视图和表单

时间:2018-04-24 13:03:04

标签: django django-rest-framework

我正在开发一个我必须展示的网站

1)具有html内容类型的网页

2)还提供api json端点来开发网络或移动应用程序。

目前,对于html网页,我使用了djangos视图和表单。

对于api我正在使用Django休息框架视图和序列化器。

但是经过DRF后我发现DRF可以呈现多种格式。

  

HTML&表单REST框架适用于返回两种API样式   响应和常规HTML页面。另外,可以使用序列化器   作为HTML表单并在模板中呈现。

http://www.django-rest-framework.org/topics/html-and-forms/

  

您可以使用TemplateHTMLRenderer返回常规HTML页面   使用REST框架,或从一个返回HTML和API响应   单一终点。

http://www.django-rest-framework.org/api-guide/renderers/#templatehtmlrenderer

由于有一个视图(一个端点),我可以同时获得html和api,这不会减少我的编码工作。

我打算只使用DRF视图和搜索器代替DJango表单和任何类型内容的视图。

如果我只使用DRF会有什么挫折。

2 个答案:

答案 0 :(得分:6)

没有Django就不能使用DRF,因为DRF不是一个自治框架 因此,为了使用DRF,您将基于Django应用程序。因此,使用Django视图的选项取决于您和您想要解决的问题。

通常,仅使用DRF视图和序列化程序没有任何缺点,但正如我所提到的,这取决于手头的问题。有些线程列出了使用DRF原因的一些原因,可以找到herehere

最后,DRF为您提供了使用选项request.accepted_renderer的“情境”渲染器的选项(直接来自文档):

  

在某些情况下,您可能希望视图使用不同的序列化样式,具体取决于接受的媒体类型。如果您需要这样做,您可以访问request.accepted_renderer以确定将用于响应的协商渲染器。

     

例如:

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def list_users(request):
    """
    A view that can return JSON or HTML representations
    of the users in the system.
    """
    queryset = Users.objects.filter(active=True)

    if request.accepted_renderer.format == 'html':
        # TemplateHTMLRenderer takes a context dict,
        # and additionally requires a 'template_name'.
        # It does not require serialization.
        data = {'users': queryset}
        return Response(data, template_name='list_users.html')

    # JSONRenderer requires serialized data as normal.
    serializer = UserSerializer(instance=queryset)
    data = serializer.data
    return Response(data)    

涵盖了问题的第二部分。

答案 1 :(得分:-1)

我想您希望查看自己的API信息,并提供一些可以创建其他对象的表单。为此,您可以使用rest-framework

中的APIView

我有一个类似这样的项目:

from rest_framework.views import APIView
from rest_framework.response import Response

class MonitorList(APIView):

    ''' List all Monitors, or create a new Monitor '''

    def get(self, request, format=None):
        monitors = Monitor.objects.all()
        serializer = MonitorSerializer(monitors, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = MonitorSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class MonitorDetail(APIView):

    ''' GET, PUT AND DELETE METHODS FOR Monitor '''
    def get_object(self, pk):
        try:
            return Monitor.objects.get(pk=pk)
        except Monitor.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        monitor = self.get_object(pk=pk)
        serializer = MonitorSerializer(monitor)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        monitor = self.get_object(pk=pk)
        serializer = MonitorSerializer(monitor, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        monitor = self.get_object(pk=pk)
        monitor.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

如果你想要创建或编辑某个对象的选项,你应该有post,put甚至补丁方法。可以阅读docs以获取有关DRF视图的更多信息。希望我能帮助你。 :)

相关问题