Tôi biết đó là một câu hỏi cũ, nhưng tôi đã gặp sự cố tương tự và đã tìm ra cách giải quyết:
Tôi đã học các lớp sau:
class CommonInfo(models.Model):
image = models.ImageField(blank=True, null=True, default="")
class Meta:
abstract = True
class Year(CommonInfo):
year = models.IntegerField()
Nhưng tôi muốn trường hình ảnh kế thừa của Năm được yêu cầu trong khi vẫn giữ trường hình ảnh của lớp cha có giá trị rỗng. Cuối cùng, tôi đã sử dụng ModelForms để thực thi hình ảnh ở giai đoạn xác thực:
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
Có vẻ như điều này chỉ có thể áp dụng cho một số trường hợp (chắc chắn là nơi bạn cần thực thi các quy tắc chặt chẽ hơn trên trường lớp con).
Ngoài ra, bạn có thể sử dụng clean_<fieldname>()
phương pháp này thay vì clean()
, ví dụ: nếu một trường town
sẽ được yêu cầu điền vào:
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