Daniel réponse est excellente et elle a fonctionné pour moi sur un projet, mais j'ai ensuite réalisé en raison de la façon Django formes de travail, si vous utilisez can_delete et cochez la case supprimer tout enregistrement, il est possible de valider w/o toutes les commandes (dans ce cas).
J'ai passé un certain temps à essayer de comprendre comment faire pour empêcher que cela se produise. La première situation est facile de ne pas inclure les formes qui vont être supprimés dans le comte. La deuxième situation est plus délicat...si tous les supprimer les cases sont cochées, puis clean
n'a pas été appelé.
Le code n'est pas aussi simple que cela, malheureusement. L' clean
méthode est appelée à partir d' full_clean
qui est appelée lorsque l' error
de la propriété est accessible. Cette propriété n'est pas accessible lorsqu'un sous-formulaire est supprimé, de sorte full_clean
n'est jamais appelée. Je ne suis pas un Django d'experts, donc cela pourrait être une terrible façon de le faire, mais il semble fonctionner.
Voici la modification de la classe:
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')