Django Как сгенерировать и сохранить изображение при создании сущности с помощью CreateView?
В настоящее время я разрабатываю приложение на django. С помощью одной из моих моделей мне нужно сгенерировать штрих-код, сохранить его как изображение и загрузить его в одно из полей модели.
Я попытался сгенерировать изображение в функции сохранения модели, как показано ниже. Изображение генерируется и сохраняется в правильную папку, но когда я смотрю на сущности, у них всегда сохраняется изображение по умолчанию.
models.py:
class ItemEntity(models.Model):
sub_type = models.ForeignKey(ItemSubType, on_delete= models.PROTECT)
location = models.ForeignKey(WarehouseBin, on_delete= models.PROTECT)
supplyer = models.ForeignKey(ItemSupplyers, on_delete= models.PROTECT)
quantity = models.IntegerField()
unit = models.ForeignKey(Units, on_delete= models.PROTECT)
creation_date = models.DateTimeField(default= timezone.now)
expiration_date = models.DateTimeField()
time_of_consumption = models.DateTimeField(null= True)
barcode = models.ImageField(default='default_barcode.jpg', upload_to= 'media/barcodes')
def __str__(self):
return self.sub_type.name + " " + str(self.quantity) + " " + str(self.unit)
def save(self):
super().save()
datas=self.pk,self.location,self.sub_type # Datas to give to my barcode generator code
self.img = Image.new('RGB',(1,1)) # Declaring an empty image variable
BarcodeGenerator(datas,self) # Barcode generator the barcode it generates is put intu self.img variable
self.img.save("/home/makiverem/projects/pina/media/media/barcodes/"+str(self.pk)+".jpg") # Saving the image to media/media/barcodes
#I MISS SOMETHING FROM HERE I THINK
self.barcode=self.img #Making the models barcode field equal to self.img
views.py:
class ItemEntityCreateView(CreateView):
model=ItemEntity
form_class = ItemEntityForm
def get_form_kwargs(self, *args, **kwargs):
kwargs = super(ItemEntityCreateView, self).get_form_kwargs(*args, **kwargs)
return kwargs
def get_initial(self):
return {
"sub_type": self.kwargs.get('pk'),
#"unit": self.kwargs.get('pk') #kérdés mi lenne a jobb megoldás itt urlben több argumentumot átadni?
}
def get_success_url(self):
return reverse('whouse_itemsubtype_detail', kwargs={'pk' : self.object.sub_type.id})
def form_valid(self,form):
if form.is_valid():
messages.success(request= self.request, message='Sikeres Módosítás.')
form.save()
return super().form_valid(form)
else:
messages.error(request= self.request, message='Sikertelen Módosítás.')
return super().form_invalid(form)
forms.py:
class ItemEntityForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.pk == None:
self.fields['location'].queryset = WarehouseBin.objects.all().exclude(id__in=ItemEntity.objects.all().prefetch_related('location').values_list('location'))
else:
self.fields['location'].queryset = WarehouseBin.objects.all().exclude(id__in=ItemEntity.objects.all().prefetch_related('location').values_list('location'))|(WarehouseBin.objects.all().filter(id= ItemEntity.objects.all().get(pk=self.instance.pk).location.id))
class Meta:
model = ItemEntity
fields = ('sub_type', 'location', 'supplyer', 'quantity', 'unit', 'expiration_date') #
labels = {
'sub_type': 'Példány altípusa:',
'location': 'Hely:',
'supplyer': 'Beszállító',
'quantity': 'Mennyiség:',
'unit': 'Egység:',
'expiration_date': 'Szavatossági idő:',
}
widgets= {
'expiration_date' : DateInput(attrs={'type': 'date'})
}
Спасибо за поддержку.
После ответа @nigel239 я изменил код на следующий, и теперь он работает как надо.
datas=ItemEntity.objects.latest('id').id+1,self.location,self.sub_type # Datas to give to my barcode generator code
self.img = Image.new('RGB',(1,1)) # Declaring an empty image variable
BarcodeGenerator(datas,self) # Barcode generator the barcode it generates is put intu self.img variable
img_io = BytesIO()
self.img.save(img_io, format='WEBP') # Saving the image to media/media/barcodes
self.barcode=ContentFile(img_io.getvalue(),str(ItemEntity.objects.latest('id').id+1)+".jpg")
super().save()
Спасибо за помощь!