繁体   English   中英

Django。 如何将生成的文件保存在 FileField 中?

[英]Django. How to save the generated file in FileField?

我对 Django 缺乏经验,需要帮助。 我试图覆盖save()方法,以便 QR 码生成和随后的保存随之发生。

但是,当我将条目保存在媒体文件夹中时,我得到了两个文件。

我的档案清单

"17.png"文件由 model 的“slug”字段和扩展名组成。 执行此行后创建文件:

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

另一个文件的名称是由Django自己生成的(在创建第一个文件之后)并保存在model的“qr”字段中。 如何确保仅创建一个文件(仅"10.png" )并将其保存在字段中?

模型.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() 两次。 结果去掉了一个调用就正常了,上面的代码就可以了

你可以尝试这样的事情:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM