2016-10-24 11 views
0

私はPythonには新しく、PythonのOOPに慣れようとしています。誰かが「None」というフォルダに保存している理由を説明できますか?管理ページにオーディオファイルをアップロードしたいと思います。このファイルは、 'Vocab名'の付いた独自のフォルダに格納されます。Django FileField upload_to aid

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

すべての新しいファイルのファイル名に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

魅力的なように働きました... 私のPythonの学習のためのちょっとした質問です。 関数がクラスの外にあり、そのクラス内にない理由は何ですか? – Leo505

+0

@ Leo505 AFAIKこれは違いはありませんが、モデルの中に移動して 'VocabContent 'として参照すると、' @ classmethod'アノテーションを関数に追加する必要があります。 get_upload_path'を入力してください。 – ihhcarus

関連する問題