Ловля исключений в шаблонах Django - PullRequest
13 голосов
/ 15 декабря 2011

Я использую тег шаблона в шаблоне 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 %}.

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

Ответы [ 2 ]

11 голосов
/ 15 декабря 2011

Способ, которым я всегда обращался с этим, состоит в том, чтобы перенести его на уровень модели Итак, в вашей модели:

  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 %}
0 голосов
/ 15 декабря 2011

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

...