2013-05-23 2 views
0

При работе с загрузкой файлов вручную, нужно ли разместить файл в конечном месте, прежде чем сохранять его в модели? Или, в какой-то момент модель перемещает файл? Если мне нужно разместить его самостоятельно, зачем мне нужен параметр upload_to в поле модели? Похоже, мне пришлось бы сохранять паритет с параметром upload_to и логикой, которую я использую, чтобы скопировать его.Confused о местах загрузки файлов Django

Я думаю, что я просто смущен. Может ли кто-нибудь помочь мне сделать это правильно?

Моя форма получает в URL изображения из Интернета:

class ProductForm(ModelForm):  
    main_image_url = forms.URLField() 
    # etc... 

мой взгляд извлекает его, проверяет его и делает миниатюру:

main_img_temp = NamedTemporaryFile(delete=True) 
main_img_temp.write(urllib2.urlopen(main_image_url).read()) 
main_img_temp.flush() 

img_type = imghdr.what(main_img_temp.name) 
if not img_type: 
    errors = form._errors.setdefault("main_image_url", ErrorList()) 
    errors.append(u"Url does not point to a valid image") 
    return render_to_response('add_image.html', {'form':form}, context_instance=RequestContext(request)) 

# build a temporary path name 
filename = str(uuid.uuid4()) 
dirname = os.path.dirname(main_img_temp.name) 
full_size_tmp = os.path.join(dirname, filename+'_full.jpg') 
thumb_size_tmp = os.path.join(dirname, filename+'_thumb.jpg') 

shutil.copy2(main_img_temp.name, full_size_tmp) 
shutil.copy2(main_img_temp.name, thumb_size_tmp) 

# build full size and thumbnail 
im = Image.open(full_size_tmp) 
im.thumbnail(full_image_size, Image.ANTIALIAS) 
im.save(full_size_tmp, "JPEG") 

im = Image.open(thumb_size_tmp) 
im.thumbnail(thumb_image_size, Image.ANTIALIAS) 
im.save(thumb_size_tmp, "JPEG") 

# close to delete the original temp file 
main_img_tmp.close() 


### HERE'S WHERE I'M STUCK. This doesn't move the file... #### 
main_image = UploadedImage(image=full_size_tmp, thumbnail=thumb_size_tmp) 
main_image.save() 

В моей модели, У меня есть модель UploadedImage, которая имеет основные поля:

class UploadedImage(models.Model): 
    image = models.ImageField(upload_to='uploads/images/%Y/%m/%d/full') 
    thumbnail = models.ImageField(upload_to='uploads/images/%Y/%m/%d/thumb/') 

ответ

0

ответил на мой собственный вопрос ...

Когда я прошел путь к ImageField в модели, я просто передача его путь. Теперь я вижу, что для вызова всей обработки хранилища, встроенной в Django, вы должны передать ей объект File. Этого было достаточно, чтобы сделать его копию на upload_to пути:.

from django.core.files import File 

main_image = UploadedImage(image=File(open(full_size_tmp)), thumbnail=File(open(thumb_size_tmp)), creator=request.user) 
main_image.save() 
0

Обычно, когда вы сохраняете модель, она записывает файлы в местоположение, которое указывает upload_to. Это само по себе, поэтому вам не нужно будет делать это вручную.

Здесь вы записываете файл в темп, перемещая его после и многое, что можно сделать автоматически. Проверьте answer to this question, где он также использует urllib, чтобы получить изображение и сохранить его в db.

Обратите внимание, что вы можете передать буфер в память, чтобы создать FileField или ImageField, которые подходят для логики миниатюр. Также вы можете использовать django-thumbnails для этих целей. Это хорошая библиотека.

Надеюсь, это поможет!

+0

Спасибо за прыжки в Я буду смотреть на конденсационных это и передавая ему объект в памяти. – Scott

+0

Добро пожаловать, удачи! –