django - 修改 Django 表单集中的一个表单实例?

标签 django forms django-forms

我有一个 Django 表单集,在其中呈现表单的四个实例。表单集中的每个表单都有两个字段,但我希望最后一个(第四个)实例仅显示/输入一个字段。我该如何做到这一点,或者有更好的方法吗?我尝试将表单集限制为三个字段,并使第四个实例成为其自己的表单,但我需要根据表单集中的 field1 字段验证该 field1 。我不知道如何根据同时提交的表单集验证表单。

View .py:

FormSet = formset_factory(MyForm, formset=BaseMyFormSet, extra=4)

.html:

<form action="" method="post">{% csrf_token %}
    {{ formset.management_form }}
    {{ formset.non_form_errors }}
    <div>
    {% for form in formset %}
        {% for field in form %}
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        {% endfor %}
    {% endfor %}
    </div>
    <p><input type="submit" value="Submit" /></p>
</form>

表单集在 forms.py 中有两个字段:

class MyForm(forms.Form):
    # field1
    # field2

如何使表单集中的前三个表单具有两个字段,但最后一个仅包含 field1

最佳答案

尝试显式删除views.py中最后一个表单的字段:

def view_func(request):
    FormSet = formset_factory(MyForm, formset=BaseMyFormSet, extra=4)
    if request.method == 'POST':
        formset = FormSet(request.POST, request.FILES)

        # assuming this is a required field for the other forms
        formset.forms[-1].fields['field2'].required = False

        if formset.is_valid():
            ...
    else:
        formset = FormSet()

    del formset.forms[-1].fields['field2']
    return render(request, 'form.html', {'formset': formset})

任何进一步的调整取决于您的表单和验证逻辑。 BaseMyFormSet.clean()formset-wide validation 的适当位置听起来您已经有代码可以跨表单比较 field1

(从纯粹的意义上来说,让 FormSet 类完全处理这个问题可能会更好,但这更容易。FormSet 代码相当复杂。重写 BaseFormSet.forms() 是有意义的,但使用 @ cached_property 位,您所涉及的实现细节最好留给 Django。)

关于django - 修改 Django 表单集中的一个表单实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22330431/

相关文章:

python - 我如何在 Django 中实现合并查询?

python - Django 中的 Zeromq PUSH/PULL

java - 使用 Java (Netbeans) 中的另一个表单中的数据填充一个表单

javascript - 使用 Web API 将实体列表填充到 HTML 页面加载的下拉列表中

forms - JQgrid:从寻呼机获取操作

python - 如何使用 get_object_or_404 和 order_by ('?' ) 来获取随机图像

django - 如何在 django-admin 和 django-form 中为 SelectMultiple 小部件使用 ModelMultipleChoiceField

Django 管理员 : Edit model field with 'editable=False'

python - Django 多对多关系(类别)

python - django 使用 ModelMultipleChoiceField 和 CheckboxSelectMultiple() 小部件以表单呈现初始值