Как передать результат тега в фильтр в Django? - PullRequest
2 голосов
/ 04 августа 2011

Как передать результат тега в фильтр в Django?

Например,

{{ {% widthratio a b c %}|add: 2 }}

Ответы [ 4 ]

2 голосов
/ 04 августа 2011

Вы не можете, если только тег не знает, как изменить контекст (обычно у них есть синтаксис xxx as variable).Если этого не произойдет, вы можете написать обертку (в качестве пользовательского тега), которая будет.

0 голосов
/ 28 августа 2017

Просто используйте ключевое слово "as":

{% widthratio abc как результат%} {{result |добавить: 2}}

0 голосов
/ 02 января 2012

Вот мое решение для тегов шаблонов:

from django import template
from django.template.defaulttags import WidthRatioNode

register = template.Library()

class WidthRationExtraNode(WidthRatioNode):
    def render(self, context):
        extra = int(self.extra.resolve(context))
        value = int(super(WidthRationExtraNode, self).render(context)) 
        return str(value+extra)
    def __init__(self, val_expr, max_expr, max_width, extra):
        self.extra = extra
        super(WidthRationExtraNode, self).__init__(val_expr, max_expr, max_width)

def widthratioextra(parser, token):
    bits = token.contents.split()
    if len(bits) != 5:
        raise TemplateSyntaxError("widthratio takes four arguments")
    tag, this_value_expr, max_value_expr, max_width, extra = bits

    return WidthRationExtraNode(parser.compile_filter(this_value_expr),
                          parser.compile_filter(max_value_expr),
                          parser.compile_filter(max_width),
                          parser.compile_filter(extra))
widthratioextra = register.tag(widthratioextra)

Вы можете использовать его в своем шаблоне:

 {% widthratioextra a b c d %}

Добавление пользовательских тегов шаблонов в ваше приложение относительно просто, если вы не знаете, как это сделать, вот соответствующая часть руководства: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

0 голосов
/ 05 августа 2011

Правильный способ сделать это - написать свой собственный тег:

{% widthratio_add abcd%}

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

Хотя, я подозреваю, что вы пытаетесь сделать это только потому, что django не допускает базовую математику в шаблоне, кроме «добавить», и к тому времени, когда вы пишете свой собственный тег, вы можете сделать что-то гораздо большее.просто с меньшим количеством аргументов:

{% mymathtag ad%}

Проверьте это для общего описания, как это сделать: Делать математику, используя шаблонный фильтр Django?

...