You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django REST Framework中按查询参数返回JSON或HTML模板?

实现方案

要实现通过查询参数控制返回格式,核心思路是动态切换DRF视图的渲染器,同时根据返回格式处理对应的数据。以下是具体实现步骤和代码:

1. 导入必要模块

确保引入DRF的JSON渲染器、模板HTML渲染器,以及模型和序列化器(需要提前定义序列化器):

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from .models import Profile
from .serializers import ProfileSerializer  # 需自行定义的序列化器

2. 定义序列化器

为了将Profile模型数据序列化为JSON,需要创建对应的模型序列化器:

from rest_framework import serializers

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'  # 可根据需求指定具体字段,比如['id', 'name', 'email']

3. 修改视图类

重写get_renderer_classes方法动态切换渲染器,并在get方法中根据查询参数处理数据:

class ProfileList(APIView):
    template_name = 'profile_list.html'

    def get_renderer_classes(self):
        # 从查询参数获取格式类型,默认返回HTML
        render_type = self.request.query_params.get('type', 'html')
        if render_type == 'json':
            return [JSONRenderer]
        return [TemplateHTMLRenderer]

    def get(self, request):
        queryset = Profile.objects.all()
        render_type = request.query_params.get('type', 'html')
        
        if render_type == 'json':
            # 序列化数据,返回JSON格式
            serializer = ProfileSerializer(queryset, many=True)
            return Response(serializer.data)
        # 默认返回HTML模板渲染结果
        return Response({'profiles': queryset})

逻辑说明

  • 当请求携带?type=json时:视图使用JSONRenderer,将序列化后的Profile列表以JSON格式返回
  • 当请求携带?type=html或无该参数时:视图使用TemplateHTMLRenderer,渲染指定模板并返回HTML页面
  • 重写get_renderer_classes是DRF推荐的动态控制渲染器的方式,符合框架设计规范

注意事项

  • 确保项目INSTALLED_APPS中已添加rest_framework
  • 序列化器的fields需根据Profile模型的实际字段调整,避免返回不必要的数据

内容的提问来源于stack exchange,提问作者Mas Zero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:00:42