Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从inlineformset_工厂创建模型及其子级时遇到问题_Python_Django - Fatal编程技术网

Python 从inlineformset_工厂创建模型及其子级时遇到问题

Python 从inlineformset_工厂创建模型及其子级时遇到问题,python,django,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("Up

我有一个文件上传模型,定义如下:

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显示一个表单,并且我想允许用户在一个步骤中执行文件上传。从我所读到的和所做的,我有以下几点:

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 %}

现在,我被阻止了,我不知道如何继续。我非常感谢您的帮助:

您的方法不太正确。内联表单集是一种模式,用于编辑链接到同一上传文件的多个mtest

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

然后在您的视图中,如果这三个表单都有效,请使用保存MtestModelForm,并在保存到db之前更新file1和file2

这是视图的骨架

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

你在这里的做法不太正确。内联表单集是一种模式,用于编辑链接到同一上传文件的多个mtest

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

然后在您的视图中,如果这三个表单都有效,请使用保存MtestModelForm,并在保存到db之前更新file1和file2

这是视图的骨架

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

在保存到数据库之前更新文件1和文件2是指什么?我需要自己处理关系吗?是的,您显式地设置了file1和file2。我已经用视图的草图更新了我的答案。你能展示一下GET部件的代码吗?我不知道如何设置其中的前缀。它与POST部分相同,但没有任何数据,例如file1\u form=UploadedFileFormprefix=file1更正打字错误的感谢。但是,request.FILES不也应该被传递吗?在保存到数据库之前,更新file1和file2指的是什么?我需要自己处理关系吗?是的,您显式地设置了file1和file2。我已经用视图的草图更新了我的答案。你能展示一下GET部件的代码吗?我不知道如何设置其中的前缀。它与POST部分相同,但没有任何数据,例如file1\u form=UploadedFileFormprefix=file1更正打字错误的感谢。但是,request.FILES不也应该被传递吗?