Python 如何在Django SessionWizardView中重新初始化会话变量

Python 如何在Django SessionWizardView中重新初始化会话变量,python,django,python-2.7,session-variables,Python,Django,Python 2.7,Session Variables,我正在使用Djago将调查应用程序划分为多个页面。下面的代码用于在每个步骤上从路径\u one\u IMAGES列表中随机选择一个图像,将其显示给用户,然后将其从列表中删除,以便在所有图像消失之前,无法再次选择该图像 这很好,但是当我在同一个浏览器中重新访问调查时,PATH\u ONE\u IMAGES仍然是空的,尽管我在开始时重新初始化了它。如果我删除了浏览器历史记录,或者每次使用不同的浏览器时都使用了不同的浏览器,那么它可以正常工作,但是当我使用相同的浏览器重新访问应用程序时,会不断出现以下

我正在使用Djago将调查应用程序划分为多个页面。下面的代码用于在每个步骤上从
路径\u one\u IMAGES
列表中随机选择一个图像,将其显示给用户,然后将其从列表中删除,以便在所有图像消失之前,无法再次选择该图像

这很好,但是当我在同一个浏览器中重新访问调查时,
PATH\u ONE\u IMAGES
仍然是空的,尽管我在开始时重新初始化了它。如果我删除了浏览器历史记录,或者每次使用不同的浏览器时都使用了不同的浏览器,那么它可以正常工作,但是当我使用相同的浏览器重新访问应用程序时,会不断出现以下错误

索引器at/surveyone/

列表索引超出范围

我只是在学习如何使用会话变量,但我认为通过重新初始化
PATH\u ONE\u图像
作为包含所有9个JPG的JPG,就像我在下面的
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\u ONE\u IMAGES
中存储了9个项目

logger.debug('\n\nThis is the available list of PATH_ONE_IMAGES in 5: %s', PATH_ONE_IMAGES)
然后,我随机选择其中一个
PATH\u one\u图像
,将其显示给用户,然后将其从列表中删除

first_image = random.choice(PATH_ONE_IMAGES)   
PATH_ONE_IMAGES.remove(first_image)               
context['display_image'] = first_image
我的问题是,当我再次使用同一浏览器访问时,列表是空的,即使我在顶部重新初始化它

问题:即使使用相同的浏览器,每次用户重新访问应用程序时,我如何重新填充我的
路径\u ONE\u图像
列表

很抱歉,如果我使用了错误的术语,我希望你能理解我的意思

注意:由于以下原因,我需要将
PATH\u ONE\u图像
存储为会话变量

我的代码

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\u one\u 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               

....

也许你需要对
图像
滑块DV\u值
变量采用相同的方法。

实际上,当你使用未初始化的相同浏览器访问时,你实际上使用的是在
第9步
保存的相同的
路径。这是因为如果这行代码-

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
仅在提供的键(第一个参数)不在字典中时返回第二个参数,它既不检查值是什么,也不使用提供的默认值(第二个参数)初始化字典。因此,使用此行代码,会话中图像上路径的值永远不会更新,它只会检查该值是否存在-不会检查空值、无值或其他任何内容

我将描述场景,你的案例中发生了什么-

  • 第一次打开浏览器时,
    会话中没有任何内容。因此,上述代码第一次将
    ['P1D1.jpg','P2D2.jpg','P3D3.jpg','P4D4.jpg','P5D5.jpg','P6D6.jpg','P7D7.jpg','P8D8.jpg','P9D9.jpg']
    分配到
    内部
    路径\图像中

  • 继续,直到
    PATH\u ONE\u IMAGES
    为空。。。。没有错误

  • 现在您刷新了浏览器,但请记住,
    会话
    不会因为仅刷新浏览器而被清除,因此保存在会话中的
    路径_ONE_图像
    不会被清除,因此包含上一步保存的项目的空列表

  • 因此,在第一步时,您必须清除变量。您可以获取@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', [])`