我正在使用Django表单,并希望允许用户上传学生的CSV文件,执行一些服务器端验证,并在将数据提交到数据库之前预览他们的数据。我有一个关于Django式最常用的方法的问题。
我的代码目前如下:
def import_pupils(request):
if request.method == 'POST':
form = PupilUploadForm(request.POST, request.FILES)
if form.is_valid():
data = csv.DictReader(request.FILES['file_upload'])
# Check for non-form errors - e.g. pupils not found in
# our existing database. Clean data and create master list.
pupils = ....
# Show preview page and/or warning messages... on a new page?
return render_to_response('preview_data.html',
{ pupils : pupils, warning_messages: messages },
context_instance = RequestContext(request))
else:
form = PupilUploadForm(request.POST)
else:
form = PupilUploadForm()
return render_to_response('pupil_upload.html', locals(), context_instance=RequestContext(request))
如果没有错误,我的预览页面preview_data.html
会显示一个数据表,所有这些都打包在pupils
中。我的下一步是添加一个链接/按钮将所有这些保存到数据库。我将用于添加数据的代码是:
for pupil in pupils:
Pupil.objects.get_or_create(pupil=pupil['name'], teacher=pupil['teacher'])
我的问题基本上是:那条线应该去哪里?什么是Django式的方式来处理这个问题?我的数据已全部打包在pupils
列表中,我只想get_or_create
,但我应该使用指向新视图功能的链接,preview_data.html
上的新表单。 ..?将数据传递到新页面然后重新导入它似乎效率低下。
答案 0 :(得分:0)
我建议将其分为两个步骤:
首先,将上传的文件保存到某个临时位置,然后执行 验证并显示数据(包括任何验证 误差)
如果用户选择保存文件,请从中导入记录 已上传文件并保存到数据库,然后删除 文件
如果您不想使用临时文件,则可以创建临时表,并在其中导入记录。然后,将它们复制到实际表中(如果用户接受)或删除它们。