删除页面后如何自动删除链接到页面的图像?

问题描述

我有一个带有此模型的Annonce页面

class AnnoncePage(Page):
    date = models.DateField("Date de publication",blank=True,null=True)
    description = RichTextField(features=['h2','h3','bold','italic','link','hr','ol','ul'],blank=True)
    lieu = models.CharField(blank=True,max_length=200)
    surface = models.PositiveSmallIntegerField(blank=True,null=True)
    nb_pieces = models.PositiveSmallIntegerField(blank=True,null=True)
    prix_affiché_index = models.CharField(blank=True,max_length=200,null=True)
    conditions_vente_et_prix = RichTextField(blank=True,features=['h2','ul'])

    def main_image(self):
        gallery_item = self.gallery_images.first()
        if gallery_item:
            return gallery_item.image
        else:
            return None

    content_panels = Page.content_panels + [
        FieldPanel('date'),InlinePanel('gallery_images',label="gallery images"),FieldPanel('lieu',classname="full"),FieldPanel('surface',FieldPanel('nb_pieces',FieldPanel('description',FieldPanel('prix_affiché_index',FieldPanel('conditions_vente_et_prix',classname="full")
    ]

    promote_panels = []
    settings_panels = []

    max_count = 20

class AnnoncePagegalleryImage(Orderable):
    page = ParentalKey(AnnoncePage,on_delete=models.SET_NULL,related_name='gallery_images',null=True)
    image = models.ForeignKey(
        'wagtailimages.Image',related_name='+',null=True
    )

    panels = [
        ImageChooserPanel('image')
    ]

删除Annonce页面本身之后,如何自动删除Annonce页面的图像?我需要更改模型吗?

解决方法

Watail图像对象可以在其他地方使用。自动删除这些内容可能会对其他内容产生不良影响。

您可以向./gradlew :dependencies添加delete方法,也可以使用AnnoncePage信号。您需要遍历所有相关的图库图像并删除相关的Wagtail图像。 Django将文件保留在磁盘上,因此您可能也想处理该文件。

pre_delete

免责声明:未经测试的代码。

https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods https://docs.djangoproject.com/en/dev/ref/signals/#pre-delete https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.fields.files.FieldFile.delete

请注意,批量操作不会调用class AnnoncePage(Page): ... def delete(self): for gallery_image in self.gallery_images.all(): # Delete the file on disk here ... # After,delete the db obj. gallery_image.image.all().delete() self.gallery_images.all().delete() super().delete() 方法和delete信号。您的里程可能会有所不同。