【问题标题】:Return JsonResponse in Class-based CreateView在基于类的 CreateView 中返回 JsonResponse
【发布时间】:2025-12-13 06:45:01
【问题描述】:

我正在使用curl 向我的网站提交表单数据。

curl -F some_file=@file.txt -F name=test_01 https://localhost:8000

它不是 API,但我需要一个充当 API 的端点。我在这里有点超出我的深度,所以我希望有人可以帮助我。

我已经设置并运行了模型以及CreateView

class CreateFile(CreateView):
    model = SomeFile
    fields = ['name', 'some_file', . . .]

当我向指定的 URL (/file/request) 发送带有上述 curl 的 POST 请求时,该对象在数据库中创建并且我得到响应(例如,/thanks 现在是来自的 HTTP 响应模板视图)。但是由于非浏览器会发送这个请求,我希望用一些 JSON 来响应。可能带有对象的名称、状态等。

我尝试了一些结果好坏参半的事情...例如,如果我使用 View 而不是 CreateView,我可以返回 JSON,但我真的很喜欢 CreateView CBV 的易用性和便利性,所以我希望我能以这种方式做我想做的事。

我该怎么做?我发现了一个提供一些线索的问题:How do I return JSON response in Class based views, instead of HTTP response

但这涉及浏览器中的典型表单/视图模型。如果我必须重写 post 方法,那么获取表单数据以便创建对象的最佳方法是什么?即使我不处理呈现的表单,我是否需要一个表单类?

【问题讨论】:

    标签: json django api


    【解决方案1】:

    我最终选择了 Django 文档中的一些内容:

    from django.http import JsonResponse
    
    class JSONResponseMixin:
        """
        A mixin that can be used to render a JSON response
        """
        def render_to_json_response(self, context, **response_kwargs):
            return JsonResponse(self.get_data(context), **response_kwargs)
    
        def get_data(self, context):
            return context
    

    然后我在 DetailView 中使用了它,覆盖了 get 和 post 方法。

    class FileRequest(JSONResponseMixin, DetailView):
    
        def get:
            . . .
            return self.render_to_response(response_data)
    
        def post:
            . . .
            return self.render_to_response(response_data)
    
        def render_to_response(self, context, **response_kwargs):
            return self.render_to_json_response(context, **response_kwargs)
    

    【讨论】: