2012-07-09 3 views
4

다음은 csv 파일에서 Item 모델의 일부 인스턴스를 생성합니다. CSV 파일에서는 항목의 namefilename 만 지정됩니다. image 필드는 이미지가 존재하는 경우를보고 설정하고, 그것을 않는 경우, image에 이미지 파일을 설정됩니다프로그래밍 방식으로 ImageField를 저장하면 이미지 파일이 복제됩니다.

내가 할 :

item = Item() 
item.name = csv_fields[0] 
item.filename = csv_fields[1] 
item.save() 

... 

f = open(settings.MEDIA_ROOT+"images/"+item.filename, 'r') 
item.image = File(f) 
item.save() 

는 이렇게 이미지가 <original filename>_1settings.MEDIA_ROOT+"images/" 중복됩니다. 어떻게 그것을 피할 수 있습니까? 즉, 기존 파일을 복사하지 않고 imagefield에 어떻게 설정하면됩니까? 이 모든입니다

class Item(models.Model): 

    name = models.CharField(max_length=50) 
    filename = models.CharField(max_length=100,) 
    image = models.ImageField(upload_to='images', blank=True, null=True) 

답변

2

당신은 이미지 필드는 파일 이름과 필드 정의의 upload_to 소요되며, 이미지 리소스에 있음을 변환

item = Item() 
item.name = csv_fields[0] 
item.filename = csv_fields[1] 
item.image = csv_fields[1] 
item.save() 

해야합니다. 이미지 리소스를 전달하면 새로운 이미지 리소스로 간주됩니다.

는 SO이 :

f = open(settings.MEDIA_ROOT+"images/"+item.filename, 'r') 
item.image = File(f) 

모든

에 필요하지 않은 charfield과 이미지 필드 사이의 유일한 DIFF는 imagefield 파일 이름을 소요하기위한 PIL 이미지 자원에 캐스팅이다 추가 조작. 그 래퍼.

1

Francis Yaconiello 대답은 정확하지만 명확한 세부 사항이 있습니다.

item.image = csv_fields[1] 

미디어 루트 또는 다른 저장소 루트와 관련된 경로 여야합니다.

예를 들어, settings.MEDIA_ROOT = '/home/myuser/media'ImageField(upload_to='images')이라고 말하십시오. 수동으로`/home/myuser/media/images/purty.jpg '에서 이미지를 저장하면

그래서, 다음 csv_fields [1]해야한다 :

item.image = '/images/purty.jpg' 

다른 현명한, item.image.name은 , item.image.path 및 item.image.url이 엉망이됩니다.

관련 문제