2014-07-09 96 views
1

我是Python新手,正在嘗試Django。我在頁面請求中看到了對我而言奇怪的行爲。我寫了自己的類,它擴展了內置的TemplateView類,以便我可以覆蓋該類的get_context_data方法。在我的這個方法的新版本,我在更改context像這樣:Python列表追加兩次元素

class adminUpload(TemplateView): 
    template_name = "adminupload.tpl.html" 

    def get_context_data(self,**kwargs): 
    context = super(TemplateView, self).get_context_data(**kwargs) 

    context['js_paths'] = webapp.settings.template['js_paths'] 

    logger.debug('adding') 
    logger.debug(context['js_paths']) 

    context['js_paths'].append('/static/path/to/js/file.js') 

    logger.debug(context['js_paths']) 

    return context 

而且在我的網址路由器我傳遞請求這個類,像這樣:

url(r'^adminupload$', front.adminUpload.as_view()), 

出於某種原因,每次我重新加載頁面時,我的context['js_paths']列表將獲得更長的一個項目,'/static/path/to/js/file.js',這樣如果我重新加載頁面5次,列表將包含5個項目,全部附加到該值的末尾。我可以驗證該方法每個請求只被調用一次,並且通過檢查我設置的調試日誌,該列表在每次請求後似乎會變得更大。

我必須缺少一些非常簡單的東西,某種緩存,不瞭解有關模板上下文的內容。任何正確的方向點將不勝感激。

+0

是'webapp.settings'指您的應用程序的設置?考慮使用'from django.conf import settings'來代替。 –

+0

刪除'context ['js_paths']。append('/static/path/to/js/file.js')'或者檢查列表上的'/ static/path/to/js/file.js' 。 – furas

回答

2
context['js_paths'] = webapp.settings.template['js_paths'] 
context['js_paths'].append('/static/path/to/js/file.js') 

創建一個新的標識符到同一個列表,然後附加到該列表。你不復制列表。

所以每次get_context_data被稱爲webapp.settings.template['js_paths']被追加到。

你可以做什麼,而不是爲:

context['js_paths'] = webapp.settings.template['js_paths'] + ['/static/path/to/js/file.js'] 
+0

謝謝,這個工作,非常有意義,我會錯過PHP爲我釉的東西。我會標記爲幾個答案。我仍然不明白爲什麼這個名單越來越大。在請求結束時並不是所有這些變量都被破壞了嗎? – oliakaoil

+0

我懷疑'webapp.settings'在你運行它的任何方式下都會爲django進程的生命期保持實例化。 – MattH

+0

再次感謝您,我認爲您可能會做些什麼。我正在使用帶有文件套接字連接的Nginx和uWSGI。我想我需要多讀一些關於這些過程如何實際工作的信息。 – oliakaoil