假设
- generate_cassettes() 方法会生成一个不会导致任何内存问题的小型数据集。
- 没有使用模型(因此也没有使用模型实例)。
方法
- 我们有 2 个视图,即 generate_rna 和 download_csv。 generate_rna 指向 myapp/(在我的情况下,它通常可以指向其他任何需要的东西),而 download_csv 指向 myapp/download/csv(在我的情况下,它通常可以指向其他任何需要的东西)。
- 当您点击 GET myapp/ 时,generate_rna 会呈现一个空表单
- 当您点击 POST myapp/ 时,generate_rna 会接收用户提交的数据并对其进行验证,如果数据有效,它会调用 generate_cassettes,在其中创建数据,然后呈现一个包含填充数据的表单,一个表格显示了 generate_cassettes 生成的数据,还显示了一个“下载 CSV”按钮
- 当您使用磁带数据(由 generate_cassettes 生成)作为有效负载点击 POST myapp/download/csv 时,它会从数据中创建一个 csv 文件(使用 python csv 模块并更改 Content-Type 和 Content-Disposition 标头)并提供供下载。
这是一些代码
myapp urls.py
from django.urls import path
from .views import generate_rna, download_csv
urlpatterns = [
path('', generate_rna),
path('download/csv/', download_csv)
]
myapp forms.py
from django import forms
class RNAGeneratorForm(forms.Form):
name = forms.CharField(max_length=100)
price = forms.DecimalField(decimal_places=2)
def generate_cassettes(self):
#The behaviour of this function is not given in question and hence is assumed.
return [['Name', 'Price'], ['Cassette 1', '130'], ['Cassette 2', '140']]
RNA.html
<html>
<head>
<style>
table, th, td {
border: 1px solid black;
}
</style>
<title> RNA Form </title>
</head>
<body>
<!-- This form takes input from user -->
<form action="/myapp/" method="POST">
{% csrf_token %}
{{ form }}
<input type="submit" value = "Submit" />
</form>
{% if cassettes %}
<table>
<tr>
{% for column_name in cassettes.0 %}
<th> {{ column_name }} </th>
{% endfor %}
</tr>
{% for row in cassettes|slice:"1:" %}
<tr>
{% for column in row %}
<td> {{ column }} </td>
{% endfor %}
</tr>
{% endfor %}
</table>
<form action="/myapp/download/csv/" method="POST">
{% csrf_token %}
<input type="submit" value="Download CSV">
<input type="hidden" id="cassette-data" name="cassette-data">
</form>
{{ cassettes|json_script:"cassette-json" }}
<script>
document.getElementById("cassette-data").value = document.getElementById("cassette-json").textContent;
</script>
{% else %}
No Cassettes
{% endif %}
</body>
</html>
RNA.html 中使用的方法
- 如果存在磁带(例如,如果服务器响应 POST myapp/),我会将数据呈现为表格并显示“下载 CSV 按钮”。如果你看到这个链接https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#json-script,
通过使用 json_script,有一种方法可以以 json 的形式公开对象。然后我有一个 ID 为“cassette-json”的脚本(请参阅 html 源代码 {{cassette|json_script:"cassette-json" }} 中的这一行)。我有另一个脚本标签,我在其中将磁带作为 json 分配给隐藏的输入(名称为“cassette-data”)。 “下载 CSV”按钮嵌入在另一种形式中,将“盒式数据”作为有效负载发送到 myapp/download/csv。
myapp views.py
from django.shortcuts import render, HttpResponse
from .forms import RNAGeneratorForm
import csv
import json
def generate_rna(request):
if request.method == 'POST':
form = RNAGeneratorForm(request.POST)
if form.is_valid():
result = form.generate_cassettes()
context = {
"form": form,
"cassettes": result
}
return render(request, 'myapp/RNA.html', context)
else:
form = RNAGeneratorForm()
context = {
"form": form
}
return render(request, 'myapp/RNA.html', context)
def download_csv(request):
if request.method == 'POST':
data = request.POST
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="cassettes.csv"'
csv_writer = csv.writer(response)
for row in json.loads(data['cassette-data']):
print(row)
csv_writer.writerow(row)
return response
如有任何疑问,请与我们联系。