Eu sei que é uma pergunta antiga, mas tive um problema semelhante e encontrei uma solução alternativa:
Tive as seguintes aulas:
class CommonInfo(models.Model):
image = models.ImageField(blank=True, null=True, default="")
class Meta:
abstract = True
class Year(CommonInfo):
year = models.IntegerField()
Mas eu queria que o campo de imagem herdado de Year fosse necessário, mantendo o campo de imagem da superclasse anulável. No final, usei ModelForms para impor a imagem na fase de validação:
class YearForm(ModelForm):
class Meta:
model = Year
def clean(self):
if not self.cleaned_data['image'] or len(self.cleaned_data['image'])==0:
raise ValidationError("Please provide an image.")
return self.cleaned_data
admin.py:
class YearAdmin(admin.ModelAdmin):
form = YearForm
Parece que isso só se aplica a algumas situações (certamente onde você precisa impor regras mais rígidas no campo da subclasse).
Como alternativa, você pode usar o clean_<fieldname>()
método em vez de clean()
, por exemplo, se um campo tiver town
que ser preenchido:
def clean_town(self):
town = self.cleaned_data["town"]
if not town or len(town) == 0:
raise forms.ValidationError("Please enter a town")
return town