Python 基于函数视图的Django Rest框架

Python 基于函数视图的Django Rest框架,python,json,django,django-rest-framework,Python,Json,Django,Django Rest Framework,我在django中获取基于函数的视图的JSON时遇到问题。我有下面的代码。我基本上希望函数根据用户请求返回json或html页面 @api_view(['GET']) @renderer_classes((JSONRenderer,TemplateHTMLRenderer,BrowsableAPIRenderer)) def meld_live_orders(request): if request.method =='GET': current_orders = Mel

我在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})
当我转到url-
http://localhost:8000/live-orders.json

我收到一个错误,说明如下-
meld\u live\u orders()得到一个意外的关键字参数“format”

这是因为我需要在CBV中以相同的方式包含序列化程序类吗?
@API\u视图是否序列化了响应


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

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

def meld_live_orders(request, format = ""):

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

首先,如果您没有定义URL,则需要在URL中使用。这将允许我们在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'
关键字参数到相应的视图


第三,您需要返回一个DRF响应,而不是在视图末尾返回的Django响应。

我实际上已经尝试过了。。很抱歉在问题中跳过了它。。当我希望它呈现JSON时,它仍然以html呈现。请呈现您的url模式好吗?我知道,在最后一行中,您呈现了一个html页面作为响应,它应该是rest_framework.response.response对象。有没有一种方法可以同时呈现这两个对象?i、 e用户仅通过在url后包含.json来获取json数据?我的url模式-url(r“^live orders$”,meld_live_orders,name='live-orders')请仔细查找文档。正确的方法是将序列化程序的数据传递给响应对象。对于JSONRenderer,数据将转换为JSON格式;对于TemplateHTMLRenderer,数据将作为上下文变量传递给模板。
@api_view(['GET'])
@renderer_classes((JSONRenderer,TemplateHTMLRenderer,BrowsableAPIRenderer))
def meld_live_orders(request, format=None): # add a 'format' parameter
    ...