Saya tahu ini pertanyaan lama, tetapi saya memiliki masalah serupa dan menemukan solusi:
Saya memiliki kelas-kelas berikut:
class CommonInfo(models.Model):
image = models.ImageField(blank=True, null=True, default="")
class Meta:
abstract = True
class Year(CommonInfo):
year = models.IntegerField()
Tapi saya ingin bidang gambar warisan Tahun menjadi diperlukan sambil menjaga bidang gambar dari superclass nullable. Pada akhirnya saya menggunakan ModelForms untuk menegakkan gambar pada tahap validasi:
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
Tampaknya ini hanya berlaku untuk beberapa situasi (tentunya di mana Anda perlu menegakkan aturan yang lebih ketat di bidang subclass).
Alternatifnya, Anda dapat menggunakan clean_<fieldname>()
metode ini sebagai ganti clean()
, misalnya jika suatu bidang town
akan diminta untuk diisi:
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