Допустим, мы конструируем FormSet таким образом (обратите внимание на formset=...):
ConductingClazzRequestMorePersonFormSet = inlineformset_factory(ConductingClazzRequest, ConductingClazzRequestPerson, extra=1, formset=ConductingClazzRequestPersonFormsetBase, form=ConductingClazzRequestPersonForm)
Использовать понятно как во вьюшках:
formset = ConductingClazzRequestMorePersonFormSet(request.POST, instance=ccrequest)
Теперь осталось написать ConductingClazzRequestPersonFormsetBase, чтобы она при валидации проверяла количество форм. Здесь я проверяю, что есть как минимум один контакт. Надо учесть всякие удаляемые налету формы итд, чтобы не было сюрпризов в сложных случаях. А у меня таковые возникли, покуда конечный такой вид не состряпал (если не ошибаюсь, часть решения на SO нашёл):
class ConductingClazzRequestPersonFormsetBase(forms.models.BaseInlineFormSet): def clean(self): super(ConductingClazzRequestPersonFormsetBase, self).clean() initial_num = len(filter(lambda f: not self._should_delete_form(f), self.initial_forms)) extra_num = len(filter(lambda f: f.has_changed() and not self._should_delete_form(f), self.extra_forms)) if initial_num + extra_num < 1: raise ValidationError(_(u'request should be at least one person'))Это всё прекрасно работает и в админке, надо только указать formset для Inline соответствующей МодельAdmin.
class ConductingClazzRequestPersonInline(admin.TabularInline): model = ConductingClazzRequestPerson extra = 1 formset = ConductingClazzRequestMorePersonFormSet
Комментариев нет:
Отправить комментарий