2016-10-18 13 views
2

モデルから関数定義を呼び出すことができるとわかっていましたが、アップロードしたドキュメントのファイル名を抽出できないようです。Python Djangoテンプレートはモデル関数から名前を取得できません

.htmlのバージョン1つの

<form action="." method="GET"> 
{% if documents %} 
    <ul> 
     {% for document in documents %} 
     <li> {{ document.docfile.filename }} 
     <input type = "submit" name="load-data" value="Add to Layer"/> 
     </li> 
     {% endfor %} 
    </ul> 

結果:それはちょうどボタンを示し、私の下には、次のテンプレート形式が、どちらか私の所望の出力からの結果を試してみました。

.htmlをバージョン2

<form action="." method="GET"> 
{% if documents %} 
    <ul> 
     {% for document in documents %} 
     <li> {{ document.filename }} 
     <input type = "submit" name="load-data" value="Add to Layer"/> 
     </li> 
     {% endfor %} 
    </ul> 

結果:それはちょうどボタンを示しています。

.htmlをバージョン3

<form action="." method="GET"> 
{% if documents %} 
    <ul> 
     {% for document in documents %} 
     <li> {{ document.docfile.name }} 
     <input type = "submit" name="load-data" value="Add to Layer"/> 
     </li> 
     {% endfor %} 
    </ul> 

結果は:完全なパス名を印刷します(例:/documents/2016/10/08/filename.csv)一緒にボタンで

残りのコードは次のとおりです。

models.py

class Document(models.Model): 
    docfile = models.FileField(upload_to='document/%Y/%m/%d') 

    def filename(self): 
     return os.path.basename(self.file.name) 

views.py

documents = Document.objects.all() 
return render(request, 'gridlock/upload-data.html', 
       { 
       'documents' : documents, 
       'form': form 
       }) 

私は誰かが、私が試した理由をすべて説明することができます願っています: {{ document.docfile.filename }}または{{document.file.filename}}または{{document.filename}}はどちらか私のために動作しませんか?ありがとう!

+0

より良いアプローチは、モデルを編集するのではなく、テンプレートタグを作成することです。上記の回答から[SO Post] [1]を確認してください。テンプレートタグの作成に関する回答が見つかります。 [1]:http://stackoverflow.com/questions/2683621/django-filefield-return-filename-only-in-template – cutteeth

答えて

4

は、私はあなたが使用する必要があるので、フィールドはDOCFILEと呼ばれ、あなたのモデルで

def filename(self): 
    # try printing the filename here to see if it works 
    print (os.path.basename(self.docfile.name)) 
    return os.path.basename(self.docfile.name) 

def filename(self): 
    return os.path.basename(self.file.name) 

を変更する必要があり、あなたのモデルを除き、{{ document.filename }}とかなり近いだと思います値を取得するにはself.docfileを使用します。

ソース:django filefield return filename only in template

+0

ありがとう!これは正解です!私はちょうどリンクした参照を読み上げるでしょう! – Reiion

+0

オハイオ州私は今それを得る。それはモデルの下で私を混乱させたものでした!再度、感謝します! – Reiion

関連する問題