【问题标题】:In a Django Formset being returned in a Post, all Forms are showing all fields changed even though none have在帖子中返回的 Django Formset 中,所有表单都显示所有字段都已更改,即使没有
【发布时间】:2014-02-06 02:55:06
【问题描述】:

这是一个非基于模型的表单:

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

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

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 %}

页面显示得很漂亮,如果我在网页上发布没有任何更改,每个表单都会显示所有更改的字段(除了两个额外的返回空白)。

从此代码:

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']
[]
[]

【问题讨论】:

    标签: django forms django-forms django-views formset


    【解决方案1】:

    我认为您的解决方案相当简单。只需在模板中的 {% for form in formset %} 上方添加 {{ formset.management_form }}。需要在模板中设置任何表单集。

    更多详情请参阅Django formset page

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 2015-05-25
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2014-02-07
      • 2012-07-29
      相关资源
      最近更新 更多