Có vẻ như điều này đã được trả lời trước đây, nhưng có một giải pháp thay thế. Đó là một điều để sử dụng một bộ xử lý ngữ cảnh để theo dõi một cái gì đó được xác định từ bên ngoài mẫu, nhưng đôi khi bạn muốn đếm số lần hai vòng đi qua, hoặc một cái gì đó như thế. Có một cách khác:
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)
này cho phép bạn sử dụng nó trong một khuôn mẫu như thế này:
{% 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, bạn' nhanh hơn tôi. – SingleNegationElimination
Um, nhiều chế độ xem sử dụng biến này nhưng không phải tất cả. Ngoài ra, tôi đang sử dụng cùng một mẫu cho một loại biến được xác định bởi templatetags tùy chỉnh của tôi. Các trường hợp trên chỉ đơn giản hóa, vì vậy tôi nghĩ rằng nó không thích hợp để áp dụng giải pháp của bạn như nó được. – Achimnol
Thậm chí nếu nó không được sử dụng trong mọi mẫu, nó không làm hại bất cứ thứ gì để đưa nó vào bộ xử lý ngữ cảnh ... trừ khi nó thực hiện tra cứu cơ sở dữ liệu, trong trường hợp đó nó có thể tác động đến hiệu suất trang. –