2016-10-24 4 views
0

저는 파이썬을 처음 사용하고 파이썬의 OOP에 적응하려고합니다. 누군가 다음 폴더가 '없음'이라는 폴더에 저장되는 이유를 설명 할 수 있습니까? 관리자 페이지에서 오디오 파일을 업로드하고 싶습니다. 이 파일은 'Vocab 이름'이 포함 된 자체 폴더에 저장됩니다.Django FileField upload_to assistance

class Vocab(models.Model): 
module = models.ForeignKey(Modules, on_delete=models.CASCADE) 
number = models.CharField(max_length = 250) 
name = models.CharField(max_length = 250) 

class VocabContent(models.Model): 
vocab = models.ForeignKey(Vocab, on_delete=models.CASCADE) 
audio = models.FileField(upload_to=vocab.name) 

쉘에서 다음을 실행하십시오.

>>> from module.models import Modules, Vocab, VocabContent 
>>> vocab = VocabContent.objects.get(pk=1) 
>>> vocab.vocab.name 
'Numbers' 

숫자는 내가 찾는 값입니다.

+0

그래서 작동하지 않는 것, 무슨 일 이니? 어떤 오류? 너 뭐하려고 했니? –

+0

그것은 작동하지만 ...하지만. 현재 인스턴스 vocab 이름이 아니라 폴더 'None'을 생성합니다. 위의 예에서 폴더는 'Numbers' – Leo505

+0

upload_to를 'self.vocab.name'으로 변경합니다. –

답변

1

모델 마이그레이션을 실행할 때 참조하는 방법이 vocab.name이므로 정의되지 않았기 때문일 수 있습니다. Dynamic File Path in Django

그래서, 당신을 위해, 당신은 할 수 : 이런 일이 발생하지만 해결책이 많은이 다른 대답처럼, 런타임에 평가하기 위해 upload_to로 호출을 사용하고 제대로 값을 얻을 것이다 정확하게 이유를 설명 할 수 없다 모든 새로운 파일을 파일 이름으로 vocab.name을 연결 경로 초래

import os 
def get_upload_path(instance, filename): 
    return os.path.join("%s" % instance.vocab.name, filename) 


class VocabContent(models.Model): 
    vocab = models.ForeignKey(Vocab, on_delete=models.CASCADE) 
    audio = models.FileField(upload_to=get_upload_path) # Important to NOT put the parenthesis after the function name 

: 같은 것을 가지고있다.

+0

매력처럼 작동했습니다 ... 내 파이썬 학습에 대한 질문입니다. 함수가 클래스 외부에 있고 그 내부에 있지 않은 이유는 무엇입니까? – Leo505

+0

@ Leo505 AFAIK는 차이가 없지만 모델 내부로 이동하고'VocabContent '로 참조하면'@ classmethod' 주석을 함수에 추가해야합니다. get_upload_path'를 입력하십시오. – ihhcarus