【问题标题】:Model Formset - By Default model formset is rendering one extra field (2 fields in total)模型表单集 - 默认情况下,模型表单集呈现一个额外的字段(总共 2 个字段)
【发布时间】: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'"

【问题讨论】:

    标签: django django-models django-forms formset inline-formset


    【解决方案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。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2015-09-26
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多