【发布时间】:2009-08-19 16:16:37
【问题描述】:
我有一个模型表单集,它应该获取通过 POST 发送的文件并将它们添加到数据库中。
但是,表单包含数据库中已有文件的 ID,这会导致信息被覆盖。例如,表单的 HTML 输出如下所示:
<label for="id_files-0-theFile">File:</label>
<input type="file" name="files-0-theFile" id="id_files-0-theFile" />
<input type="hidden" name="files-0-id" value="1" id="id_files-0-id" />
.... and so on, for each entry form 0 .. 10
第三行——files-0-id——是我认为导致覆盖的原因,但我不知道如何解决这个问题。我希望系统为每次提交创建新的文件对象,而不是使用现有的 ID。
我的模板打印表单信息如下:
<form action=... >
{{ fileform.management_form }}
{% for form in fileform.forms %}
{{ form.as_p }}
{% endfor %}
</form>
而模型、表单、视图的相关部分是:
class File(models.Model):
theFile = models.FileField("File", upload_to='files/%Y/%m/%d')
entry = models.ForeignKey(Entry)
size = models.CharField(blank=True, max_length=100)
name = models.CharField(blank=True, max_length=150)
class FileForm(forms.ModelForm):
class Meta:
model = File
exclude = ('entry', 'size')
def add(request):
FileFormSetFactory = modelformset_factory(File, form=FileForm, extra=8,
exclude=file_forms_excludes,)
file_formset = FileFormSetFactory(prefix='files')
if request.method == 'POST':
file_formset = FileFormSetFactory(request.POST, request.FILES,
prefix='files')
if file_formset.is_valid():
for f in file_formset.save(commit=False):
f.name = f.theFile.name.split("/")[-1]
f.size = convert_bytes(f.theFile.size)
f.entry = entry #primary key to another object, removed for clarity
f.save()
...
return HttpResponseRedirect('/doc/' + str(entry.id))
else:
context = {}
context['fileform'] = file_formset
context['entryform'] = entry_form
context['entities'] = entities()
return render_to_response('add.html', context)
【问题讨论】:
标签: django django-forms