2013-05-05 74 views
14

连接我在models.py的Django从URL保存图像和ImageField的

class Item(models.Model): 
    image_file = models.ImageField(upload_to='images') 
    image_url = models.URLField() 

我想自动Django的本地下载和保存图像从image_urlimage_file

“连接”它应该如何行为:

  1. 我粘贴https://docs.djangoproject.com/s/img/site/hdr_logo.gifimage_url管理中的字段
  2. 单击“保存”
  3. 在模板中写入<img src="{{ item.image_file.url }}">。这表明从我的服务器 图像,不djangoproject.com

我已经试过:

我已经覆盖Item类的save方法。我通过urllib本地保存的图像,但我被困在这个保存的图像与image_file

回答

32
from django.core.files import File 
import os 

class Item(models.Model): 
    image_file = models.ImageField(upload_to='images') 
    image_url = models.URLField() 

... 

def get_remote_image(self): 
    if self.image_url and not self.image_file: 
     result = urllib.urlretrieve(self.image_url) 
     self.image_file.save(
       os.path.basename(self.image_url), 
       File(open(result[0])) 
       ) 
     self.save() 

您可以覆盖默认的保存()方法连接到自动调用get_remote_image()。

参见:https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

+0

你如何设置图像的文件名? – User 2016-12-09 22:56:34

+2

Python3更新:http://stackoverflow.com/questions/17960942/attributeerror-module-object-has-no-attribute-urlretrieve – 43Tesseracts 2017-01-07 06:17:41

0

对于python3

from django.core.files import File 
from urllib import request 
import os 

class Item(models.Model): 
    image_file = models.ImageField(upload_to='images') 
    image_url = models.URLField() 

... 

def get_remote_image(self): 
    if self.image_url and not self.image_file: 
     result = request.urlretrieve(self.image_url) 
     self.image_file.save(
       os.path.basename(self.image_url), 
       File(open(result[0])) 
       ) 
     self.save() 

从这里:http://stackoverflow.com/questions/17960942/attributeerror-module-object-has-no-attribute-urlretrieve