【问题标题】:Django: local variable 'five_image' referenced before assignmentDjango:分配前引用的局部变量'five_image'
【发布时间】:2014-09-26 18:59:25
【问题描述】:

我正在使用get_context_data 方法在 SessionWizardView 中返回变量。但是,当我尝试返回 five_imagesix_image 或 `seven_image' 时,我不断收到以下错误。

赋值前引用的局部变量“five_image”

我无法理解的是,这些变量中的每一个都明确地分配了一个值,我知道当我将它打印到终端时它会起作用。

我要做什么

我想存储显示在表单第 5、6 和 7 页上的图像名称,以供以后页面使用。

path_one_images = ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg/', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']


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

        if self.steps.current in ['5','6','7','9','10','11','13','14','15']:
            display_image = random.choice(path_one_images)   

            if self.steps.current == '5':
                five_image = display_image

            elif self.steps.current == '6':
                six_image = display_image

            elif self.steps.current == '7':
                seven_image = display_image    

            steps = ['5','6','7','9','10','11','12','13','14','15']              
            context.update({'display_image': display_image,
                            'five_image': five_image,
                            'six_image': six_image,
                            'seven_image': seven_image,
                            'steps': steps
                             })                 
            path_one_images.remove(display_image)

        if self.steps.current in ['8','12','16']:
            print '\n\n\n\nYou are on step', self.steps.current

        return context 

任何帮助都一如既往,非常感谢。

【问题讨论】:

  • 您没有在 if 语句之外初始化各种局部变量。因此问题

标签: django python-2.7 django-forms


【解决方案1】:

那些 if 语句是互斥的。 绝对不可能他们三个都可以被赋值:只有一个可以。其他的将是未定义的。

与其创建这些变量,不如直接在上下文中分配键:

        if self.steps.current == '5':
            context['five_image'] = display_image

        elif self.steps.current == '6':
            context['six_image'] = display_image

        elif self.steps.current == '7':
            context['seven_image'] = display_image 

【讨论】:

    【解决方案2】:

    只要 self.steps.current 不等于“5”,就不会创建变量 Five_image。然后在 context.update 中,您尝试使用不存在的变量。您需要重新编写逻辑或在 if 语句之前创建变量。以下将修复错误,但我仍然认为您需要仔细检查您的逻辑并进行一些重构。

    path_one_images = ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg/', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']
    
    
    class SurveyWizardOne(SessionWizardView):                      
        def get_context_data(self, form, **kwargs):
            context = super(SurveyWizardOne, self).get_context_data(form, **kwargs)         
            five_image = None
            six_image = None
            seven_image = None
    
            if self.steps.current in ['5','6','7','9','10','11','13','14','15']:
                display_image = random.choice(path_one_images)   
                if self.steps.current == '5':
                    five_image = display_image
    
                elif self.steps.current == '6':
                    six_image = display_image
    
                elif self.steps.current == '7':
                    seven_image = display_image    
    
                steps = ['5','6','7','9','10','11','12','13','14','15']              
                context.update({'display_image': display_image,
                                'five_image': five_image,
                                'six_image': six_image,
                                'seven_image': seven_image,
                                'steps': steps
                                 })                 
                path_one_images.remove(display_image)
    
            if self.steps.current in ['8','12','16']:
                print '\n\n\n\nYou are on step', self.steps.current
    
            return context 
    

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      相关资源
      最近更新 更多