Подтвердить что ты не робот

Захват исключений в шаблонах 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 %}.

Есть ли что-нибудь подобное? Знаете ли вы какие-либо альтернативы?

4b9b3361

Ответ 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

Ваш шаблон не должен поднимать исключение как обычный курс действий. Если в шаблоне есть ошибка, вы ее исправите. В противном случае все, что потенциально может вызвать исключение, должно обрабатываться в модели или представлении. Там нет тега, как вы упоминаете по какой-то причине.