2017-05-04 51 views
0

我嘗試從url創建一個圖像並將其保存在我的django模型中。如果第一部分工作正常,我不知道如何將生成的文件關聯到我的對象。PIL到Django ImageField

這是我的功能,生成圖像文件:

def get_remote_image(image_url, merchant_product_path): 
    im = None 
    name = '' 
    r = requests.get(image_url, stream=True) 
    if r.status_code == 200: 
     name = urlparse(image_url).path.split('/')[-1] 

     full_path = os.path.join(settings.MEDIA_ROOT, merchant_product_path) 
     if not os.path.exists(full_path): 
      os.makedirs(full_path) 

     im = Image.open(r.raw) 
     if im.mode != "RGB": 
      im = im.convert("RGB") 
     im.thumbnail((500, 500), Image.ANTIALIAS) 
     im.save(full_path + name, 'JPEG') 

    return {'im': im, 'name': name} 

而現在,部分到此文件關聯到我的對象:

i = get_remote_image(row['pict'], m.get_products_media_path()) 

    obj, created = ProductLine.objects.update_or_create(
    ... 
    ... 
    ... 
    ) 

if i['im'] is not None: 
    try: 
     obj.main_picture.save(
      i['name'], 
      ContentFile(i['im']), 
      save=True) 
    except TypeError: 
     continue 

此代碼的工作,但不幸的是,畝照片是在正確的文件夾中創建對象創建/更新,但每個都沒有圖片文件:( 有人可以告訴我什麼是錯的嗎?

回答

0

我終於找到了解決辦法:

def get_remote_image(image_url): 
    im = None 
    name = '' 
    r = requests.get(image_url, stream=True) 
    if r.status_code == 200: 
     name = urlparse(image_url).path.split('/')[-1] 
     i = Image.open(r.raw) 
     buffer = BytesIO() 
     if i.mode != "RGB": 
      i = i.convert("RGB") 
     i.thumbnail((500, 500), Image.ANTIALIAS) 
     i.save(buffer, format='JPEG') 
     im = InMemoryUploadedFile(
      buffer, 
      None, 
      name, 
      'image/jpeg', 
      buffer.tell(), 
      None) 

    return {'im': im, 'name': name} 

然後:

obj, created = ProductLine.objects.update_or_create(
... 
... 
... 
) 
i = get_remote_image(row['pict']) 
obj.main_picture.save(
    os.path.join(m.get_products_image_path(), i['name']), 
    i['im'], 
    save=True) 

希望這將幫助一些其他用戶在這種情況下。

0

有了像這樣的模型:

class ProductLine(models.Model): 
    name = models.CharField(max_length=250, null=True) 
    image = models.ImageField(null=True) 

您可以使用is路徑而不是他的二進制內容直接鏈接計算機上的圖片。

obj, created = ProductLine.objects.update_or_create(...) 
obj.image.name = "/path/to/the/file" 
obj.save()