Ответ Даниэля превосходен, и он работал для меня в одном проекте, но потом я понял, что из-за того, как работают формы Django, если вы используете can_delete и устанавливаете флажок удаления при сохранении, можно проверить без каких-либо заказов (в данном случае).
Я потратил некоторое время, пытаясь понять, как этого избежать. Первая ситуация была простой - не включайте в счет формы, которые будут удалены. Вторая ситуация была хитрее ... если all флажки удаления установлены, то clean
не вызывается.
Код, к сожалению, не совсем простой. Метод clean
вызывается из full_clean
, который вызывается при обращении к свойству error
. Это свойство недоступно при удалении подчиненной формы, поэтому full_clean
никогда не вызывается. Я не эксперт по Django, так что это может быть ужасный способ сделать это, но это похоже на работу.
Вот модифицированный класс:
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')