Захват исключений в шаблонах django
Я использую тег шаблона в шаблоне Django (тег thumbnail
), и он бросает исключение, которое заставляет шаблон терпеть неудачу с ошибкой 500. Я хотел бы прекратить это, поскольку у меня нет полного контроля над исходными изображениями, которые спорадически запускают это исключение и вместо этого используют вместо этого пустое/замещающее изображение. Это текущий код шаблона:
{% thumbnail video.image_url "50x74" crop="center" as im %}
<img src="{% cdn_images im.url %}" />
{% empty %}
<img src="/media/img/noimage_thumb.png" alt="" />
{% endthumbnail %}
Это исключение (PIL выбрасывает его):
TemplateSyntaxError at /
Caught IOError while rendering: cannot identify image file
Я искал решения и придумал silent_variable_failure, который является свойством, которое, если определено, делает исключение тихим. Я предполагаю, что это может указывать на правильное направление, но насколько я могу сказать, что любое решение, использующее это, означало бы, что мне придется изменить сам тег тега шаблона, который является внешней библиотекой - я бы предпочел не делать этого,
В идеале я хотел бы заменить третью строку в моем коде чем-то вроде {% empty or exception_raised %}
.
Есть ли что-нибудь подобное? Знаете ли вы какие-либо альтернативы?
Ответы
Ответ 1
То, как я всегда справлялся с этим, - это подтолкнуть его к слою модели. Итак, в вашей модели:
class MyImageModel(model.Model):
# model fields go here..
def get_url(self):
try:
# or whatever causes the exception
return self.url
except IOError:
return None
И в вашем шаблоне:
{% thumbnail video.image_url "50x74" crop="center" as im %}
{% if im.get_url %}
<img src="{% cdn_images im.get_url %}" />
{% else %}
<img src="/media/img/noimage_thumb.png" alt="" />
{% endif %}
{% endthumbnail %}
Ответ 2
Ваш шаблон не должен поднимать исключение как обычный курс действий. Если в шаблоне есть ошибка, вы ее исправите. В противном случае все, что потенциально может вызвать исключение, должно обрабатываться в модели или представлении. Там нет тега, как вы упоминаете по какой-то причине.