В Django я пытаюсь использовать фабрику встроенных форм, чтобы пользователь мог редактировать экземпляры модели, связанные с родительской моделью, с помощью внешней клавиши. По какой-то причине методы, которые я пробую, не сохраняют изменения, которые я делаю, когда нажимаю на кнопку отправить.
Мой взгляд такой (не включая визуализацию):
def edit_sets(request, exercisegroup_id):
exercisename = ExerciseName.objects.get(pk=exercisegroup_id)
SetLoggerFormSet = inlineformset_factory(ExerciseName, SetLogger, fields=('weight','reps',))
formset = SetLoggerFormSet(instance=exercisename)
if request.method == 'POST':
formset = SetLoggerFormSet(request.POST, instance=exercisename)
if formset.is_valid():
formset.save()
else:
formset = SetLoggerFormSet(instance=exercisename)
, и я отображаю каждую форму в наборе форм в своем шаблоне, чтобы пользователь мог индивидуально редактировать экземпляр:
<form method="post">{% csrf_token %}
{{ formset.management_form}}
<table>
{% for form in formset %}
{{ form }}
{% endfor %}
</table>
<button type="submit" class="save btn btn-default">Save set</button>
</form>
Задумался, почему это не работает. Форма отображается так, как должна, и этот метод ранее работал для добавления объектов, но я все еще не могу использовать его для замены одного из этих объектов в наборе запросов. Я что-то упускаю, что должен делать по-другому?
Редактировать:
Оказалось, что решение было изменить мою инструкцию request.method на:
if request.method == 'POST':
formset = SetsFormSet(request.POST, instance=exercisename)
for form in formset:
if form.is_valid():
form.save()
Что позволяет мнесохранить каждую форму в наборе форм по отдельности, видя, как я изменяю только часть формы.