Django создать штрих-код и сохранить в поле изображения - PullRequest
0 голосов
/ 05 марта 2020

Я могу сгенерировать штрих-код и могу сохранить файл изображения в папке root, используя эту библиотеку python -barcode . Теперь я пытаюсь сгенерировать изображение штрих-кода и сохранить его в файл django.

Пробные версии:

import barcode

bc = Barcode.objects.latest('id')

upc = barcode.get('upc', '123456789102', writer=ImageWriter())
img = upc.render()  # Returns PIL image class
# <PIL.Image.Image image mode=RGB size=523x280 at 0x7FAE2B471320>
bc.img = img
bc.save()

Ошибка при получении:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-77-4ff34d9ac4c9> in <module>
----> 1 bc.save()

~/Desktop/workspace/projects/barcodescan/scan/models.py in save(self, *args, **kwargs)
     19         code = get_random_string(length=11, allowed_chars='1234567890')
     20         self.code = str(code)
---> 21         super(BarCode, self).save(*args, **kwargs)
     22 
     23     def __str__(self):

~/Desktop/workspace/projects/barcodescan/venv/lib/python3.5/site-packages/django/db/models/base.py in save(self, force_insert, force_update, using, update_fields)
    739 
    740         self.save_base(using=using, force_insert=force_insert,
--> 741                        force_update=force_update, update_fields=update_fields)
    742     save.alters_data = True
    743 

~/Desktop/workspace/projects/barcodescan/venv/lib/python3.5/site-packages/django/db/models/base.py in save_base(self, raw, force_insert, force_update, using, update_fields)
    777             updated = self._save_table(
    778                 raw, cls, force_insert or parent_inserted,
--> 779                 force_update, using, update_fields,
    780             )
    781         # Store the database on which the object was saved

~/Desktop/workspace/projects/barcodescan/venv/lib/python3.5/site-packages/django/db/models/base.py in _save_table(self, raw, cls, force_insert, force_update, using, update_fields)
    846             base_qs = cls._base_manager.using(using)
    847             values = [(f, None, (getattr(self, f.attname) if raw else f.pre_save(self, False)))
--> 848                       for f in non_pks]
    849             forced_update = update_fields or force_update
    850             updated = self._do_update(base_qs, using, pk_val, values, update_fields,

~/Desktop/workspace/projects/barcodescan/venv/lib/python3.5/site-packages/django/db/models/base.py in <listcomp>(.0)
    846             base_qs = cls._base_manager.using(using)
    847             values = [(f, None, (getattr(self, f.attname) if raw else f.pre_save(self, False)))
--> 848                       for f in non_pks]
    849             forced_update = update_fields or force_update
    850             updated = self._do_update(base_qs, using, pk_val, values, update_fields,

~/Desktop/workspace/projects/barcodescan/venv/lib/python3.5/site-packages/django/db/models/fields/files.py in pre_save(self, model_instance, add)
    284     def pre_save(self, model_instance, add):
    285         file = super().pre_save(model_instance, add)
--> 286         if file and not file._committed:
    287             # Commit the file to storage prior to saving the model
    288             file.save(file.name, file.file, save=False)

AttributeError: 'Image' object has no attribute '_committed'

I Я не могу найти решение для этого, прошу вас предложить мне какое-то решение для решения этой проблемы. будет очень благодарен за меня. Спасибо за продвижение

1 Ответ

0 голосов
/ 06 марта 2020

PIL Объект изображения на Django Поле изображения

После некоторых исследований я нашел решение для моего вопроса!

from io import BytesIO 

import barcode
from barcode.writer import ImageWriter

from django.core.files.base import ContentFile

from scan.models import Barcode

bc = Barcode.obejcts.latest('id')

upc = barcode.get('upc', bc.code, writer=ImageWriter())

i = upc.render() # <PIL.Image.Image image mode=RGB size=523x280 at 0x7FAE2B471320>

image_io = BytesIO()

i.save(image_io, format='PNG')

image_name = 'test.png'

bc.img.save(image_name, content=ContentFile(image_io.getvalue()), save=False)

bc.save()
...