Шаблоны Django - как вывести относительный путь файла при рекурсивном использовании FilePathField - PullRequest
4 голосов
/ 11 февраля 2010

У меня есть следующая модель django:

RESOURCE_DIR = os.path.join(settings.MEDIA_ROOT, 'resources')

class Resource(models.Model):
    title = models.CharField(max_length=255)
    file_name = models.FilePathField(path=RESOURCE_DIR, recursive=True)

и я хочу указать URL-адрес файла в шаблоне, чтобы пользователь мог его просмотреть или загрузить.

Если я использую {{ resource.file_name }} в шаблоне, он выводит полный путь к файлу на сервере, например, если RESOURCE_DIR='/home/foo/site_media/media', то выводится '/home/foo/site_media/media/pdf/file1.pdf', тогда как я хочу 'pdf/file1.pdf'. В админке или в форме модели эта опция отображается как '/pdf/file1.pdf' в виджете выбора. Так что, очевидно, можно делать то, что я прошу. Конечно, дополнительная косая черта не важна. Если бы я устанавливал recursive=False, то я мог бы просто удалить часть пути до последнего слеша.

Как получить тот же результат, что и для модели или администратора?

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

нижняя часть оставляет в главном разделителе пути, который может не быть косой чертой, необходимой URL

def url(self):
    path = self._meta.get_field('file_name').path
    return self.file_name.replace(path, '', 1)

так небольшое улучшение

def url(self):
        path = self._meta.get_field('icon').path
        return "/" + self.icon[len(path)+1:]
0 голосов
/ 15 февраля 2010

Я выяснил, что вы можете получить аргумент пути к FilePathField, используя resource._meta.get_field ('file_name'). Path Кажется, лучше всего это сделать в модели. Таким образом, модель становится:

RESOURCE_DIR = os.path.join(settings.MEDIA_ROOT, 'resources')

class Resource(models.Model):
    title = models.CharField(max_length=255)
    file_name = models.FilePathField(path=RESOURCE_DIR, recursive=True)

    def url(self):
        path = self._meta.get_field('file_name').path
        return self.file_name.replace(path, '', 1)

тогда в шаблоне можно поставить: {{MEDIA_URL}} resources {{resource.url}}

0 голосов
/ 11 февраля 2010

это вид обмана:

{{ resource.file_name|cut:resource.file_name.path }}

не тестировалось.

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