How to pass the result of a tag to a filter in Django?
How do开发者_如何转开发 I pass the result of a tag to a filter in Django?
e.g.
{{ {% widthratio a b c %}|add: 2 }}
You cannot, unless the tag knows how to modify the context (those usually have xxx as variable
syntax available). If it doesn't, you can write a wrapper (as a custom tag) that will.
Just use the "as" keyword:
{% widthratio a b c as result %} {{ result | add: 2 }}
The correct way to do this is to write your own tag:
{% widthratio_add a b c d %}
Where the tag you write does the same logic as widthratio, then adds the number to it.
Though, i suspect you're only trying to do this because django doesn't allow basic math in the template beyond "add", and by the time you are writing your own tag you could do something far more straightforward with fewer arguments:
{% mymathtag a d %}
Check out this for a general description of how to do this: Do math using Django template filter?
Here is my custom template tag solution:
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)
You can use it in your template:
{% widthratioextra a b c d %}
Adding custom template tags to your application is relatively easy, if you don't know how to do it, here is relevant part of the manual: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
精彩评论