Повторяйте и форматируйте словарь, возвращаемый фильтром шаблона - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь отобразить метаданные об изображении в моем приложении Django.Метаданные считываются из exif-заголовка изображения, сохраняются в словаре с изображением в качестве ключа и возвращаются в шаблон с фильтром.В моем шаблоне я отображаю изображения и хотел бы отобразить отформатированные метаданные для этого изображения.Пока что я могу заставить его отображать только словарь для этого изображения (например, {'key1': 'value', 'key2', 'value'}).Я хотел бы, чтобы это выглядело как key1: value, key2: value.

#template.html
{% block content %}
    {% for image in images %}
        {{ exif|get_item:image }}
            <p><img src="{{ image.image.url }}" width="500" style="padding-bottom:50px"/></p>
    {% endfor %}
{% endblock %}


#views.py
def image_display(request):
    images = image.objects.all()

    exif = {}
    for file in images:
        cmd = 'exiftool ' + str(file.image.url) + ' -DateTimeOriginal -Artist'
        exifResults = (subprocess.check_output(cmd)).decode('utf8').strip('\r\n')
        exif[file] = dict(map(str.strip, re.split(':\s+', i)) for i in exifResults.strip().splitlines() if i.startswith(''))

    context = {
        'images': images,
        'exif': exif,
    }

    @register.filter
    def get_item(dictionary, key):
        return dictionary.get(key)
    return render(request, 'image_display.html', context=context)

Я думал, что мог бы просто сделать {% for key, value in exif|get_item:image.items %} в шаблоне, но это возвращает ошибку:

VariableDoesNotExist at /reader/image_display
Failed lookup for key [items] in <image: image1>

Есть лиМожно ли отформатировать словарь, возвращаемый фильтром, или выполнить итерацию по нему так, чтобы я мог отформатировать каждую пару ключ-значение?

1 Ответ

1 голос
/ 16 апреля 2019

Насколько я понимаю, вы используете реализацию пользовательского фильтра этого вопроса: Шаблон Django, как искать значение словаря с переменной , но вам нужен дополнительный шаг для форматирования определенного ключа, поскольку онdictionary.

Почему бы не создать еще один фильтр, который может возвращать словарь, отформатированный так, как вы хотите?
Примерно так:

@register.filter
def get_item_formatted(dictionary, key):
    tmp_dict = dictionary.get(key, None)
    if tmp_dict and isinstance(tmp_dict, dict):
        return [[t_key, t_value] for t_key, t_value in tmp_dict.items()]
    return None

Это вернет список списков [key, value]пары или None.
Вы можете повторить это в шаблоне:

{% block content %}
    {% for image in images %}
        {% for pair in exif|get_item_formatted:image %}
            // Do what you need with the pair.0 (key) and pair.1 (value) here. 
        {% endfor %}
    {% endfor %}
{% endblock %}
...