В наборе форм Django, возвращаемом в сообщении, все формы показывают, что все поля изменены, хотя ни одно из них не имеет
Это не основанная на модели форма:
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']
[]
[]
1 ответ
Я думаю, что ваше решение довольно простое. Просто добавь {{ formset.management_form }}
выше {% for form in formset %}
в вашем шаблоне. Требуется настроить любой набор форм в шаблоне.
Для более подробной информации смотрите страницу формы Django.