Я пишу небольшое приложение django для обработки изображений. Я хотел бы сделать это как можно более СУХИМ, поэтому это моя цель:
Пользователь загружает файл и вводит некоторые поля, такие как заголовок, замещающий текст, заголовок и т. д.
В шаблоне я хотел бы сделать что-то вроде:
model.image.render_tag
который выведет что-то вроде:
<img src='path/image.jpg' title='title' alt_text='alt_text..' />
Проблема в том, что эта строка должна быть в шаблоне, так что если разработчику нужно добавить что-то или удалить что-то, он может просто отредактировать шаблон, и рендеринг изменится во всех визуализированных изображениях.
Можно также добавить второй шаблон и визуализировать его.
Теперь есть несколько способов добиться этого:
1)
Просто включите шаблон, который отображает переменную с пространством имен, и заставьте разработчика каждый раз «менять» имя переменной изображения, шаблон будет примерно таким:
<img src="{{ namespaced_image.raw.path }}" alt_text="{{ namespaced_image.alt_text }}"... />
В этом случае разработчик должен переименовать изображение в его версию с пространством имен, прежде чем включать путь.
Что-то типа:
{% with namespaced_image=image %}
{% include images/template.html %}
{% end with %}
2)
Добавьте тег шаблона для рендеринга изображения на основе необработанной строки, которую пользователь может редактировать в настройках, например
settings.py
namespaced_image_tag="<img src={path} ... />"
и мой тег шаблона будет делать что-то вроде
@register
def rendered_tag(image)
return namespaced_image_tag.format(path=image.raw.path, ...)
Таким образом, разработчик может просто добавить файл пользовательских тегов и использовать
{% load images_filters %}
{{ image|rendered_tag }}
3)
Смесь вышеперечисленного:
Там будет шаблон по умолчанию template.html, содержащий тег, и тег шаблона, который будет отображать шаблон, предоставляя ему изображение с пространством имен в качестве контекста.
@register
def rendered_tag(image, template="default_template.html")
return render_template(template, namespaced_image=image)
Таким образом, разработчик может сделать что-то вроде
{% load images_filters %}
{{ image|rendered_tag }}
{{ image|rendered_tag:"custom_template_name" }}
Однако я не знаю, как рендеринг нескольких шаблонов на запрос повлияет на производительность.
Кроме того, мне не очень нравится вариант №1, потому что он непригоден для использования и чтения.
Вариант № 2 плохой, потому что я не могу использовать разные «шаблоны» и не могу расширять другие. Я также не очень люблю теги шаблонов, особенно потому, что пользователь вынужден импортировать файл в каждый используемый шаблон.
Вариант № 3 является лучшим с точки зрения удобства использования, но я чувствую, что это сильно повлияет на производительность. Какие-нибудь советы?