Django. Как сохранить сгенерированный файл в FileField? - PullRequest
1 голос
/ 07 мая 2020

У меня нет опыта в Django, и мне нужна помощь. Я попытался переопределить метод save(), чтобы генерация QR-кода и последующее сохранение происходили вместе с ним.

Однако, когда я сохраняю запись в папке мультимедиа, я получаю два файла.

My file list

Файл "17.png" состоит поля "слаг" модели и расширения. Файл создается после выполнения этой строки:

self.qr.save(self.slug+'.png', BytesIO(qr), save=False)

Имя другого файла создается самим Django (после создания первого файла) и сохраняет его в поле «qr» модель. Как сделать так, чтобы был создан только один файл (только "10.png") и он сохранен в поле?

models.py

class Url(models.Model):
    slug = models.CharField(max_length=50, unique=True)
    qr = models.FileField(upload_to='', blank=True, null=True)

    def save(self, *args, **kwargs):
        qr = self.qr_generate(self.slug)
        self.qr.save(self.slug+'.png', BytesIO(qr), save=False)
        super(Url, self).save(*args, **kwargs)

    def __str__(self):
        return self.slug

    @staticmethod
    def qr_generate(slug):
        qr = qrcode.QRCode(
            version=None,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=10,
            border=4,
        )
        qr.add_data("somedata" + str(slug))
        qr.make(fit=True)

        img = qr.make_image(fill_color="black", back_color="white")
        qrByte = BytesIO()
        img.save(qrByte)
        return qrByte.getvalue()

Обновить

Найдено ошибка в моем коде. Я также переопределил метод form_valid и дважды вызвал save (). В итоге убрали один вызов и стало нормально, код выше работает

1 Ответ

0 голосов
/ 07 мая 2020

Вы можете попробовать что-то вроде этого:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Url)
def create_url(sender, instance, created, **kwargs):
    if created: 
        qr = instance.qr_generate(instance.slug)
        instance.qr.save(instance.slug+'.png', BytesIO(qr), save=False)
        super(Url, instance).save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...