[英]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"
)並將其保存在字段中?
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.