Вывести содержимое файла каталога в шаблоне Django - PullRequest
7 голосов
/ 02 февраля 2011

Я только изучаю Python и Django.(Спасибо всем, кто вносит свой вклад - это был бесценный ресурс!)

Одна, казалось бы, базовая вещь, с которой у меня возникают проблемы, - рендеринг простого списка статических файлов (скажем, содержимого одного каталога репозитория).на моем сервере) в виде списка загружаемых ссылок.Является ли это безопасным или нет, это другой вопрос, но предположим, что я хочу это сделать ...

Этот пост помог направить меня в правильном направлении: Список каталогов Python, возвращенный в шаблон Django

Этот фрагмент кода выводит имена файлов в «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 и создать список ссылок?Я думаю, что мне, возможно, придется создать какой-либо словарь / кортеж Python, чтобы сделать его итеративным, передать его в качестве переменной шаблона и отобразить его в цикле for?

Нужно ли добавлять запись в мои URL-адреса.py файл, чтобы заставить это работать?Что-то вроде этого?

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

Спасибо за вашу помощь!Я только учусь, и я не мог понять, как это сделать из существующих фрагментов кода в Интернете.

РЕДАКТИРОВАТЬ: Это то, что я получил в моем views.py: (вы заметите из'\\', что я нахожусь в системе 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)

Вот как я пытался заставить его отображаться в шаблоне: (согласно документации Django )

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

Но 'filedict' все еще ничего не отображает в шаблоне.Есть идеи?

1 Ответ

12 голосов
/ 02 февраля 2011

Что-то совсем не так, я считаю.

Возможно, вам потребуется создать собственную функцию внутри 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 %}

БОЛЬШОЕ ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ ЖИРА

Не позволяйте пользователям просматривать файлы, позволяя им указывать путь в URL, по крайней мере, не проверяя,не может делать такие вещи, как /myfiles/../../notmyfiles/secret.txt и просматривать файлы других людей, просто вставляя точки в путь, чтобы идти вверх.

Если вы этого не понимаете,тогда вам, вероятно, не следует кодировать это ни на чем, кроме игрушечной системы, которую вы не против разорвать на куски!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...