【问题标题】:Model Formset overwrites existing entries instead of adding模型 Formset 覆盖现有条目而不是添加
【发布时间】: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


    【解决方案1】:

    The answer is in the docs:

    默认情况下,当您创建表单集时 从模型中,表单集将使用 包含所有对象的查询集 模型(例如, 作者.objects.all())。你可以 通过使用 查询集参数

    只需使用 ObjectName.objects.none()

    奇怪的默认行为,但就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-04
      • 2013-03-16
      • 2021-09-18
      • 2012-05-26
      • 1970-01-01
      • 2012-03-31
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多