18👍
✅
If you want to add a new variable (ie some_list
), you’ll need access to the template’s context, so simple_tag
won’t be enough.
For me, the first approach is to try to do this sort of work in the view, in order to keep the templates as simple as possible.
If that’s not appropriate, you’ll have to write the tag manually, like this:
@register.tag
def make_list(parser, token):
bits = list(token.split_contents())
if len(bits) >= 4 and bits[-2] == "as":
varname = bits[-1]
items = bits[1:-2]
return MakeListNode(items, varname)
else:
raise template.TemplateSyntaxError("%r expected format is 'item [item ...] as varname'" % bits[0])
class MakeListNode(template.Node):
def __init__(self, items, varname):
self.items = map(template.Variable, items)
self.varname = varname
def render(self, context):
context[self.varname] = [ i.resolve(context) for i in self.items ]
return ""
And use it like this to create a new variable some_list
:
{% make_list var1 var2 var3 as some_list %}
Feel free to give it a better name!
3👍
I played around a bit and came up with a tag that can accept a variable number of arguments and convert them into a list.
@register.tag('to_list')
def to_list(_parser, token):
try:
parts = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError, \
"%r tag requires at least one argument" % token.contents.split()[0]
return AsListNode(parts[1:])
class AsListNode(template.Node):
def __init__(self, parts):
self.parts = map(lambda p: template.Variable(p), parts)
def render(self, context):
resolved = []
for each in self.parts:
resolved.append(each.resolve(context))
return resolved
Template:
<p>{% to_list var1 var2 var3 %}</p>
Update
@Will’s solution is better. It lets you save the resulting list using another variable so that you can operate on it later.
- How do I change the value of submitted form data using form object and redisplay it?
- Parameter order for unittest.TestCase.assertEqual
- Find out what port Django instance is running on?
- Valid use case for django admin?
- Polymorphism in Django models
Source:stackexchange.com