簡體   English   中英

如何在Django SessionWizardView中重新初始化會話變量

[英]How to re-initialize a session variable in a Django SessionWizardView

我正在使用Djago SessionWizardView將調查應用程序划分為多個頁面。 下面的代碼用於從每個步驟的PATH_ONE_IMAGES列表中隨機選擇一個圖像,將其顯示給用戶,然后將其從列表中刪除,以便第二次無法選擇它,直到所有圖像都消失為止。

這很好,但是當我在同一個瀏覽器中重新訪問調查時,盡管我在開始時重新初始化它,但PATH_ONE_IMAGES仍然是空的。 如果我刪除瀏覽器歷史記錄或每次使用它時使用不同的瀏覽器,它工作正常但我在使用相同的瀏覽器重新訪問應用程序時仍然遇到以下錯誤。

/ surveyone /的IndexError /

列表索引超出范圍

我只是學習如何使用Session變量,但我認為通過重新初始化PATH_ONE_IMAGES包含所有9個jpgs,就像我在SessionWizardView頂部SessionWizardView那樣,列表每次都會“重新填充”。

PATH_ONE_IMAGES = self.request.session.get('path_one_images', ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']) 

這不正確嗎?

從下面的調試腳本中我可以看到,第一次使用“全新”瀏覽器訪問應用程序時, PATH_ONE_IMAGES中存儲了9個項目。

logger.debug('\n\nThis is the available list of PATH_ONE_IMAGES in 5: %s', PATH_ONE_IMAGES)

然后我隨機選擇其中一個PATH_ONE_IMAGES ,將其顯示給用戶,然后將其從列表中刪除。

first_image = random.choice(PATH_ONE_IMAGES)   
PATH_ONE_IMAGES.remove(first_image)               
context['display_image'] = first_image

我的問題是,當我第二次使用相同的瀏覽器重新訪問時,列表是空的,即使我在頂部重新初始化它。

問題:即使使用相同的瀏覽器,每次用戶重新訪問應用程序時,如何重新填充PATH_ONE_IMAGES列表?

如果我使用錯誤的術語,我道歉,我希望你能理解我的意思。

注意:由於先前使用全局變量和多線程處理的問題,我需要將PATH_ONE_IMAGES存儲為會話變量。

我的守則

class SurveyWizardOne(SessionWizardView):                             
    def get_context_data(self, form, **kwargs):
        context = super(SurveyWizardOne, self).get_context_data(form, **kwargs)                      
        step = int(self.steps.current)        

        PATH_ONE_IMAGES = self.request.session.get('path_one_images', ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg'])        
        images = self.request.session.get('images', [])
        slider_DV_values = self.request.session.get('slider_DV_values', [])

        if step in range (5, 19):   
            self.request.session['path_one_images'] = PATH_ONE_IMAGES               

            self.request.session['images'] = images
            self.request.session['slider_DV_values'] = slider_DV_values

            if step == 5:
                logger.debug('\n\nThis is the available list of PATH_ONE_IMAGES in 5: %s', PATH_ONE_IMAGES)

                first_image = random.choice(PATH_ONE_IMAGES)   
                PATH_ONE_IMAGES.remove(first_image)               
                context['display_image'] = first_image                                 
                images.insert(0, first_image)   
                self.request.session['first_image'] = images[0] 
                self.request.session.get('first_image')                          


            elif step == 6:
                logger.debug('\n\nThis is the available list of PATH_ONE_Images in 6: %s', PATH_ONE_IMAGES)

                second_image = random.choice(PATH_ONE_IMAGES)   
                PATH_ONE_IMAGES.remove(second_image)
                context['display_image'] = second_image                                 
                images.insert(1, second_image)   
                self.request.session['second_image'] = images[1] 
                self.request.session.get('second_image')    
                ....
                ....

任何幫助,一如既往,非常感謝

您應該僅在第一個向導步驟初始化變量path_one_images

....

step = int(self.steps.current)    
if step == 0:
    self.request.session['path_one_images'] = ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']    

PATH_ONE_IMAGES = self.request.session.get('path_one_images', [])        
images = self.request.session.get('images', [])
slider_DV_values = self.request.session.get('slider_DV_values', [])

if step in range (5, 19):   
    # You don't need to reinit here your session variable
    # self.request.session['path_one_images'] = PATH_ONE_IMAGES               

....

也許你需要對imagesslider_DV_values變量采用相同的方法。

實際上,當您使用相同的瀏覽器訪問時,您沒有初始化,實際上您使用的是在第9th步保存的相同PATH_ONE_IMAGES 發生這種情況是因為如果這行代碼 -

PATH_ONE_IMAGES = self.request.session.get('path_one_images', ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']) 

請注意,如果提供的鍵(第一個參數)不存在於字典中,則get僅返回第二個參數,它既不檢查值是什么,也不使用提供的默認值(第二個參數)初始化字典。 因此,使用此行代碼,會話中的path_on_images的值永遠不會更新,它只會檢查該值是否存在 - 它不會檢查空值,無或其他任何內容。

我將描述一下這個場景,你的案例中發生了什么 -

  1. 當您第一次打開瀏覽器時, session沒有任何內容。 所以第一次上面的代碼將分配['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']PATH_ONE_IMAGES

  2. 繼續,直到PATH_ONE_IMAGES為空....沒有錯誤..

  3. 現在您刷新了瀏覽器,但是記住session沒有被清除以僅刷新瀏覽器,因此您保存在會話中的PATH_ONE_IMAGE不會被清除,因此包含在最后一步保存的項目的空列表。

因此,當它是第一步時,你必須以某種方式清除變量。 您可以獲取@salvatore提供的代碼示例,並添加一個檢查以僅在步驟0初始化它。

step = int(self.steps.current)    
if step == 0:
    self.request.session['path_one_images'] = ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']    

PATH_ONE_IMAGES = self.request.session.get('path_one_images', [])        
images = self.request.session.get('images', [])
slider_DV_values = self.request.session.get('slider_DV_values', [])`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM