У меня есть фрагмент трясогузки с моделью, связанной родительским ключом.Я хочу сделать очистку и проверку на основе обеих моделей.Я могу получить доступ к методу 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)