Вопрос по download, django – Django: создать ссылку для скачивания

9

у меня естьFile модель, в каком магазинеpath поле - путь в файловой системе к файлу. Все файлы хранятся в MEDIA_ROOT / files

В шаблоне я хочу создать ссылку для скачиванияFile объект. Каков наилучший способ сделать это? Должен ли я использовать статическую обработку файлов в Django?

ТИА!

UPD

File модель

class File(models.Model):
    item = models.ForeignKey(Item)
    file = models.FileField(upload_to = os.path.join(MEDIA_ROOT,'items'))
    format = models.CharField(max_length = 255)

В представлении элемента я делаю следующее:

files = File.objects.filter(item_id = id)

и проходfiles к шаблону

в шаблоне я используюfiles.1.file.url например и до сих пор имеют плохой URL-адрес, какsite.com/home/dizpers/...

UPD2

Связанный вопрос

Solution

Моя проблема была в модели файла, вfile поле. В параметре upload_to я использую абсолютный путь, но должен использовать относительный путь:

file = models.FileField(upload_to = 'items')

Ваш Ответ

3   ответа
11

что именно вы подразумеваете под "генерировать ссылку для скачивания", но просто для ссылки на файл просто используйте{{ some_file.url }} как твойhref.

Я попробовал это. Не работает. по-прежнему получать URL-адреса, такие как site.com/home/dizpers/data/......./file.pdf гдеhome/dizpers/... путь к файлу на диске Dmitry Belaventsev
О, если вы сохраняете полный абсолютный путь, тогда да, у вас будут проблемы. Вам нужно будет удалитьMEDIA_ROOT сначала часть пути (скорее всего, с помощью какого-либо метода в вашей модели), а затем присоединитеMEDIA_URL.
И это будет работать для моего пользовательского объекта File? Не является Файловым объектом Django. Dmitry Belaventsev
Я предполагал, что вашFile модель по-прежнему использует истинно синийFileField вместо стандартногоCharField, На самом деле нет причин не делать этого, поскольку оба хранятся в базе данных одинаково;FileField только что подключен API для работы с вводом / выводом. Тем не менее, если вам просто нужна очень простая ссылка, вы можете использовать{{ MEDIA_URL }}files/{{ file_instance.path }}.
Самый интересный момент здесь - то, что я использую FileField - см. Обновленный вопрос. Dmitry Belaventsev
5

models.py:

import os

from django.conf import settings
from django.db import models

class File(models.Model):
    ... (your existing File model)

    @property
    def relative_path(self):
        return os.path.relpath(self.path, settings.MEDIA_ROOT)

(с помощьюrelpath method раздетьMEDIA_ROOT от стоимостиself.path)

вашемfile_detail.html (или эквивалентный) шаблон:

<a href='{{ MEDIA_URL }}{{ file.relative_path }}'>{{ file.name }}</a>

NB как говорит Крис, лучше использоватьFileField от. Надеемся, что вышеперечисленное сработает для вашей конкретной ситуации, но, если вы не решительно настроены организовать вещи таким образом, я предлагаю перейти в специальное поле.

3

href="{{ STATIC_URL }}/files/somefile", или жеhref="{{ MEDIA_URL }}/files/somefile" для загруженного пользователем контента

Похожие вопросы