模型表单集 - 默认情况下,模型表单集呈现一个额外的字段(总共 2 个字段)

Posted

技术标签:

【中文标题】模型表单集 - 默认情况下,模型表单集呈现一个额外的字段(总共 2 个字段)【英文标题】:Model Formset - By Default model formset is rendering one extra field (2 fields in total) 【发布时间】:2015-10-24 18:43:15 【问题描述】:

我的模型表单集甚至没有在 modelformset_factory 中定义“额外”参数,正在渲染模板中的一个额外字段。我尝试了很多变化,但没有奏效。如果我在命令行上打印表单(模型表单),它只会根据需要打印一个表单字段,但在模型表单集上它默认打印 2。

这是我的代码。

models.py

class Direction(models.Model):
    text = models.TextField(blank=True, verbose_name='Direction|text')

forms.py

class DirectionForm(forms.ModelForm):
    class Meta:
        model = Direction
        fields = ['text',]

views.py

def myview(request):
    Dirset = modelformset_factory(Direction, form=DirectionForm)
    if request.method == "POST":
        dir_formset = Dirset(request.POST or None)
        if dir_formset.is_valid():
        for direction in dir_formset:
            text = direction.cleaned_data.get('text')
            Direction.objects.create(text=text)
return render(request, "test/test.html", 'DirFormSet':Dirset)     

模板

% block content %
<form method="POST">% csrf_token %
<div id="forms">
    DirFormSet.management_form
    % for form in DirFormSet %
        form.text
        % if error in form.text.errors %
            error|escape
        % endif %
    % endfor %
</div>
<button id="add-another">add another</button>

<input type="submit" />
</form>

% endblock %

附带说明,如果我在此表单上提交数据,则会出现以下错误。 错误

Exception Type: MultiValueDictKeyError
Exception Value:"u'form-0-id'"

【问题讨论】:

【参考方案1】:

默认情况下,modelformset_factory 会创建一个额外的表单。如果您不想要任何额外的表格,请设置extra=0

Dirset = modelformset_factory(Direction, form=DirectionForm, extra=0)

KeyError 是因为您没有在模板中包含表单的 id 字段。你应该有类似的东西:

% for form in dir_formset %
     form.id 
     form.text 
    ...
% endfor %

请注意,您应该在渲染模板时传递表单集实例dir_formset,而不是类DirFormSet。你的视图应该是这样的

return render(request, "test/test.html", 'dir_formset': dir_formset)     

那么模板应该更新为使用dir_formset 而不是DirFormSet

【讨论】:

我之前尝试过 extra=0 并且效果很好,但在文档中没有找到。你能给我参考一下文档吗? docs.djangoproject.com/en/1.8/topics/forms/modelforms/… 我在上面链接到的modelformset_factory 文档显示额外的默认值为一个。另请参阅常规 formsets 的文档。 Here is a similar question 我遇到了麻烦(未来的读者可能会觉得有用)

以上是关于模型表单集 - 默认情况下,模型表单集呈现一个额外的字段(总共 2 个字段)的主要内容,如果未能解决你的问题,请参考以下文章

Django模型表单集显示数据库数据而不是空表单集

Django - 使用表单集在不通过表的情况下建立 2 个模型之间的多对多关系

默认情况下折叠节点表单上的分类字段集

Django:将字段添加到模型表单集

Django 发票模型表单集

带有来自模型的额外信息的 Django 渲染单选按钮选项