在帖子中返回的Django Formset中,所有表单都显示所有更改的字段,即使没有 [英] In a Django Formset being returned in a Post, all Forms are showing all fields changed even though none have

查看:63
本文介绍了在帖子中返回的Django Formset中,所有表单都显示所有更改的字段,即使没有的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是基于模型的表单:

from django import forms


class MeasureForm(forms.Form):
    name = forms.CharField(max_length=15)
    description = forms.CharField(max_length=100)
    datatype = forms.CharField(max_length=20)
    uom = forms.Char

从基于非模型的视图填充:

Populated from a non-model based view:

def define_measures(request):
    measureformset = formset_factory(MeasureForm, extra=2)
    if request.method == 'POST': # If the form has been submitted...
        formset = measureformset(request.POST ) # A form bound to the POST data
        if formset.is_valid(): # All validation rules pass
            for form in formset:
                print form.changed_data
            return HttpResponseRedirect('/viscas/measures') # Redirect after POST
    else:


        measures = cass.get_all_measures()

        list_dict =[]
        for measure in measures:
            list_dict.append({'name': measure.name, 'description': measure.description, 'datatype': measure.datatype, 'uom': measure.uom})

        formset = measureformset(initial=list_dict)

    return render(request, 'viscas/measure.html', {
        'formset': formset,
    })

在模板中手动呈现:

{% extends "base.html" %}
{% block content %}
    <body>
    <div class="container">
        <form action="{% url 'viscas:define_measures' %}" method="post">
            {% csrf_token %}
            <div>
                <table class="table table-hover" name="poi" id="tagTable">
                    <thead>
                    <tr>
                        <th>UOM</th>
                        <th>Description</th>
                        <th>Datatype</th>
                        <th>UOM</th>
                    </tr>
                    </thead>
                    {% for form in formset %}
                        <tr>
                            <td>{{ form.name }}</td>
                            <td>{{ form.description }}</td>
                            <td>{{ form.datatype }}</td>
                            <td>{{ form.uom }}</td>
                            {% if form.errors %}
                                <tr>
                                    <td>{{ form.errors }}</td>
                                </tr>{% endif %}
                        </tr>
                    {% endfor %}
                </table>
                {{ formset.management_form }}
            </div>
            <p></p><input type="submit" value="Submit"/></p>
        </form>
    </div>
    </body>

{% endblock %}

页面显示精美,如果我在网页上没有任何更改的帖子,每种形式都显示所有更改的字段(除了两个额外的字段,它们又变回空白)。

The page displays beautifully, put if I post with no change whatsoever on the web-page, each form is showing all fields changed (except the two extra which come back blank).

此代码:

if request.method == 'POST': # If the form has been submitted...
    formset = measureformset(request.POST ) # A form bound to the POST data
    if formset.is_valid(): # All validation rules pass
        for form in formset:
            print form.changed_data

我得到以下输出:

['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
['name', 'description', 'datatype', 'uom']
[]
[]


推荐答案

我认为您的解决方案非常简单。只需在模板中的 {%for formset%}中的 {{formset.management_form}} 中添加模板即可。

I think your solution is rather simple. Just add {{ formset.management_form }} above {% for form in formset %} in your template. It's required to set up any formset in a template.

有关详细信息,请参见 Django表单集页面

For more detail see the Django formset page.

这篇关于在帖子中返回的Django Formset中,所有表单都显示所有更改的字段,即使没有的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆