模型Formset会覆盖现有条目而不是添加

时间:2009-08-19 16:16:38

标签: django django-forms

我有一个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)

1 个答案:

答案 0 :(得分:1)

The answer is in the docs:

  

默认情况下,创建表单集时   从模型中,formset将使用a   包含所有对象的queryset   模型(例如,   Author.objects.all())。您可以   使用。覆盖此行为   queryset参数

只需使用ObjectName.objects.none()

奇怪的默认行为,但你去了。