2011-02-02 12 views
7

Ben sadece Python & Django öğreniyorum. (Buraya katkıda bulunan herkese teşekkürler - bu çok değerli bir kaynak oldu!)Django şablonunda dizin içeriğini listeleme

Sorun yaşadığım temel bir şey, statik dosyaların basit bir listesini oluşturmaktır (benim için tek bir depo dizininin içeriği İndirilebilir bağlantıların bir listesi olarak. Python directory list returned to Django template

Bu kod parçacığı 'myfiles' dosya adlarını verir: Bu güvenli olup olmadığı

Bu mesaj bana doğru yönde yönlendirmek yardımcı ... Başka bir soru ama ben bunu yapmak istiyorum varsayalım bir isteminden çalıştırırsanız:

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

Ama nasıl bir bağlantı listesi Django şablonuna bu dosyaları geçmek ve elde edebilirim? Tekrarlanabilir hale getirmek, bir şablon değişkeni olarak iletmek ve bir for döngüsünde oluşturmak için bir çeşit Python sözlüğü/tuple'ı oluşturmam gerektiğini düşünüyorum.

Bunu yapmak için urls.py dosyasına bir giriş eklemem gerekir mi? Böyle bir şey mi?

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

Yardımlarınız için teşekkürler! Sadece öğreniyorum ve bunu mevcut kod snippet'lerinden çevrimiçi olarak nasıl yapacağımı anlayamadım.

DÜZENLEME: Bu benim views.py içinde ne var ise:

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) 

Bu benim nasıl (eğer ben bir Windows sisteminde değilim '\\' dan göreceksiniz) çalışıyordu bir şablonda gösterilecek almak için: (Django documentation göre)

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

Ama 'filedict' hala şablonda şey görüntülemeden değildir. Herhangi bir fikir?

cevap

12

Çok fazla hoşlanmadığı bir şey var, sanırım.

Muhtemelen kendi inside views.py öğenizin bir işlevini oluşturmanız gerekir - eğiticiye bakın.

Bu işlev, os.listdir dosya listesini bir listeye alacak.

Bu listeyi içeriğe bir şablonla iletin ve yazdığınız bir şablonla render_to_response yapın - eğiticiye bakın. şablonunda

gibi onun sonra bir şey:

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

Bir şablona bağlamında şey geçebilir. Dosyaların bir listesini, URL'leri de olan bir listeden geçmek isteyebilirsiniz - her bir dict'ın bir adı ve bir url olduğu bir dicts listesi. Sonra şablon: kullanıcılar bunları bir URL'ye bir yol koymak en azından gerçekten onlar yapamaz kontrol etmeden sağlayarak dosyalara göz izin vermeyin

UYARI

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

BÜYÜK FAT GÜVENLİK /myfiles/../../notmyfiles/secret.txt gibi şeyler ve diğer insanlara ait dosyaları sadece yukarı doğru gitmek için yoldaki nokta noktalarına yapıştırarak bakın.

Eğer bunu anlamıyorsanız, muhtemelen bunu bir parça üzerinde kodlamamanız gerekir; ancak oyuncak parçalara parçalanmayacağınız bir oyuncak sistemi! Büyük yağ güvenliği uyarısı için

+7

+1. –

+0

Cevap Spacedman için teşekkürler - ama benim için en zor kısmı aslında her bir dict bir isim ve bir url vardır os.listdir gelen dicts listesini oluşturmak için views.py işlevi yazıyor. Temel olduğunu biliyorum, ama orada herhangi bir fikir var mı? – fieryred

+0

I ile sona: def create_filedict (dizini): \t x = 0 \t d = {} os.listdir dosyasını (dizin) için \t: \t \t d [x] = (dosya) \t \t x = x + 1 \t {'dict': d, 'size': x} döndür – fieryred