Как удалить объекты модели с помощью встроенного набора форм в Django - PullRequest
1 голос
/ 17 октября 2019

В Django я пытаюсь использовать встроенную фабрику наборов форм, чтобы пользователь мог редактировать и удалять экземпляры модели, связанные с родительской моделью, через чужую клавишуПо какой-то причине методы, которые я пытаюсь использовать, позволяют мне редактировать объекты, но когда я нажимаю флажок удаления, объект не удаляется. Он также не отображает никаких сообщений об ошибках, даже когда я использую formset.errors или formset.non_form_errors.

Модели:

class ExerciseName(models.Model):
    muscle_group = models.ForeignKey(MuscleGroup, on_delete = models.CASCADE)
    name_of_exercise = models.CharField(max_length=100, default = 'Exercise name', unique=True)


    def __str__(self):
        return self.name_of_exercise


class SetLogger(models.Model):

    weight = models.IntegerField(default=0)
    reps = models.IntegerField(default=0)
    date = models.DateField(default=datetime.date.today)
    exercisegroup = models.ForeignKey(ExerciseName, on_delete = models.CASCADE)

Содержимое в представлении, которое я использую (не включая визуализацию):

    exercisename = ExerciseName.objects.get(pk=exercisegroup_id)
    SetsFormSet = inlineformset_factory(ExerciseName, SetLogger, fields=('weight','reps',), can_delete=True)

    formset = SetsFormSet(instance=exercisename)

    sets = SetLogger.objects.filter(exercisegroup=exercisename)

    if request.method == 'POST':  
      formset = SetsFormSet(request.POST, instance=exercisename)
      for form in formset:
        if form.is_valid():
           form = form.save(commit=True)
      else:
        formset = SetsFormSet(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>

Этот код показывает флажок удаления рядом с каждой формой, и каждая форма сохраняет, если я изменяю свои данные, но не если я выбираю «удалить». Я что-то упустил, что я должен делать по-другому?

1 Ответ

0 голосов
/ 17 октября 2019

Вы не используете formset.save(commit=True). Я совершенно уверен, что если вы перебираете формы вместо этого, вы получаете только измененные, а не удаленные. Для тех, что вам нужно

for obj in formset.deleted_objects:
    obj.delete()  
    # or the possibility of using that checkbox to select these for other special treatment
...