Django: проверка формы для формы с табличной строкой - PullRequest
0 голосов
/ 14 ноября 2018

Здравствуйте, у меня есть такие зарегистрированные модели

# models.py
class Property(models.Model):
    address = models.TextField()
    ...

class PropertyImage(models.Model):
    property = models.ForeignKey(Property, related_name='images')
    image = models.ImageField()
    is_front = models.BooleanField(default=False)

и

# admin.py
class PropertyImageInline(admin.TabularInline):
    model = PropertyImage
    extra = 3

class PropertyAdmin(admin.ModelAdmin):
    inlines = [ PropertyImageInline, ]

admin.site.register(Property, PropertyAdmin)

Переднее изображение логическое, поэтому я знаю, какое изображение будет показано в объявлениях

Проблема

Я не знаю, как выполнить проверку, чтобы я мог выдать ошибку. Если в качестве is_front выбрано 0 или более, чем 1 фотография, не могли бы вы помочь мне с проверкой формы администратора?

Спасибо!

1 Ответ

0 голосов
/ 14 ноября 2018

Один из способов сделать это - создать метод clean для PropertyImage, который будет использоваться для проверки данных в администраторе.

from django.core.exceptions import ValidationError

class PropertyImage(models.Model):
    property = models.ForeignKey(Property, related_name='images')
    image = models.ImageField()
    is_front = models.BooleanField(default=False)

    # Clean will only be called within the Admin.
    # If you have other places this needs to be verified,
    # you'll need to call it manually or move this logic into a ModelForm.
    def clean(self):
        images = self.property.images.all()
        # If we're editing, we want to exclude ourselves from the check.
        if self.id:
            images = images.exclude(id=self.id)
        if self.is_front and images.filter(is_front=True).exists():
            raise ValidationError("Only one image can have is_front set.")
...