为什么计数器标签在 Django 中没有按预期工作?
Why counter tag is not working as expected in django?
https://djangosnippets.org/snippets/2619/
根据上面的代码片段,如果我们在初始化后访问模板中的 {{ counter_var }}
,它应该 return 以前的计数。但在我的例子中它没有 return 任何东西。
模板代码
<div class="question_number pull-left">Q{% counter %}. </div>
...
<script>var no_of_questions={{ counter_var }}</script>
即使我尝试通过将视图中的上下文变量 counter_var 设置为 {'counter_var':0,...}
然后它 returns '0'.
如何让它工作以使其成为 return 之前的计数器?
例如
Q1.
Q2.
那么 counter_var
应该 return 2 而不是什么都没有。
Django: 1.8.6
Python: 2.7
编辑:
模板标签已注册并且正确打印 Q<count>.
除了 counter_var
。
调试一段时间后,可以使用此代码使其正常工作。
#Adapted from https://djangosnippets.org/snippets/2619/
@register.tag(name='counter')
def do_counter(parser, token):
"""
Counter tag. Can be used to output and increment a counter.
Usage:
- {% counter %} to output and post-increment the counter variable
- {% counter reset %} to reset the counter variable to 1
- {% counter last %} to access the last counter variable without incrementing
"""
try:
tag_name, request = token.contents.split(None, 1)
except ValueError:
request = None
if request == 'reset':
reset = True
last = False
elif request == 'last':
last = True
reset = False
else:
reset = False
last = False
return CounterNode(reset, last)
class CounterNode(template.Node):
def __init__(self, reset, last):
self.reset = reset
self.last= last
def render(self, context):
# When initializing or resetting, set counter variable in render_context to 1.
if self.reset or ('counter' not in context.render_context):
context.render_context['counter'] = 1
# When resetting, we don't want to return anything
if self.reset:
return ''
# When ask for last, return previous count
if self.last:
return context.render_context['counter']-1
counter = context.render_context['counter']
# Increment counter
context.render_context['counter'] += 1
# Return counter number
return counter
问题是在最新的 django(至少 1.8.6)中,上下文变量不能使用模板标签更新,所以我必须访问在渲染阶段创建的 render_context 变量。
我已添加 Guthub gist。
https://djangosnippets.org/snippets/2619/
根据上面的代码片段,如果我们在初始化后访问模板中的 {{ counter_var }}
,它应该 return 以前的计数。但在我的例子中它没有 return 任何东西。
模板代码
<div class="question_number pull-left">Q{% counter %}. </div>
...
<script>var no_of_questions={{ counter_var }}</script>
即使我尝试通过将视图中的上下文变量 counter_var 设置为 {'counter_var':0,...}
然后它 returns '0'.
如何让它工作以使其成为 return 之前的计数器?
例如
Q1.
Q2.
那么 counter_var
应该 return 2 而不是什么都没有。
Django: 1.8.6
Python: 2.7
编辑:
模板标签已注册并且正确打印 Q<count>.
除了 counter_var
。
调试一段时间后,可以使用此代码使其正常工作。
#Adapted from https://djangosnippets.org/snippets/2619/
@register.tag(name='counter')
def do_counter(parser, token):
"""
Counter tag. Can be used to output and increment a counter.
Usage:
- {% counter %} to output and post-increment the counter variable
- {% counter reset %} to reset the counter variable to 1
- {% counter last %} to access the last counter variable without incrementing
"""
try:
tag_name, request = token.contents.split(None, 1)
except ValueError:
request = None
if request == 'reset':
reset = True
last = False
elif request == 'last':
last = True
reset = False
else:
reset = False
last = False
return CounterNode(reset, last)
class CounterNode(template.Node):
def __init__(self, reset, last):
self.reset = reset
self.last= last
def render(self, context):
# When initializing or resetting, set counter variable in render_context to 1.
if self.reset or ('counter' not in context.render_context):
context.render_context['counter'] = 1
# When resetting, we don't want to return anything
if self.reset:
return ''
# When ask for last, return previous count
if self.last:
return context.render_context['counter']-1
counter = context.render_context['counter']
# Increment counter
context.render_context['counter'] += 1
# Return counter number
return counter
问题是在最新的 django(至少 1.8.6)中,上下文变量不能使用模板标签更新,所以我必须访问在渲染阶段创建的 render_context 变量。
我已添加 Guthub gist。