Как редактировать объекты модели в линейном наборе форм в Django - PullRequest
1 голос
/ 15 октября 2019

В 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()

Что позволяет мнесохранить каждую форму в наборе форм по отдельности, видя, как я изменяю только часть формы.

1 Ответ

1 голос
/ 15 октября 2019

Ваш код работает на меня. Возможно, вы изменили настройки среды или что-то еще. Когда вы отправляете форму, появляется ли какая-либо ошибка? Если это так, покажите нам свои данные об ошибке.

Вы можете попробовать вот так:

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:
        print("something is wrong in validation")
        print(formset.errors)
        formset = SetLoggerFormSet(instance=exercisename)
...