2015-04-17 44 views
1

我有一个Python列表蟒蛇全局名称没有被定义

readonly = ['name', 'description']

,我想在几个方法来使用。不过,我得到一个全局变量没有定义错误

class EditForm(ModelForm): 
    # When editing form we want to disable multiple fields 
    # Admin users can edit existing items via admin interface 
    readonly = ['name', 'description'] 

    def __init__(self, *args, **kwargs): 
     super(EditForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     for ro_field in readonly: 
      if instance and instance.pk: 
       self.fields[ro_field].widget.attrs['readonly'] = True 

如何保持列表本地和能够使用它在__init__功能和随后的方法不重复设定各项功能列表

回答

1

当你像你这样写代码

class EditForm(ModelForm): 
    # When editing form we want to disable multiple fields 
    # Admin users can edit existing items via admin interface 
    readonly = ['name', 'description'] 

    def __init__(self, *args, **kwargs): 
     super(EditForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     for ro_field in readonly: 
      if instance and instance.pk: 
       self.fields[ro_field].widget.attrs['readonly'] = True 

你正在创建一些你可以调用静态变量的东西。接取它,你必须使用后续sintax

ClassName.variable 

self.variable

因此,要访问它,只是做:声明

readonly = ['name', 'description'] 
之间的差异

class EditForm(ModelForm): 
    # When editing form we want to disable multiple fields 
    # Admin users can edit existing items via admin interface 
    readonly = ['name', 'description'] 

    def __init__(self, *args, **kwargs): 
     super(EditForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     for ro_field in EditForm.readonly: 
      if instance and instance.pk: 
       self.fields[ro_field].widget.attrs['readonly'] = True 

And

self.readonly = ['name', 'description'] 

第二种情况是否意味着该属性属于您实例化的对象,因此每个对象都有自己的readonly列表,如果您更改它或其他内容,则必须为每个对象更改它。

在第一种情况下,属性属于类,所以它在所有对象中都是相等的。

+1

您也可以使用'self.attr'访问类的实例方法中的属性(但如果你*分配to *'self.attr',你创建一个影射类属性的实例属性)。 – jonrsharpe

1

readonly在这里是您的EditForm类的属性。您可以访问它或者直通类(EditForm.readonly)或 - 更好 - 直通实例本身:

class EditForm(ModelForm): 
    # When editing form we want to disable multiple fields 
    # Admin users can edit existing items via admin interface 
    readonly = ['name', 'description'] 

    def __init__(self, *args, **kwargs): 
     super(EditForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance and instance.pk: 
      for ro_field in self.readonly: 
       self.fields[ro_field].widget.attrs['readonly'] = True 

这是更好,因为它避免了硬编码的类名进入方法来访问它直通的实例,将更好的支持继承(如果您继承了EditForm并且想要在您的子类中覆盖readonly)。

而且我把if instance and instance.pk测试循环之前 - 无需重新测试,如果每次迭代;)

相关问题