从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应

Posted

技术标签:

【中文标题】从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应【英文标题】:Conditionally return JSON or HTML response from Django django-rest-framework's view 【发布时间】:2014-12-07 09:43:59 【问题描述】:

如何从 Django django-rest-framework 的视图有条件地返回 JSON 或 html 响应?

    djangorestframework == 2.3.10

    我的settings.py

REST_FRAMEWORK = 
    'PAGINATE_BY': 10,
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.TemplateHTMLRenderer',
        'rest_framework.renderers.JSONRenderer',
    )

    在我的url.py 中,我将其添加为最后一行:
urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html'])
    我的看法是这样的:
def myview(request, id, format='json'):
    if format == 'json' or format is None:
        return Response(my_dict, status=status.HTTP_200_OK)
        else:
            return Response(my_dict, template_name='myhtml.html')

如果我在 url 请求中明确使用 .html.json format_prefix,一切正常。但如果我不指定任何格式,它会给我以下错误。

在 /objects/29 处配置不正确 返回了一个没有设置 template_name 属性的模板响应 视图或响应 请求方法:GET 请求网址:localhost:8000/objects/29 Django 版本:1.7 异常类型:配置不当 异常值:返回没有template_name 的模板响应 在视图或响应上设置的属性 异常位置:D:\WORKSPACE\user...\lib\site-

我也试过了:

urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html', 'None'])

但它似乎也不起作用。

有人可以帮忙吗?谢谢!

【问题讨论】:

【参考方案1】:

这对我有用:

class MyView(ListAPIView):
    renderer_classes = (JSONRenderer, TemplateHTMLRenderer,)

    def get(self, request, *args, **kwargs):
        data = SomerSerializer([]).data
        if request.accepted_renderer.format == 'html':
            return Response(data, template_name='blah.html')

        return Response(data)

仅供参考,我之前也遇到过这个错误,但这并不是因为它配置正确——而是因为一些不相关的代码就在它出错之前——所以寻找其他可能失败的东西。另请注意,您的“其他”是多余的。

【讨论】:

【参考方案2】:

经过研究,这对我有用 下面的django视图充当模板渲染器json渲染器

views.py

from rest_framework.renderers import JSONRenderer, TemplateHTMLRenderer
from rest_framework.decorators import api_view, renderer_classes
from django.http.response import JsonResponse
from django.shortcuts import render


@api_view(['GET','POST'])
@renderer_classes([JSONRenderer,TemplateHTMLRenderer])
def myview(request, id, format='json'):
        if format == 'json' or format is None:
            return JsonResponse(my_dict, status=status.HTTP_200_OK)
        else:
            return render(request,'template_name.html',"context":my_dict)

settings.py

REST_FRAMEWORK = 
    'DEFAULT_RENDERER_CLASSES': (
    'rest_framework.renderers.JSONRenderer',        
    'rest_framework.renderers.TemplateHTMLRenderer',
    ),

上述视图的作用类似于 Json 渲染器模板渲染器。 根据条件,您可以看到行为。

【讨论】:

以上是关于从 Django django-rest-framework 视图有条件地返回 JSON 或 HTML 响应的主要内容,如果未能解决你的问题,请参考以下文章

Django - 从 Django 模板访问外键管理器

从 Django 项目启动多个 Django 开发服务器

Django - 从模板链接到页面

如何从现有表创建 django 类 [重复]

Django,如何将变量从 Django 管理员传递到模板?

将数据从 excel 电子表格导入 django 模型