Форма Django, использующая model_formset, не отправляется
Я пытаюсь создать экран для отображения всех пользователей в моем приложении, а затем иметь возможность обновлять отображаемые поля для пользователей. По сути, это администраторское представление пользователей. Я хотел бы иметь возможность обновлять несколько пользователей одновременно, нажимая кнопку submit.
Для этого я использовал modelformsets, а также скопировал html из ответа на другой вопрос, чтобы формы отображались в линию (см. ниже).
Html шаблон:
<div class="card-body">
<form action="{% url 'bugtracker:users' %}" method='POST'>
<table id="formset" class="form">
{{ formset.non_form_errors.as_ul }}
{{ formset.management_data }}
{% csrf_token %}
{% for form in formset.forms %}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<button class="btn btn-primary" type="submit">Submit</button>
</form>
</div>
Вид:
@login_required
def users(request):
# users = User.objects.all()
UserFormSet = modelformset_factory(User,fields=('username','first_name','last_name','email','is_contributor','is_projectmanager','is_administrator'), extra=0)
if request.method == 'POST':
formset = UserFormSet(request.POST or None)
print(formset)
if formset.is_valid():
formset.save(commit=True)
messages.success(request,f"save successfull")
return HttpResponseRedirect(reverse("bugtracker:users"))
else:
print("error")
for form in formset:
print(form.cleaned_data)
messages.success(request,f"error")
return HttpResponseRedirect(reverse("bugtracker:users"))
formset = UserFormSet()
context = {
# 'users':users,
'formset':formset,
}
return render(request, 'bugtracker_app/users.html', context)
Я обнаружил, что форма не действительна и поэтому не сохраняется. form.clean_data выглядит следующим образом:
<tr><td colspan="2"><ul class="errorlist nonfield"><li>(Hidden field TOTAL_FORMS) This field is required.</li><li>(Hidden field INITIAL_FORMS) This field
is required.</li></ul><input type="hidden" name="form-TOTAL_FORMS" id="id_form-TOTAL_FORMS"><input type="hidden" name="form-INITIAL_FORMS" id="id_form-INITIAL_FORMS"><input type="hidden" name="form-MIN_NUM_FORMS" id="id_form-MIN_NUM_FORMS"><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS"></td></tr>
Это мой первый опыт работы с модельными наборами форм или наборами форм вообще. Не мог бы кто-нибудь сказать мне, почему моя форма не сохраняется должным образом, и как я могу изменить свой код, чтобы сохранить форму моей таблицы, но при этом сохранить все записи при нажатии кнопки submit?
Я нашел ответ:
В шаблоне я набрал {{ formset.management_data }}
, который должен был быть {{ formset.management_form }}
. Документация, которую я использовал, находится здесь
Мне также пришлось переместить {{ formset.management_form }}
в теги таблицы.
Полный рабочий HTML здесь:
<form action="{% url 'bugtracker:users' %}" method='POST'>
<table id="formset" class="form">
{{ formset.management_form }}
{{ formset.non_form_errors.as_ul }}
{% csrf_token %}
{% for form in formset.forms %}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<button class="btn btn-primary" type="submit">Submit</button>
</form>