Пиша малко приложение 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)
Смес от горното:
Ще има шаблон по подразбиране.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 е най-добрият по отношение на използваемостта, но смятам, че ще повлияе много на представянето. Някакви съвети?