django: как выполнить вычисления внутри html-страницы шаблона?

#python #html #django

#python #HTML #django

Вопрос:

Привет, я использую плагин для создания эскизов, чтобы получить ширину и высоту изображения, теперь я хочу определить заполнение тега img, используя полученную высоту из плагина для создания эскизов, например:

 <img style="padding-top: {{ img.height / 2 }}" src=""/>
  

Но здесь я получил ошибку, django не позволяет вычислять подобным образом?

Комментарии:

1. не могли бы вы, пожалуйста, помочь мне с моим вопросом о подсчете, который я опубликовал?

Ответ №1:

К сожалению, нет. Вам нужно использовать фильтры, подобные add тому, который встроен в:

 {{ img.height|add:1 }}
  

Однако div это не так; вы можете реализовать это самостоятельно, хотя:

 from django import template
register = template.Library()

@register.filter
def div( value, arg ):
    '''
    Divides the value; argument is the divisor.
    Returns empty string on any error.
    '''
    try:
        value = int( value )
        arg = int( arg )
        if arg: return value / arg
    except: pass
    return ''
  

Использование было бы аналогичным, т.Е.:

 {{ img.height|div:2 }}
  

Комментарии:

1. могу ли я использовать встроенный фильтр divide и minus?

2. Существуют ли такие фильтры? Документация ( docs.djangoproject.com/en/1.3/ref/templates/builtins ) не перечисляет их, по этой причине я рекомендовал написать свой собственный.

3. Такого рода вещи не будут добавлены к встроенным фильтрам: code.djangoproject.com/ticket/361

4. Я действительно ненавижу инструкции try / except: pass. Я думаю, это зависит от ваших данных, которые передаются в div, но я чувствую, что лучше иметь исключение, чтобы, если инженер допустит ошибку, вы, по крайней мере, знали об этом, а не получали возвращаемое значение »

5. И нельзя ли его также округлить. Например 7/3 ?

Ответ №2:

Существует пакет Python, который предоставляет базовую математику для шаблонов Django: https://pypi.python.org/pypi/django-mathfilters

С помощью этого вы можете это сделать:

 {% load mathfilters %}
<img style="padding-top: {{ img.height|div:2 }}" src=""/>
  

Ответ №3:

Для CSS, как в вашем примере, вы могли бы использовать calc().

 <img style="padding-top: calc({{ img.height }} / 2)" src=""/>
  

Ответ №4:

Иногда вам просто приходится делать это в шаблоне. Следующий DjangoSnippet отлично работает. Хотя вы можете злоупотреблять этим, бывают случаи, когда это упрощает жизнь®.

ExprTag — вычисление выражения python и сохранение результата в переменной

Примечание: Не тестировался в версии 1.3, но отлично работает со всем, что было до этого.

Комментарии:

1. Отлично работает с Django 1.8, но мне пришлось настроить выражения исключений, чтобы привести их в соответствие с Python3.

2. @Bobble: можете поделиться различиями? Если вы просто хотите отправить их мне по электронной почте, мой адрес электронной почты находится в моем сетевом профиле . Спасибо.