我有一个Model Formset,它应该通过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
- 是我认为会导致覆盖,但我不知道如何解决这个问题。我希望系统为每个提交创建新的File对象,而不是使用现有的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)
答案 0 :(得分:1)
默认情况下,创建表单集时 从模型中,formset将使用a 包含所有对象的queryset 模型(例如, Author.objects.all())。您可以 使用。覆盖此行为 queryset参数
只需使用ObjectName.objects.none()
奇怪的默认行为,但你去了。