我有一个允许从CSV文件导入的应用程序。 CSV文件中包含库列表。我需要先将它们解析为一个Library实例列表,在另一个页面上显示它们,用户点击“确认”后,这些库就会被保存。
这是我的表格:
class LibCsvForm(forms.Form):
lib_csv = forms.FileField(label='CSV file')
class LibListForm(forms.Form):
def __init__(self, *args, **kwargs):
new_libs = kwargs.pop('new_libs')
super(LibListForm, self).__init__(*args, **kwargs)
self.fields['new_libs'] = new_libs
我的意见:
def import_lib_csv(request):
if request.method == 'POST':
form = LibCsvForm(request.POST, request.FILES)
if form.is_valid():
raw = request.FILES['lib_csv'].read()
new_libs = []
# Process string 'raw' and add instances of Library to new_libs
context = RequestContext(request, {'form': LibListForm(new_libs=new_libs)})
context.update(csrf(request))
return render_to_response('master/library.csv.confirm.html', context)
else:
form = LibCsvForm()
variables = RequestContext(request, { 'form': form })
return render_to_response('master/library.csv.html', variables)
LibCsvForm仅供用户上传文件。方法“import_lib_csv”是读取文件,创建实例,并将它们传递给另一个只包含'new_libs'的表单LibListForm。用户点击“确认”后,我想获取此列表并保存对象。
问题在于,在模板中:
{{ form.new_libs }}
{% for lib in new_libs %}
{{ lib.id }}
{% endfor %}
它没有显示任何内容。我想我没有正确地将'new_libs'传递给表单。有人可以帮忙吗?感谢。
编辑:
谢谢,罗汉。我提到你修改它。现在,库列表可以显示在模板中。 'new_libs'是一个库实例列表。
但是当我点击“确认”时,它会报告错误。这是我保存的方法:
def save_lib_list(request):
if request.POST:
form = LibListForm(request.POST)
print form.cleaned_data['new_libs']
variables = RequestContext(request, {
'lib_list': Library.objects.all()
})
return render_to_response('master/library.list.html', variables)
Django说
"Exception Type: KeyError
Exception Value: 'new_libs' "
我的模板是:
<form method="post" action="/library/savelist/" class="well">
{% csrf_token %}
<legend>Libraries to import</legend>
{% for lib in new_libs %}
{{ lib.id }}
{% endfor %}
</form>
我想我在这里想念一些东西,但不知道如何解决......
解决:
首先将上传的CSV文件的内容保存在服务器上。将此文件的路径设置为LibListForm中的隐藏字段:
tmp_lib_file = forms.CharField(widget=forms.HiddenInput(), initial='tmp.lib')
然后当用户点击“确认”时,再次解析文件并获取库的实例,保存它们。
答案 0 :(得分:1)
如果要在模板中使用new_libs
,则应在模板上下文中添加context = RequestContext(request, {'form': LibListForm(new_libs=new_libs), 'new_libs': new_libs})
。
new_libs
此外,您传递给LibListForm
的{{1}}类型是什么?如果不是正确的字段类型,如果不能正确显示/处理。
问题编辑后更新:
new_fields
中没有form.cleaned_data
个密钥。表单应该有一个具有该名称的字段。 new_field
似乎不是表格字段。 答案 1 :(得分:0)
根本不清楚new_libs
应该是什么,但它似乎根本不是一个表格领域。
表格毫不奇怪,只会显示表单字段。我不太清楚为什么要将这些对象放在表单上:听起来你真的只想在模板上列出它们,并添加一个“确认”按钮。不需要表单类:只需将它们作为实际的任何对象传递给模板,迭代它们,并将确认按钮放在基本的HTML表单中。