【问题标题】:Django Rest Framework for function based views用于基于函数的视图的 Django Rest Framework
【发布时间】:2015-11-24 12:10:51
【问题描述】:

我无法在 django 中获取基于函数的视图的 JSON。我有下面的代码。我基本上希望该函数根据用户请求返回 json 或 html 页面。

@api_view(['GET'])
@renderer_classes((JSONRenderer,TemplateHTMLRenderer,BrowsableAPIRenderer))
def meld_live_orders(request):
    if request.method =='GET':
        current_orders = Meld_Sales.objects.values_list('TicketNo',flat=True).distinct()
        prev_orders = Meld_Order.objects.values_list('TicketNo',flat =True).distinct()

        live_orders = live_order_generator(current_orders,prev_orders)

        return render(request,'live_orders.html',{'live_orders':live_orders})

当我转到网址时 - http://localhost:8000/live-orders.json

我收到一条错误消息,指出以下内容 -meld_live_orders() got an unexpected keyword argument 'format'

这是因为我需要在 CBV 中以相同的方式包含序列化程序类吗? @API_VIEW 不会序列化响应吗?

我尝试在函数参数中包含format = ''。但问题是当我希望它呈现 json 时它仍然呈现 html。

【问题讨论】:

    标签: python json django django-rest-framework


    【解决方案1】:

    您需要对代码进行一些更改。

    首先,如果您没有定义format_suffix_patterns,则需要在您的网址中使用它。这将允许我们在 URL 上使用文件扩展名,从而为给定的媒体类型提供端点。

    from rest_framework.urlpatterns import format_suffix_patterns
    
    urlpatterns = [
         ...
    ]
    
    urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html']) # allow us to use '.json' and '.html' at the end of the url
    

    其次。您的视图在定义中没有format 参数。

    使用format_suffix_patterns时,必须确保添加 'format' 对应视图的关键字参数。

    @api_view(['GET'])
    @renderer_classes((JSONRenderer,TemplateHTMLRenderer,BrowsableAPIRenderer))
    def meld_live_orders(request, format=None): # add a 'format' parameter
        ...
    

    第三,您需要返回 DRF 响应,而不是您在视图结束时返回的 Django 响应

    【讨论】:

      【解决方案2】:

      您必须在 url 模式中匹配 format 参数,但在视图函数中没有名为 format 的参数。将视图定义更改为:

      def meld_live_orders(request, format = ""):
      

      【讨论】:

      • 我实际上尝试过..很抱歉在问题中跳过它..当我希望它呈现 json 时它仍然呈现在 html 中
      • 能否介绍一下您的网址格式?
      • 好吧,我知道,在最后一行中,您已经呈现了一个 HTML 页面作为响应,它应该是一个 rest_framework.response.Response 对象。
      • 有没有办法让我两者兼得?即用户仅通过在 url 后包含 .json 来获取 json 数据?我的网址模式 - url(r'^live-orders$',meld_live_orders,name='live-orders')
      • 请仔细查阅文档。正确的方法是将序列化器的数据传递给 Response 对象。对于 JSONRenderer,数据会被转换成 JSON 格式;对于 TemplateHTMLRenderer,数据将作为上下文变量传递给模板。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2014-02-16
      • 2018-03-24
      • 1970-01-01
      • 2021-03-28
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多