gpt4 book ai didi

python - 通过 Django 基于类的 View 发送文件

转载 作者:行者123 更新时间:2023-12-04 13:23:30 24 4
gpt4 key购买 nike

我们在大部分项目中使用基于类的 View 。当我们尝试创建一个 CSV Mixin 时,我们遇到了一个问题,它允许用户将几乎任何页面的信息导出为 CSV 文件。我们的特殊问题涉及 CSV 文件,但我相信我的问题足够通用,可以与任何文件类型相关。

我们遇到的问题是 View 的响应试图转到模板(比如 from django.views.generic import TemplateView )。我们在 urls.py 中指定模板文件。

url(r'^$', MyClassBasedView.as_view(template_name='my_template.html'))

如何强制响应绕过模板并只返回标准 HttpResponse ?我猜你需要重写一个方法,但我不确定是哪一个。

有什么建议么?

EDIT1:看来我不清楚我们要做什么。我已经呈现了一个页面(通过基于类的 View ),用户将看到信息报告。我需要输入一个“导出到 CSV”按钮供用户按下,它将导出他们页面上的信息并将 CSV 下载到他们的机器上。

将我们的 View 重写为基于方法的 View 不是一种选择。我们处理几乎所有基于类的 View 类型(DetailView、ListView、TemplateView、View、RedirectView 等)

最佳答案

当您需要为相同的数据提供不同的响应时,这是一个普遍的问题。您想要插入的点是上下文数据已经被解析但尚未构建响应。

解析为 TemplateResponseMixin 的基于类的 View 有几个属性和类方法来控制响应对象的构造方式。不要以为这个名字意味着只有 HTML 响应或需要模板处理的响应只能通过这种设计来实现。解决方案的范围包括创建基于 TemplateResponse 行为的自定义、可重复使用的响应类。类或创建为 render_to_response 提供自定义行为的可重用 mixin方法。

代替编写自定义响应类,开发人员更经常提供自定义 render_to_response View 类中的方法或单独在 mixin 中的方法,因为它非常简单直接地弄清楚发生了什么。您将嗅探请求数据以查看是否必须构建某种不同类型的响应,如果没有,您只需委托(delegate)默认实现来呈现模板响应。

以下是这样一种实现的样子:

import csv
from django.http import HttpResponse
from django.utils.text import slugify
from django.views.generic import TemplateView


class CSVResponseMixin(object):
"""
A generic mixin that constructs a CSV response from the context data if
the CSV export option was provided in the request.
"""
def render_to_response(self, context, **response_kwargs):
"""
Creates a CSV response if requested, otherwise returns the default
template response.
"""
# Sniff if we need to return a CSV export
if 'csv' in self.request.GET.get('export', ''):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="%s.csv"' % slugify(context['title'])

writer = csv.writer(response)
# Write the data from the context somehow
for item in context['items']:
writer.writerow(item)

return response
# Business as usual otherwise
else:
return super(CSVResponseMixin, self).render_to_response(context, **response_kwargs):

您还可以在此处查看何时可能需要使用自定义响应类进行更精细的设计。虽然这非常适合为自定义响应类型添加临时支持,但如果您想支持五种不同的响应类型,它就不能很好地扩展。

在这种情况下,您将创建和测试单独的响应类并编写单个 CustomResponsesMixin知道所有响应类并提供自定义 render_to_response 的类只配置 self.response_class的方法并将其他所有内容委托(delegate)给响应类。

关于python - 通过 Django 基于类的 View 发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16286666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com