2011-02-02 3 views
7

में निर्देशिका निर्देशिका फ़ाइल सामग्री सूचीबद्ध करें मैं सिर्फ पाइथन & 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 टेम्पलेट में कैसे पास करूं और लिंक की एक सूची कैसे उत्पन्न करूं? मुझे लगता है कि मुझे इसे किसी भी प्रकार का पाइथन डिक्शनरी/टुपल बनाना संभव हो सकता है, इसे टेम्पलेट वैरिएबल के रूप में पास करें और इसे लूप में प्रस्तुत करें?

क्या मुझे यह काम करने के लिए मेरी urls.py फ़ाइल में एक प्रविष्टि जोड़नी है? कुछ इस तरह?

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

आपकी मदद के लिए धन्यवाद! मैं बस सीख रहा हूं और मैं वास्तव में यह नहीं समझ सकता कि मौजूदा कोड स्निपेट से ऑनलाइन इसे कैसे किया जाए।

संपादित करें: यह क्या मैं अपने 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) 

यह मैं कैसे है यह एक टेम्पलेट में प्रदर्शित करने के लिए मिलता है कोशिश कर रहा था करने के लिए: (Django documentation के अनुसार)

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

लेकिन 'filedict' अभी भी टेम्पलेट में कुछ भी दिखाई नहीं दे रहा। कोई विचार?

उत्तर

12

कुछ ऐसा नहीं है, मुझे लगता है।

आपको शायद अपने अंदर के फ़ंक्शन को देखने की आवश्यकता होगी.py.py - ट्यूटोरियल देखें।

वह फ़ंक्शन os.listdir से फ़ाइल सूची में एक सूची में प्राप्त होगा।

उस टेम्पलेट में संदर्भ में उस सूची को पास करें और आपके द्वारा लिखे गए टेम्पलेट के साथ render_to_response करें - ट्यूटोरियल देखें।

टेम्पलेट में, अपने तो जैसे कुछ:

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

आप एक टेम्पलेट के संदर्भ में कुछ भी पारित कर सकते हैं। हो सकता है कि आप यूआरएल के साथ फाइलों की एक बढ़ी हुई सूची भी पास कर सकें - डिक्ट्स की एक सूची, जहां प्रत्येक निर्देश का नाम और यूआरएल होता है। फिर अपने टेम्पलेट है:

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

बिग फैट सुरक्षा चेतावनी

मत उपयोगकर्ताओं उन्हें एक यूआरएल में एक पथ डाल दिया, वास्तव में वास्तव में जाँच है कि वे ऐसा नहीं कर सकते तो कम से कम बिना नहीं द्वारा फ़ाइलें ब्राउज़ सामान /myfiles/../../notmyfiles/secret.txt जैसे सामान और ऊपर की ओर जाने के रास्ते में डॉट-डॉट्स चिपके हुए बस अन्य लोगों की फाइलें देखें।

यदि आप इसे समझ नहीं पाते हैं, तो शायद आपको इसे किसी भी चीज़ पर कोडिंग नहीं करना चाहिए बल्कि एक खिलौना प्रणाली है जिसे आप टुकड़ों पर फटकारने पर ध्यान नहीं देते हैं! बड़ी वसा सुरक्षा चेतावनी के लिए

+7

+1। –

+0

प्रतिक्रिया स्पेसमैन के लिए धन्यवाद - लेकिन मेरे लिए सबसे कठिन हिस्सा वास्तव में os.listdir से dicts की एक सूची बनाने के लिए views.py फ़ंक्शन लिख रहा है, जहां प्रत्येक dict का नाम और यूआरएल होता है। मुझे पता है कि यह बुनियादी है, लेकिन वहां कोई विचार है? – fieryred

+0

क्या मैं के साथ समाप्त हो गया: डीईएफ़ create_filedict (निर्देशिका): \t x = 0 \t d = {} \t os.listdir में फ़ाइल (निर्देशिका) के लिए: \t \t घ [x] = (फाइल) \t \t x = x + 1 \t वापसी {'dict': d, 'size': x} – fieryred