无法从inlineformset_factory创建模型及其子项

时间:2011-11-21 14:20:40

标签: python django

我有一个文件上传模型,如下所示:

class UploadedFile(models.Model):
   fpath = models.FileField(...)
   sig   = models.CharField(max_length=32) # for md5 of data, computed with post_save

我还有另一个名为MTest的模型:

class MTest(models.Model):
  file1 = models.ForeignKey("UploadedFile",related_name="first_file")
  file2 = models.ForeignKey("UploadedFile",related_name="second_file")
  ... # other fields here

我想为MTest显示一个表单,我希望允许用户在一步中执行文件上传。根据我的阅读herehere,我有这个:

def x_attachment_t(request):
    c = {}

    MTestFormset = inlineformset_factory(UploadedFile, MTest, fk_name="file1",extra=1)

    c.update({"formset":MTestFormset})
    return render_to_response("form.html",c,context_instance=RequestContext(request))

问题是,我仍然为文件上传字段预先填充了数据,而我只有第二个文件的选择框。这是模板中的代码:

    {% for form in formset.forms %}
        <div class="span-21 last">
            {% for field in form %}
                <font color="red">{{ field.errors }}</font>
                <div class="span-4">{{ field.label_tag }}</div>
                <div class="span-17">{{ field }}</div>
            {% endfor %}
        </div>
    {% endfor %}

现在,我被阻止,我不知道如何继续。我将不胜感激任何帮助:)

1 个答案:

答案 0 :(得分:3)

你的方法不太对劲。内联formset是一种“编辑链接到同一MTest的多个UploadedFile”的模式。

我会为UploadedFileMtest创建一个模型表单。从file1中排除file2MtestModelForm字段。使用prefix参数将两个上传的文件表单和MtestModelForm放在同一个html <form>标记中。

然后在您看来,如果所有三种表单都有效,请使用MtestModelForm保存commit=False,并在保存到数据库之前更新file1file2。< / p>

这是视图的骨架

def my_view(request):
    if request.method == "POST"
        file1_form = UploadedFileForm(request.POST, request.FILES, prefix="file1")
        file2_form = UploadedFileForm(request.POST, request.FILES, prefix="file2")
        mtest_form = MTestForm(data=request.POST, prefix="mtest")
        if mtest_form.is_valid() and file1_form.is_valid and file2_form.is_valid():
            file1 = file1_form.save()
            file2 = file2_form.save()
            mtest = mtest_form.save(commit=False)
            mtest.file1 = file1
            mtest.file2 = file2
            mtest.save()
            return HttpResponseRedirect("/success-url/")
        # case for invalid form data or GET request omitted