【问题标题】:loop over forms in formset and a list at same time + FileField required error :django同时循环表单集和列表中的表单+ FileField 需要错误:django
【发布时间】:2026-01-21 03:05:01
【问题描述】:

我有一个表单集,我在视图中对其进行了初始化。表单的字段之一是 FileField。我必须向用户显示他/她以前的文件名的名称。因为我无法初始化 FileField,所以我想在列表中发送文件名。 (我的意思是,例如当你有一个 Charfield 时,你可以在视图中初始化它,当你渲染到模板时,你会看到一个填充了该数据的输入,但是当你有文件上传字段时,你不能在视图中填充它并且发送到模板)。我不知道如何同时循环表单集和列表中的表单。另一件事是当我在表单集中初始化表单并渲染到模板时(我的意思是例如写 data['form-0-Team']='team1' 但我不能写 data['form-0-Team']='a.png' ,所以当我渲染到模板时,我看到名为“团队”的字段已填充(value=team1) 并且名为“文件”的字段未填写,并且显示了错误“需要该字段”ID。)尽管这是我第一次访问此页面,并且我的方法不是 POST。 (通常,当用户单击提交时会显示表单错误,并在视图中检查 request.method == 'POST',然后检查 form.is_valid 是否返回模板并显示错误,但在我的情况下,它在euser 第一次访问该页面并且在他/她发布数据之前)。 我希望我能说出我的问题。你能指导我解决这个问题吗?真的谢谢。

def myFunc(request):
    flagFormSet = formset_factory(FlagFileBaseForm)
    if request.method == 'POST':
        formset = flagFormSet(request.POST, request.FILES)
        if formset.is_valid():
          # do s.th
    else:
         data = {
                    'form-TOTAL_FORMS': 5,
                    'form-INITIAL_FORMS': u'0',
                    'form-MAX_NUM_FORMS': u'',
                    # add initial form data to it
                }
         list=['a.png', 'b.png', 'c.png', 'd.png' , 'f.png']

         formset = flagFormSet(data)
    return render_to_response('myPage.html', RequestContext(request, { 'formset': formset, 'list':list}))

还有我的模板:

<form method="post" action="" enctype="multipart/form-data">
{{ formset.management_form }}
    {% for form in formset.forms %}
        <div class="form">
           <div class="form-row Team">
              <div>
                <label class="required" for="id_Team">Team:</label>
                    {{ form.Team }}
                    {{ form.Team.errors }}
              </div>
           </div>                           
           <div class="form-row File">
               <div>
                  <label class="required" for="id_File">File:</label>
                       {{ form.File }}
                       {{ form.File.errors }}
               </div>

    #here i want show the name of previous file

           </div>
        </div>
    {% endfor %}
</form>

编辑: 当前结果(虽然请求未发布,但显示错误)

期望的结果(格式没有错误的文件名)

【问题讨论】:

  • 我不明白对不起
  • 我认为您可能需要重新编写您的问题。当您说“我无法初始化 FileField”或“当我初始化表单时”时,您是什么意思? “初始”是形容词而不是动词。 (而且由于您在前面的问题中正确使用了“初始化”一词,因此假设这不是您的意思似乎是公平的)。
  • 如果我问的问题不好,我真的很抱歉。我重写它,希望你能理解。非常感谢
  • 您能否只提供一个示例输出,希望在您的模板中显示而不是进行冗长的解释?抱歉,我完全无法理解。
  • 我编辑了我的问题。我希望此时能清楚。谢谢

标签: django django-forms django-templates django-views


【解决方案1】:

在 Django 模板中,如果您尝试呈现具有 FileField 的表单。你必须通过替换

<form method="post" action="">

<form method="POST" enctype="multipart/form-data">

https://docs.djangoproject.com/en/dev/ref/forms/api/#binding-uploaded-files-to-a-form

【讨论】:

  • 是的,真的很抱歉,我在我的项目中使用了这个,我忘了在这个问题中写它。文件上传适合我。
【解决方案2】:

恐怕我不太明白你的问题,如果这没有帮助,请道歉..

如果您的列表是任意的(从您的问题来看),那么您可以使用 django 内置的 forloop counter 来构建您的文件名 -

{% for form in formset %}
    {{ form }}
    <input type="text" name="file_name" value="{% forloop.counter %}.png">
{% endfor %}

或者看看python的zip function。您可以使用它来构建一个包含名称和表单的对象,并将其传递给您的模板。

【讨论】:

  • 我从数据库中填充列表项。在此示例中,我编写了 a.png 和 ... 以使其简单,但实际上我从存储在数据库中的文件名填充列表。抱歉,如果我不能准确地提出我的问题。
  • 非常感谢...您知道在我的情况下,表单集和列表中有表单。我不认为我可以压缩它们,可以吗? :">