繁体   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