Фрагмент трясогузки (Django) со встроенным объектом - Пользовательская проверка для реляционно-зависимых входных данных - PullRequest
0 голосов
/ 01 марта 2019

У меня есть фрагмент трясогузки с моделью, связанной родительским ключом.Я хочу сделать очистку и проверку на основе обеих моделей.Я могу получить доступ к методу clean дочерней модели , как только родитель уже сохранен , но не раньше.Если я попытаюсь применить min_num встроенных объектов, это не позволит сохранить объект.Ошибки, возникающие при методе clean дочерних объектов, не отображают детали на интерфейсе, просто "Фрагмент не может быть сохранен из-за ошибок."

Битиз контекста - я хочу иметь возможность добавлять области к изображениям, которые отображают размытое содержимое при наведении курсора.

Как очистить встроенную модель при доступе к атрибутам из родительской модели, а затем отобразить пользовательские сообщения об ошибках для пользователя?

@register_snippet
class ImageMap(ClusterableModel):
    image = models.ForeignKey(
        'wagtailimages.Image',
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='+',
    ),
    panels = [
        ImageChooserPanel('image'),
        InlinePanel('regions', heading='Hoverable regions', min_num=1, ),
    ]


class ImageRegion(Orderable):
    image_map = ParentalKey('info_site.ImageMap', related_name='regions')
    blurb = RichTextField(max_length=2000)
    left = models.IntegerField()
    top = models.IntegerField()
    right = models.IntegerField()
    bottom = models.IntegerField()
    panels = [
        FieldPanel('blurb'),
        MultiFieldPanel([         
            # This doesn't appear to render as a MultiFieldPanel
            FieldPanel('left'),
            FieldPanel('top'),
            FieldPanel('right'),
            FieldPanel('bottom'),
        ],
)]
    def clean(self):
        super(ImageRegion, self).clean()
        image_width = self.image_map.image.width      # Cannot access parent image_map instance on create
        image_height = self.image_map.image.height
        image_width = self.image_map.image.width
        if any([
            self.top == self.bottom,
            self.top > self.bottom,
            self.top > image_height,
            self.bottom > image_height,
        ]):
            # This ValidationError gets thrown but only error displayed is 
              "The snippet could not be saved due to errors."; 
              Need verbose ValidationError shown
            raise ValidationError(
                'Coordinate top must be less than coordinate bottom; both must be less that image height of %s px' % image_height)
...