Daniels Antwort ist ausgezeichnet und es funktionierte für mich auf ein Projekt, aber dann erkannte ich aufgrund der Art und Weise Django Formulare arbeiten, wenn Sie mit can_delete und markieren Sie das Feld löschen beim Speichern, ist es möglich, ohne Aufträge (in diesem Fall) zu validieren.
Ich habe eine Weile versucht, herauszufinden, wie man das verhindern kann. Die erste Situation war einfach - die Formulare, die gelöscht werden sollen, sollten nicht mitgezählt werden. Die zweite Situation war schwieriger... wenn alle die Löschkästchen markiert sind, dann clean
nicht angerufen wurde.
Der Code ist leider nicht ganz einfach. Die clean
Methode wird aufgerufen von full_clean
die aufgerufen wird, wenn die error
Eigenschaft zugegriffen wird. Auf diese Eigenschaft wird nicht zugegriffen, wenn ein Unterformular gelöscht wird, also full_clean
wird nie aufgerufen. Ich bin kein Django-Experte, so dass dies ein schrecklicher Weg, es zu tun sein könnte, aber es scheint zu funktionieren.
Hier ist die geänderte Klasse:
class InvoiceOrderInlineFormset(forms.models.BaseInlineFormSet):
def is_valid(self):
return super(InvoiceOrderInlineFormset, self).is_valid() and \
not any([bool(e) for e in self.errors])
def clean(self):
# get forms that actually have valid data
count = 0
for form in self.forms:
try:
if form.cleaned_data and not form.cleaned_data.get('DELETE', False):
count += 1
except AttributeError:
# annoyingly, if a subform is invalid Django explicity raises
# an AttributeError for cleaned_data
pass
if count < 1:
raise forms.ValidationError('You must have at least one order')