Este é util para quando, por exemplo, iremos inserir um conteúdo com múltiplas fotos, sendo que cada foto possui uma legenda.
Para tal, não precisamos disponibilizar o admin de Fotos, visto que não tem sentido nenhum o usuario inserir uma foto, fora de algum conteúdo.
Até aqui tudo tranquilo e o inline fica assim:
from django import forms
from models import Foto, Conteudo
class FotoInline(admin.TabularInline):
model = Foto
extra = 0
class ConteudoAdmin(admin.ModelAdmin):
inlines = [
FotoInline
]
Desta forma o django cria os inlines dentro do conteudo para inserir quantas fotos quiser.
E se, nosso layout obrigasse o conteúdo a ter pelo menos uma foto? Não precisa socar o designer a seu lado não, nem muito menos colocar campos obrigatórios de foto e legenda no model de Conteúdo, basta utilizar um formset:
class Verifica_FK_Formset(forms.models.BaseInlineFormSet):
def is_valid(self):
return super(Verifica_FK_Formset, self).is_valid() # and not any([bool(e) for e in self.errors])
def clean(self):
count = 0
for form in self.forms:
try:
if form.cleaned_data and not form.cleaned_data.get('DELETE', False):
count += 1
except AttributeError:
pass
if count < 1:
raise forms.ValidationError('Inclua pelo menos uma linha de %s' % (self.model._meta.verbose_name,))
E alterar o seu inline para que fique da seguinte forma:
class FotoInline(admin.TabularInline):
formset = Verifica_FK_Formset
model = Foto
extra = 0
Desta forma, ao menos um item do inline de Fotos deverá ser inserido quando for inserir e/ou alterar um Conteúdo.
hasta!
Nenhum comentário:
Postar um comentário