On dirait que cela a déjà été répondu, mais il existe une alternative. C'est une chose d'utiliser un processeur de contexte pour garder une trace de quelque chose de défini à l'extérieur du modèle, mais parfois vous voulez compter le nombre de fois que deux boucles traversent, ou quelque chose comme ça. Il y a une autre façon:
class GlobalVariable(object):
def __init__(self, varname, varval):
self.varname = varname
self.varval = varval
def name(self):
return self.varname
def value(self):
return self.varval
def set(self, newval):
self.varval = newval
class GlobalVariableSetNode(template.Node):
def __init__(self, varname, varval):
self.varname = varname
self.varval = varval
def render(self, context):
gv = context.get(self.varname, None)
if gv:
gv.set(self.varval)
else:
gv = context[self.varname] = GlobalVariable(self.varname, self.varval)
return ''
def setglobal(parser, token):
try:
tag_name, varname, varval = token.contents.split(None, 2)
except ValueError:
raise template.TemplateSyntaxError("%r tag requires 2 arguments" % token.contents.split()[0])
return GlobalVariableSetNode(varname, varval)
register.tag('setglobal', setglobal)
class GlobalVariableGetNode(template.Node):
def __init__(self, varname):
self.varname = varname
def render(self, context):
try:
return context[self.varname].value()
except AttributeError:
return ''
def getglobal(parser, token):
try:
tag_name, varname = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("%r tag requires arguments" % token.contents.split()[0])
return GlobalVariableGetNode(varname)
register.tag('getglobal', getglobal)
class GlobalVariableIncrementNode(template.Node):
def __init__(self, varname):
self.varname = varname
def render(self, context):
gv = context.get(self.varname, None)
if gv is None:
return ''
gv.set(int(gv.value()) + 1)
return ''
def incrementglobal(parser, token):
try:
tag_name, varname = token.contents.split(None, 1)
except ValueError:
raise template.TemplateSyntaxError("%r tag requires arguments" % token.contents.split()[0])
return GlobalVariableIncrementNode(varname)
register.tag('incrementglobal', incrementglobal)
Cela vous permet de l'utiliser dans un modèle comme celui-ci:
{% setglobal ii 0 %}
...
{% for ... %}
{% incrementglobal ii %}
current={% getglobal ii %}
{% endfor %}
...
{% for ... %}
{% incrementglobal ii %}
current={% getglobal ii %}
{% endfor %}
...
total of 2 loops={% getglobal ii %}
...
{% setglobal ii 0 %}
...
do something else now that {% getglobal ii %} is back to 0
+1, vous re plus vite que moi. – SingleNegationElimination
Euh, de nombreuses vues utilisent cette variable mais pas toutes. En outre, j'utilise le même modèle pour un autre type de variables définies par mes templatetags personnalisés. Le cas ci-dessus est simplement simplifié, donc je pense qu'il n'est pas approprié d'adopter votre solution telle qu'elle est. – Achimnol
Même s'il n'est pas utilisé dans tous les gabarits, il ne fait aucun mal à le placer dans un processeur de contexte ... à moins qu'il ne fasse une recherche de base de données, auquel cas cela peut affecter les performances du site. –