Django - Пользовательский фильтр, чтобы проверить, существует ли файл

Я сделал этот настраиваемый фильтр, чтобы проверить, существует ли изображение:

from django import template
from django.core.files.storage import default_storage

register = template.Library()

@register.filter(name='file_exists')
def file_exists(filepath):
    if default_storage.exists(filepath):
        return filepath
    else:
        index = filepath.rfind('/')
        new_filepath = filepath[:index] + '/image.png'
        return new_filepath

И я использовал это в шаблоне вот так:

<img src="{{ STATIC_URL }}images/{{ book.imageurl }}|file_exists" alt="{{book.title}} Cover Photo">

Но это не работает. И я не знаю почему.


person Sourabh    schedule 21.08.2013    source источник
comment
Что значит не работает? Что это возвращает?   -  person Daniel Rosenthal    schedule 21.08.2013
comment
Я получаю http://localhost:8000/static/images/ios.png|file_exists в URL-адресе изображения   -  person Sourabh    schedule 21.08.2013


Ответы (1)


Вы не применяете фильтр, потому что |file_exists находится за пределами {{}}. Попробуй это:

<img src="{{ STATIC_URL }}images/{{ book.imageurl|file_exists }}" alt="{{book.title}} Cover Photo">

Или, если вы хотите применить file_exists ко всему URL-адресу изображения, попробуйте следующее:

<img src="{{ STATIC_URL|add:'images/'|add:book.imageurl|file_exists }}" alt="{{book.title}} Cover Photo">
person alecxe    schedule 21.08.2013
comment
Я хочу, чтобы фильтр получил {{ STATIC_URL }}images/{{ book.imageurl }}. а не только {{book.imageurl}}. Возможно ли это? - person Sourabh; 21.08.2013
comment
Я попробовал ваш первый метод и изменил фильтр на .exists('appname/static/images/'+DataIReceived) и .exists('static/images/'+DataIReceived), но в обоих случаях django не может найти файл, и я получаю "image.png" обратно. Каким должен быть относительный путь? - person Sourabh; 21.08.2013
comment
Кроме того, я думаю, что вы должны передать абсолютный путь к exists, попробуйте построить его из os.path.join(<project root>, <image path>). - person alecxe; 21.08.2013
comment
Спасибо, сработало! Я использовал грязный метод, чтобы получить абсолютный путь, и скоро мне придется исправить (os.path.join вызывал у меня проблемы, поэтому я использовал + напрямую). Но пока я счастлив, что наконец-то это сработало :) - person Sourabh; 21.08.2013
comment
@Sourabh рад это слышать! - person alecxe; 21.08.2013