【问题标题】:Django. How to save the generated file in FileField?姜戈。如何将生成的文件保存在 FileField 中?
【发布时间】:2020-08-22 19:23:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python django file


    【解决方案1】:

    你可以试试这样的:

    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)
    

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2017-10-02
      • 2020-08-17
      相关资源
      最近更新 更多