我有一个formset,我在视图中初始化它。表单的一个字段是FileField。我必须向用户显示他/她以前的文件名的名称。因为我无法初始化FileField,我想在列表中发送文件名。 (我的意思是,例如当你有一个Charfield时,你可以在视图中初始化它,当你渲染到模板时,你会看到一个填充了这些数据的输入,但是当你有文件上传字段时,你无法在视图中填充它发送到模板)。我不知道如何在formset和list中同时循环表单。另一件事是当我在formset中初始化表单并渲染到模板时(我的意思是例如写data['form-0-Team']='team1'
但我不能写data['form-0-Team']='a.png'
,所以当我渲染到模板时,我看到名为'的字段团队'被填充(值= team1),名为'File'的字段未填充,并显示错误'thid field is required'id。)虽然这是我第一次访问此页面而我的方法不是POST。 (当用户点击提交时会显示USUALLY表单错误,并且在视图中它会检查request.method =='POST',然后检查form.is_valid,它是否返回模板并显示错误,但在我的情况下,它显示错误euser第一次访问该页面并在他/她发布数据之前)。
我希望我能说出我的问题。你能指导我解决这个问题吗?非常感谢。
def myFunc(request):
flagFormSet = formset_factory(FlagFileBaseForm)
if request.method == 'POST':
formset = flagFormSet(request.POST, request.FILES)
if formset.is_valid():
# do s.th
else:
data = {
'form-TOTAL_FORMS': 5,
'form-INITIAL_FORMS': u'0',
'form-MAX_NUM_FORMS': u'',
# add initial form data to it
}
list=['a.png', 'b.png', 'c.png', 'd.png' , 'f.png']
formset = flagFormSet(data)
return render_to_response('myPage.html', RequestContext(request, { 'formset': formset, 'list':list}))
和我的模板:
<form method="post" action="" enctype="multipart/form-data">
{{ formset.management_form }}
{% for form in formset.forms %}
<div class="form">
<div class="form-row Team">
<div>
<label class="required" for="id_Team">Team:</label>
{{ form.Team }}
{{ form.Team.errors }}
</div>
</div>
<div class="form-row File">
<div>
<label class="required" for="id_File">File:</label>
{{ form.File }}
{{ form.File.errors }}
</div>
#here i want show the name of previous file
</div>
</div>
{% endfor %}
</form>
编辑: 当前结果(请求不发布,显示错误)
期望的结果(表单没有文件名错误)
答案 0 :(得分:1)
在Django模板中,如果您尝试呈现具有FileField的表单。您必须通过替换
<form method="post" action="">
带
<form method="POST" enctype="multipart/form-data">
https://docs.djangoproject.com/en/dev/ref/forms/api/#binding-uploaded-files-to-a-form
答案 1 :(得分:0)
我担心我真的不明白你的问题,如果这没有帮助就道歉......
如果您的列表是任意的(从您的问题看起来是这样),那么您可以使用内置forloop counter的django来构建您的文件名 -
{% for form in formset %}
{{ form }}
<input type="text" name="file_name" value="{% forloop.counter %}.png">
{% endfor %}
或者看看python的zip function。您可以使用它来构建包含名称和表单的对象,并将其传递给模板。