2

我在我们的项目中使用 Django。我已经使用 Django 表单创建了一个表单。在其中一种形式中,我需要检查一个变量,并根据变量的值添加或删除一个元素。

我在初始化对象时将此变量传递给表单。IEform=MyForm(flag)

在表单类中,我正在这样做

class MyInfoForm(forms.Form):
    def __init__(self, *args,**kwargs):
        self.flag= kwargs.pop('flag', None)
        super(MyInfoForm, self).__init__(*args, **kwargs)
        print self.flag

    Firstname = forms.CharField(label=u' First name :', max_length=30)

在初始化函数中,我打印了标志并且它工作正常。但是我怎样才能访问 我尝试过的初始化之外的变量

    class MyInfoForm(forms.Form):
        myFlag=None
        def __init__(self, *args,**kwargs):
            self.flag= kwargs.pop('flag', None)
            myFlag=self.flag
            super(MyInfoForm, self).__init__(*args, **kwargs)
            print self.flag

        Firstname = forms.CharField(label=u' First name :', max_length=30)
        print myFlag

但它不起作用。

4

3 回答 3

3

class语句是一个可执行语句,它:

  1. 创建命名空间
  2. 依次执行类语句块顶层的所有代码
  3. type使用类名、命名空间和父类列表调用适当的元类(默认为)
  4. 将新创建的class对象绑定到封闭(通常是模块)命名空间中的类名

长话短说,您不能从class语句主体中访问实例属性,因为实例甚至类本身都不存在。

如果您想要在每个实例的基础上更新/添加/删除字段并根据传递给表单初始化程序的某些参数,正确的解决方案是首先调用父级的初始化程序(以确保您的表单的实例字段已正确初始化)然后做任何你必须做的事情,即:

class MyInfoForm(forms.Form):
    firstname = forms.CharField(label=u' First name :', max_length=30)
    def __init__(self, *args,**kwargs):
        self.flag= kwargs.pop('flag', None)
        super(MyInfoForm, self).__init__(*args, **kwargs)
        if self.flag:
            # XXX IMPORTANT : 
            # you want to access self.fields['fieldname']                
            # NOT self.fieldname
            self.fields["firstname"].label = "Yadda"
于 2012-07-04T10:17:14.457 回答
0
print MyInfoForm.myFlag

这个怎么样?

于 2012-07-04T09:40:42.060 回答
0

这取决于...标志的范围应该是类还是类的实例?

如果范围应该是实例(这是您第一次尝试时的样子),那么您可以通过以下方式访问它:

instance = MyInfoForm(flag)
...
instance.flag

另一方面,如果变量 flag 属于该类(意思是,对于 MyInfoForm 的每个实例只有一个 flag 值),那么您可以通过执行以下操作来访问它:

MyInfoForm.myFlag #using your second attempt

另外...您将变量声明为myFlag,并尝试打印myflag。变量名区分大小写。

于 2012-07-04T09:43:18.313 回答