我是django的新手,在我的第一个应用程序中, 我想上传一个行数未知的csv文件,解析它的内容并显示解析后的数据,而不是操纵这些数据并将其保存在表格中。
实现这一目标的最佳方法是什么?
目前我有一个用于上传文件的视图和表单,
我的第一次尝试是在该视图中解析上传的文件,并将解析后的数据发送到第二个视图:
def UploadFileView(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
upload_list = handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect(reverse('preview_file', ?????))
else:
form = UploadFileForm()
return render(request, 'upload_file.html', {'form': form,})
upload_list - 描述文件中一行的对象列表 ????? - 为了将列表发送到第二个视图,放在这里的内容是什么?
据我所知,我需要以某种方式序列化此列表,以便能够将其发送到第二个视图,即 preview_file 。
csv文件的行数未知,可以是3,10或500.
在发布此问题时,我想到了另一种选择,想知道它是否可能,以及它是否是更好的选择:
不要在第一个视图中解析文件,而是将其发送到第二个视图并在该视图中调用 handle_uploaded_file 。
答案 0 :(得分:0)
将列表保存到会话中:
import random
from django.shortcuts import redirect
key = 'preview%s' % random.randint(0, 999999)
request.session[key] = upload_list
return redirect('preview_file', key)
在prefiew_file()
:
from django.http import Http404
def preview_file(request, key):
upload_list = request.session.get(key)
if not upload_list:
raise Http404
更新:会话大小限制取决于使用的SESSION_ENGINE。默认的django.contrib.sessions.backends.db
引擎将会话数据存储在数据库TEXT
字段中。对于Postgres / SQLite,此类字段最多可包含1Gb的数据。对于MySQL,限制为64Kb。
答案 1 :(得分:0)
你可以使用Django formsets(https://docs.djangoproject.com/en/dev/topics/forms/formsets/)。 formset是同一表单的实例的集合。您可以定义一个表单,显示CSV文件的一行内容,并为其创建一个表单集,以便能够显示整个文件。
在下面的示例中,我使用以下CSV文件:
Name,Email
Bob,bob@example.com
Alice,alice@example.com
表示此数据的表单可能如下(非常简化):
class PersonForm(forms.Form):
name = forms.CharField()
email = forms.EmailField()
要为此创建表单集,请执行以下操作:
PersonFormSet = formset_factory(PersonForm)
要填充表单集,您应该设置初始数据。您可以在视图中实例化表单时执行此操作:
def some_view(request):
# ....
form = PersonFormSet(
initial=[
{'name': "Bob", 'email': "bob@example.com"},
{'name': "Alice", 'email': "alice@example.com"},
]
)
或者,使用基于类的视图:
class SomeView(FormView):
form_class = PersonFormSet
def get_initial(self):
return [
{'name': "Bob", 'email': "bob@example.com"},
{'name': "Alice", 'email': "alice@example.com"},
]
如您所见,dicts列表就足够了,您需要对CSV数据进行最少的操作。
剩下的挑战是获取表格中的数据。这里有几种方法,但我建议您在同一视图中处理所有内容或保存文件并传递文件名(尽管后者可能会产生安全隐患)。