2011-02-02 9 views
7

Estoy aprendiendo Python & Django. (Gracias a todos los que contribuyen aquí - ¡ha sido un recurso invaluable!)Lista de contenido del archivo de directorio en una plantilla de Django

Una cosa aparentemente básica con la que estoy teniendo problemas es presentar una lista simple de archivos estáticos (por ejemplo, el contenido de un solo directorio de repositorio en mi servidor) como una lista de enlaces descargables. Si esto es seguro o no es otra cuestión, pero supongamos que quiero hacerlo ...

Este post me ayudó a dirigir en la dirección correcta: Python directory list returned to Django template

Este fragmento de código muestra los nombres de archivo en myfiles '' Si se ejecuta desde el símbolo:

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

Pero, ¿cómo pasar estos archivos a una plantilla de Django y generar una lista de enlaces? Creo que tendré que crear un diccionario/tupla de Python para que sea iterable, pasarlo como una variable de plantilla y representarlo en un ciclo for.

¿Tengo que agregar una entrada a mi archivo urls.py para hacer esto? ¿Algo como esto?

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

¡Gracias por su ayuda! Solo estoy aprendiendo y realmente no puedo entender cómo hacerlo a partir de los fragmentos de código existentes en línea.

EDIT: Esto es lo que tengo en mi views.py: (se dará cuenta de la '\\' que estoy en un sistema Windows)

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) 

Así es como yo estaba tratando de conseguir que se muestre en una plantilla: (según la Django documentation)

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

Pero 'filedict' todavía no se muestra nada en la plantilla. ¿Algunas ideas?

Respuesta

12

Algo muy parecido a eso, supongo.

Probablemente necesites crear una función dentro de views.py - ver el tutorial.

Esa función obtendrá la lista de archivos de os.listdir en una lista.

Pase esa lista en el contexto a una plantilla y haga render_to_response con una plantilla que haya escrito - vea el tutorial.

En la plantilla, su entonces algo así como:

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

Puede pasar cualquier cosa en el contexto de una plantilla. También puede querer pasar una lista aumentada de archivos con URLs: una lista de dicts, donde cada dict tiene un nombre y una url. A continuación, la plantilla es:

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

grande y gordo de advertencia de seguridad

No permiten a los usuarios navegar por los archivos por lo que les ponen un camino en una dirección URL, al menos no sin realmente comprobar que ellos no pueden hacer cosas como /myfiles/../../notmyfiles/secret.txt y ver archivos de otras personas simplemente pegando puntos en el camino para ir hacia arriba.

Si no entiendes eso, entonces probablemente no deberías estar codificando esto en otra cosa que no sea un sistema de juguete que no te importe ser despedazado.

+7

+1 para la gran advertencia de seguridad. –

+0

Gracias por la respuesta Spacedman - pero la parte más difícil para mí es escribir la función views.py para crear una lista de dicts desde os.listdir, donde cada dict tiene un nombre y una url. Sé que es básico, pero ¿alguna idea allí? – fieryred

+0

Lo que terminé con: create_filedict def (directorio): \t x = 0 \t d = {} \t de archivo en os.listdir (directorio): \t \t d [x] = (archivo) \t \t x = x + 1 \t return {'dict': d, 'size': x} – fieryred

Cuestiones relacionadas