2011-02-02 18 views
7

私はちょうどPythonを学んでいます& Django。ディレクトリファイルの内容をDjangoテンプレートに表示

私が問題を抱えていると思われるものは、静的なファイルの単純なリストをレンダリングすることです(私の上の単一のリポジトリディレクトリの内容を言います)。サーバー)をダウンロード可能なリンクのリストとして表示します。 がPython directory list returned to Django template

このコードスニペットは、「myfilesという」でファイル名を出力します。これは安全であるかどうかは、

この投稿は、正しい方向に私を操縦助けた...別の質問ですが、私はそれをしたいと仮定しますプロンプトから実行した場合:

path= os.path.dirname(os.path.abspath(__file__)) 
myfiles = os.path.join(path, 'myfiles') 
os.chdir(myfiles) 
for files in os.listdir("."): 
    print files 

しかし、これらのファイルをDjangoテンプレートに渡してリンクのリストを生成するにはどうすればよいですか?私はそれがテンプレート変数として渡し、forループでレンダリングするiterableにするいくつかの並べ替えのPython辞書/タプルを作成する必要がありますと思う?

この作業を行うには、urls.pyファイルにエントリを追加する必要がありますか?このようなもの?

(r'^myfiles/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(os.path.dirname(__file__), 'myfiles'), 'show_indexes': True}), 

ありがとうございました!私はちょうど学んでいるし、私は実際にどのように既存のコードスニペットからこれを行うには分かりませんでした。

EDIT:これは私が私のviews.pyに持っているものです:

def myfiles_page(request): 
    path = os.path.dirname(os.path.abspath(__file__)) 
    myfiles = os.path.join(path, 'myfiles\\') 
    os.chdir(myfiles) 
    x = 0 
    d = {} 
    for file in os.listdir("."): 
     d[x] = (myfiles + file) 
     x = x + 1 

    variables = RequestContext(request, { 
    'user' : request.user, 
    'filedict' : d, 
    }) 
    return render_to_response('myfiles_page.html', variables) 

これは私どのようです(私はWindowsシステムによ「\\」からわかります)

{% for key, value in filedict %} 
    {{ key }}: {{ value }} 
{% endfor %} 

Django documentationによる) しかし、「filedictは」まだテンプレートには何も表示されていない:それは、テンプレートに表示する取得しようとしていました。何か案は?

答えて

12

私はそれほど大したことはないと思います。

あなた自身の機能をviews.py内に作成する必要があります - チュートリアルを参照してください。

この関数は、os.listdirからリストにファイルリストを取得します。

コンテキスト内のそのリストをテンプレートに渡し、作成したテンプレートを使用してrender_to_responseを行います。チュートリアルを参照してください。テンプレートで

、そのその後のようなもの:

{% for file in filelist %} 
    {{ file }} 
{% endfor %} 

あなたは、テンプレートにコンテキストで何かを渡すことができます。 URL付きの拡張ファイルリストを渡すこともできます - 各ディクションには名前とURLがあるディクテーションのリスト。次に、あなたのテンプレートは次のとおりです。

{% for file in filelist %} 
    <a href="{{file.url}}">{{ file.name }}</a> 
{% endfor %} 

BIG FATセキュリティ警告

は、ユーザーがそれらを少なくともない本当に彼らが行うことができないことを確認せず、URLにパスを入れるせることで、ファイルを閲覧させてはいけません/myfiles/../../notmyfiles/secret.txtのようなものを見て、上に行くためにはドット・ドットをスティックするだけで他の人のファイルを見てください。

あなたがそれを理解していなければ、あなたはおそらく何かにこれをコーディングするべきではありません。

+7

+1大規模なセキュリティに関する警告です。 –

+0

応答のためにありがとうSpacedman - しかし、私にとっては最も難しい部分は実際には、それぞれのdictは名前とURLを持っているos.listdirからdictsのリストを構築するviews.py関数を書いています。私はそれが基本だが、そこに任意のアイデアを知っている?私が終わった何 – fieryred

+0

:DEF create_filedict(ディレクトリ):os.listdir(ディレクトリ)で ファイルの\t X = 0 \t D = {} \t: \t \t D [X] =(ファイル) \t \t x = x + 1 \t return {'dict':d、 'size':x} – fieryred

関連する問題