2009-08-19 43 views
1

我有一个Model Formset,它应该将通过POST发送的文件添加到数据库中。Model Formset覆盖现有条目而不是添加

但是,表单包含数据库中已存在的文件的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

The answer is in the docs:

默认情况下,当你从一个模型创建一个表单集 ,该formset将使用 查询集,其中包括在 所有对象模型(例如, Author.objects.all())。通过使用 的queryset参数

只需使用ObjectName.objects.none()

奇默认行为,您可以 覆盖此行为,但你去那里。

相关问题