2012-06-05 6 views
11

나는 파일 이름이 무작위되고 싶어하기 때문에 나는과 같이 임의의 파일 이름을 반환 upload_to 기능을 사용 : 나는 모델 내부 속성에 원래 파일 이름을 저장하려는 그러나Django : FileField에서 원래 파일 이름을 저장하는 방법?

from uuid import uuid4 
import os 
def get_random_filename(instance, filename): 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (str(uuid4()), ext) 
    return os.path.join('some/path/', filename) 

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 

. 이 같은 것이 작동하지 않습니다.

def get_random_filename(instance, filename): 
    instance.filename = filename 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (str(uuid4()), ext) 
    return os.path.join('some/path/', filename) 

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 
    filename = models.CharField(max_length=128) 

어떻게하면됩니까?

감사합니다.

+0

내 테스트에서 완벽하게 작동합니다. 그것이 당신을 위해 얼마나 효과적이지 않습니까? 무슨 일이야? 뷰 코드에 문제가있는 것일까 요? – rantanplan

+0

이렇게하고 db에서 개체를 쿼리하면 여전히 filename 값이 표시됩니까? – miki725

+0

예. 실제로 쉘 내부에서 테스트했습니다. 나는 그것을 죽이고 다시 시작했으며 파일 이름이 거기에 있었다. 사실 처음에 나는 get_random_filename 안에'instance.save()'를하는 것을 잊었다 고 생각했다. 그러나 그것은 필요하지 않은 것으로 보인다. – rantanplan

답변

8

게시 된 코드는 일반적으로 아마 실제 코드는

class FooModel(models.Model): 
    filename = models.CharField(max_length=128) 
    file = models.FileField(upload_to=get_random_filename) 

참고 위의 필드의 순서의 전환이며, 작동합니다.

때문에 작동하지 않습니다 다음 upload_to()FileField의 실제 값이 요구되는 pre_save(), here in the code에 의해 호출됩니다. upload()에있는 filename 특성에 대한 할당은 삽입 SQL에 첫 번째 매개 변수 filename이 생성 된 후에 발생합니다. 따라서 할당은 생성 된 SQL에 영향을 미치지 않고 인스턴스 자체에만 영향을 미칩니다.

그게 문제가되지 않는다면, 셸에 입력 한 코드를 게시하십시오.

+0

바로 그 자리에있었습니다. 질문에 핵심 코드를 다시 입력했는데 순서를 바꾸었다. 고맙습니다. !!!!! – miki725

+0

고맙습니다. 어디에서 그런 일이 있었는지 지적 해주세요. 나는 필드와 모델 코드를 파고 있었지만 SQL을 살펴 보지는 않았다. – miki725

+0

Django 1.5로 깨진 것 같습니다 ... 나는 super (FooModel, self)를 추가해야했습니다.내 모델에서 save (update_fields = [ 'filename'])'는 재정의 된 메소드를 저장합니다. 이견있는 사람 ? – dulaccc

1

저장 프로세스 중에 파일 이름을 채우는 경로를 사용할 수 있습니다. 분명히 get_random_filename이 실행될 때 원래 파일 이름을 메모리에 저장해야합니다.

# inside the model 
class FooModel(models.Model): 
    file = models.FileField(upload_to=get_random_filename) 
    filename = models.CharField(max_length=128) 

    def save(self, force_insert=False, force_update=False): 
     super(FooModel, self).save(force_insert, force_update) 
      #Do your code here... 
+0

내가 싫어하는 점은 저장이 일어날 것입니다. 나는 더 깔끔한 것을 선호한다. – miki725

관련 문제