2016-01-20 45 views
0

https://djangosnippets.org/snippets/2619/爲什麼計數器標籤在django中無法正常工作?

根據上面的代碼片段,如果我們在初始化後訪問模板中的{{ counter_var }}它應該返回以前的計數。但在我的情況下,它不會返回任何東西。

模板代碼

<div class="question_number pull-left">Q{% counter %}. </div> 
... 
<script>var no_of_questions={{ counter_var }}</script> 


即使我試圖通過從視圖中設置上下文變量counter_var作爲{'counter_var':0,...}則返回 '0'。

如何讓它工作,以便返回前一個計數器?
例如

Q1. 
Q2. 

然後counter_var應該返回2而不是任何東西。

Django的:1.8.6
的Python:2.7

編輯:
模板登記標籤,並正確Q<count>.打印除了counter_var

+0

你註冊了標籤嗎?從你的問題中不清楚你是否做到了,因爲如果你所做的只是在你的模板中使用'counter',那麼它將不起作用。 – CadentOrange

+0

是的,我已經註冊並且除了count_var外,它給出了正確的計數。 –

+0

如果您使用'',使用雙引號,它會進行任何更改嗎? – doru

回答

0

經過一段時間的調試後,可以使用代碼來使其工作。

#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上添加。