Строка не переводима. Это говорит редактору Eclipse не отмечать строку, как не снабжено. Это важно для многоязычных приложений.
from myapp.models import Photo
import urllib
from urlparse import urlparse
from django.core.files import File
img_url = 'http://www.site.com/image.jpg'
photo = Photo() # set any other fields, but don't commit to DB (ie. don't save())
name = urlparse(img_url).path.split('/')[-1]
content = urllib.urlretrieve(img_url)
# See also: http://docs.djangoproject.com/en/dev/ref/files/file/
photo.image.save(name, File(open(content[0])), save=True)
ImageField
- это просто строка, путь относительно вашего MEDIA_ROOT
настройка. Просто сохраните файл (вы можете использовать PIL, чтобы проверить, что это изображение) и заполните поле его именем файла.
Таким образом, он отличается от вашего кода тем, что вам нужно сохранить вывод URL-адреса . urlopen
в файл (в папке с медиафайлами), определите путь, сохраните его в своей модели.
Я просто Создан http://www.djangosnippets.org/snippets/1890/ для этой же проблемы. Код аналогичен уцинкому «Ответу выше, за исключением того, что он использует URLLIB2.URLOPEN, потому что Urllib.urlretRieve не выполняет никакой обработке ошибок по умолчанию, поэтому легко получить содержимое страницы 404/500 вместо того, что вам нужно. Вы можете создавать функцию обратного вызова и пользовательский подкласс URLOPENER, но мне было проще просто создать свой собственный файл TEMP:
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
img_temp = NamedTemporaryFile(delete=True)
img_temp.write(urllib2.urlopen(url).read())
img_temp.flush()
im.file.save(img_filename, File(img_temp))