【问题标题】:Set some views which use Django Rest Framework API设置一些使用 Django Rest Framework API 的视图
【发布时间】:2019-09-14 03:36:30
【问题描述】:

我有一个非常基本的 Django Rest API。

我不知道如何在同一个 django 项目中拥有一些 HTML 视图,该项目使用 API(最终保持 API 仅返回 JSON)。

我遵循了这个,但它似乎改变了 API 视图(在这种情况下,curl 将检索 HTML 而不是 JSON): https://www.django-rest-framework.org/api-guide/renderers/#templatehtmlrenderer

我需要另一个 Django 应用程序吗?另一个 Django 项目?一些 JS ?

编辑:

好的,感谢 rrebase,我已经看到这是可能的。

但我无法使用 Curl 检索 JSON,这里是我的 views.py

from rest_framework import generics
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import IsAdminUser

from . import models
from . import serializers

class UserListView(generics.ListAPIView):
    renderer_classes = [JSONRenderer, TemplateHTMLRenderer]
    template_name = 'profile_list.html'

    def get(self, request):
        queryset = models.CustomUser.objects.all()
        serializer_class = serializers.UserSerializer
        return Response({'profiles': queryset})

我的模型.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):

    def __str__(self):
        return self.email

当我请求 API (http://127.0.0.1:8000/api/v1/users/) 时,我收到错误“'CustomUser' 类型的对象不是 JSON 可序列化的”

对不起,最初的问题有些不同......

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    最后我在我看来做了一些条件,而且效果很好

    class UserListView(generics.ListAPIView):
        renderer_classes = [JSONRenderer, TemplateHTMLRenderer]
        permission_classes = (IsAdminUser,)
    
        def get(self, request):
            queryset = CustomUser.objects.all()
    
            if request.accepted_renderer.format == 'html':
                data = {'profiles': queryset}
                return Response(data, template_name='profile_list.html')
            else:
                serializer = UserSerializer(queryset, many=True)
                data = serializer.data
                return Response(data)
    

    【讨论】:

      【解决方案2】:

      是的,你可以两者兼得。您提供给文档的链接如下:

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

      发出 API 请求时,将 ACCEPT 请求标头相应地设置为 htmljson

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多