Depois de bastante tempo de procura, acabei caindo nesta discussão sobre o assunto que me levou a um snippet, um fragmento de código, que resolve o problema. O código a seguir foi obtido aqui. Ele altera o comportamento padrão da classe BaseInlineFormSet que é usada pelo admin para montar seus formulários, fazendo com que obrigue o usuário a salvar ao menos um inline.
Veja:
from django import forms
from django.forms.models import BaseInlineFormSet
from django.utils.translation import ugettext as _
__all__ = ('RequireOneFormSet',)
class RequireOneFormSet(BaseInlineFormSet):
"""Exige que ao menos um formulario do conjunto seja salvo."""
def clean(self):
"""Verifica se ao menos um inline foi salvo."""
super(RequireOneFormSet, self).clean()
for error in self.errors:
if error:
return
inlines = 0
for cleaned_data in self.cleaned_data:
#Percorre todos os inlines sendo salvos.
if cleaned_data and not cleaned_data.get('DELETE', False):
inlines += 1
if inlines < 1:
raise forms.ValidationError( _("At least one %s is required." %
self.model._meta.object_name.lower()) )
Note que podemos mudar o valor na comparação no final para obrigar que mais inlines sejam salvos, ao invés de um só. Bem, agora só faltou responder como utilizar esse código, não é mesmo? É bem simples. Vá até o admin.py onde está a sua classe inline e atribua essa nova classe que criamos ao atributo formset. Desta forma:
class ImagemInline(admin.StackedInline):
model = Imagem
extra = 1
formset = RequireOneFormSet
Pronto! Quando for tentar salvar um objeto no admin que tenha inlines desta classe um erro de validação vai acontecer e exigir que ao menos um inline seja criado. Isso vai evitar que o usuário deixe de salvar informações importantes que os inlines poderiam conter e te salvar de muitas dores de cabeça, como me salvou. ;)
Até a próxima!

Nenhum comentário:
Postar um comentário