Django 3.2 как преобразовать загруженный pdf файл в файл изображения и сохранить в соответствующий столбец в базе данных?

У меня есть следующий код, который я использовал в Django 3.2, который работает нормально, за исключением 1 пункта:

models.py

from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator 

# Create your models here.

from django.core.validators import FileExtensionValidator
from django.db.models.signals import post_save, pre_save
from pdf2image import convert_from_path
from django.conf import settings
import os


COVER_PAGE_DIRECTORY = 'library_app/coverdirectory/'
PDF_DIRECTORY = 'library_app/pdfdirectory/'
COVER_PAGE_FORMAT = 'jpg'

# this function is used to rename the pdf to the name specified by filename field
def set_pdf_file_name(instance, filename):
    return os.path.join(PDF_DIRECTORY, '{}.pdf'.format(instance.filename))

# not used in this example
def set_cover_file_name(instance, filename):
    return os.path.join(COVER_PAGE_DIRECTORY, '{}.{}'.format(instance.filename, COVER_PAGE_FORMAT))

class Pdffile(models.Model):
    # validator checks file is pdf when form submitted
    pdf = models.FileField(
        upload_to=set_pdf_file_name, 
        validators=[FileExtensionValidator(allowed_extensions=['pdf'])]
        )
    filename = models.CharField(max_length=50)
    pagenumforcover = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(1000)])
    coverpage = models.FileField(blank=True, upload_to=set_cover_file_name)

def convert_pdf_to_image(sender, instance, created, **kwargs):
    if created:
        # check if COVER_PAGE_DIRECTORY exists, create it if it doesn't
        # have to do this because of setting coverpage attribute of instance programmatically
        cover_page_dir = os.path.join(settings.MEDIA_ROOT, COVER_PAGE_DIRECTORY)

        if not os.path.exists(cover_page_dir):
            os.mkdir(cover_page_dir)

        # convert page cover (in this case) to jpg and save
        cover_page_image = convert_from_path(
            pdf_path=instance.pdf.path,
            dpi=50, 
            first_page=instance.pagenumforcover, 
            last_page=instance.pagenumforcover, 
            fmt=COVER_PAGE_FORMAT, 
            output_folder=cover_page_dir,
            )[0]

        # get name of pdf_file 
        pdf_filename, extension = os.path.splitext(os.path.basename(instance.pdf.name))
        new_cover_page_path = '{}.{}'.format(os.path.join(cover_page_dir, pdf_filename), COVER_PAGE_FORMAT)
        # rename the file that was saved to be the same as the pdf file
        os.rename(cover_page_image.filename, new_cover_page_path)
        # get the relative path to the cover page to store in model
        new_cover_page_path_relative = '{}.{}'.format(os.path.join(COVER_PAGE_DIRECTORY, pdf_filename), COVER_PAGE_FORMAT)
        instance.coverpage = new_cover_page_path_relative

        # call save on the model instance to update database record
        instance.save()

post_save.connect(convert_pdf_to_image, sender=Pdffile)

Когда я создаю объект, то создается jpg. Проблема в том, что когда я открываю экземпляр объекта в админ панели django и меняю Pagenumforcover на что-то другое, он обновляет само число, но новое целое число не вызывает генерацию новой страницы обложки, или если я удалю текущую страницу обложки и сохраню, то она не будет автоматически генерировать новую страницу обложки.
. Буду благодарен за помощь.

Я пытался создать Django==3.2 Doc_app, в котором из панели администратора Django я загружаю pdf и указываю Pagenumforcover (PositiveIntegerField) и сохраняю его, после чего автоматически создается файл coverpage (jpg) в качестве титульной страницы и сохраняется вместе с загруженным pdf файлом. что работает нормально до сих пор. Проблема в том, что когда я открываю сохраненный объект в панели администратора django и изменяю Pagenumforcover или удаляю pagecover и сохраняю, то он не будет автоматически генерировать pagecover.

Вернуться на верх