Запретите Django сохранять конкретную форму из набора форм

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

Форма:

class WeeksForm(forms.ModelForm):
    monday = forms.DecimalField(required=False)
    tuesday = forms.DecimalField(required=False)
    wednesday = forms.DecimalField(required=False)
    thursday = forms.DecimalField(required=False)
    friday = forms.DecimalField(required=False)
    saturday = forms.DecimalField(required=False)
    sunday = forms.DecimalField(required=False)

    class Meta:
        model = Weeks
        fields = ('activity', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday')

Formset:

WeeksFormset = modelformset_factory(Weeks, form=WeeksForm, extra=10, can_delete=True)

Я динамически генерирую формы с помощью JS, и он автоматически заполняет поле "активность", но проблема в том, что иногда пользователь может решить не заполнять другие поля (те, которые названы днями недели, "понедельник", "вторник" и т.д.). В этом случае я получаю "пустую" форму (на самом деле не пустую, потому что поле "активность" было заполнено), которую я не заинтересован сохранять.

Я пытаюсь как-то предотвратить сохранение этих форм в моем представлении:

views.py

if request.method == 'POST':
        formset = WeeksFormset(request.POST)
        if formset.is_valid():
            for form in formset.forms:
                # From here is pseudocode, I want that if a form has all the weekdays empty that form is not saved
                if form.instance.monday and form.instance.tuesday and ... form.instance.sunday == None:
                    form.delete()
                # End of pseudocode, this approach didn't work

                form.instance.user = request.user 
            formset.save()
            return HttpResponseRedirect(reverse("time")

Я действительно борюсь с этим, я пробовал несколько подходов без успеха.

Просто сохраните формы, которые соответствуют:

if request.method == 'POST':
    formset = WeeksFormset(request.POST)
    if formset.is_valid():
        for form in formset.forms:
            instance = form.instance
            if any(
                f is not None
                for f in [
                    instance.monday,
                    instance.tuesday,
                    instance.wednesday,
                    instance.thursday,
                    instance.friday,
                    instance.saturday,
                    instance.sunday,
                ]
            ):
                instance.user = request.user
                form.save()
        # do *not* save the formset
        return redirect('time')
Вернуться на верх