簡體   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