Запретите 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')