У меня есть Model Formset, который должен принимать файлы, отправленные через POST, и добавлять их в базу данных.
Однако форма включает в себя идентификаторы файлов, уже находящихся в базе данных, что приводит к перезаписи информации. Например, вывод 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 для каждой отправки, а не использовала существующие идентификаторы.
Мой шаблон печатает информацию о форме примерно так:
<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)