On Feb 7, 8:30 am, toomim <[EMAIL PROTECTED]> wrote:
> On Feb 6, 11:05 pm, toomim <[EMAIL PROTECTED]> wrote:
>
> > I don't understand, how do I get {{sep}} to change from ',' to 'and'
> > and then to the empty string in the last 2 iterations of the loop,
> > without using a bunch of if statements? (And since we're using
> > variables, a {% where %} clause?)
You could write a custom tag... The code below needs to be put in a
file called dktags.py (or you need to change the {% load dktags %}
line), in a directory named templatetags in the same directory that
contains your model.py and views.py files. The templatetags directory
also needs to contain an empty file named __init__.py
The output is
John, Paul, Ringo and George
There's virtually no error analysis and I can't imagine anything good
would happen if you try to use it on a sequence with less than two
items... I'm leaving that as an exercise for the reader ;-)
enjoy,
-- bjorn
from django import template
register = template.Library()
class CommaListNode(template.Node):
def __init__(self, var, lst, sepvar, first, last, nodes):
self.var = var
self.lst = lst
self.sepvar = sepvar
self.first = first[1:-1] # strip quotes
self.last = last[1:-1]
self.nodes = nodes
def __rendernodes(self, ctx, loopvar, sepvar):
ctx[self.var] = loopvar
ctx[self.sepvar] = sepvar
return self.nodes.render(ctx)
def render(self, ctx):
res = []
# lookup what we're looping over and convert to a list
# so that we can do negative indexing...
lst = list(ctx[self.lst])
for item in lst[:-2]:
res.append(self.__rendernodes(ctx, item, self.first))
res.append(self.__rendernodes(ctx, lst[-2], self.last))
res.append(self.__rendernodes(ctx, lst[-1], ''))
return ''.join(res)
@register.tag
def commalist(parser, token):
try:
COMMALIST, var, IN, lst, WITH, sepvar, first, FINALLY, last =
token.split_contents()
nodes = parser.parse(['endcommalist'])
parser.delete_first_token()
except:
raise templateTemplateSyntaxError("something's wrong")
return CommaListNode(var, lst, sepvar, first, last, nodes)
if __name__ == "__main__":
from django.template import Context, Template
from datakortet.tiktok.models import *
t = Template('''
{% load dktags %}
{% commalist n in names with sep ", " finally " and " %}{{n}}
{{sep}}{% endcommalist %}
''')
ctx = Context({'names': 'John Paul Ringo George'.split()})
print t.render(ctx)
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---