2012-07-04 4 views
2

Я использую Django для нашего проекта. И я создал форму с использованием форм Django. В одной из форм мне нужно проверить переменную и на основе значения переменной, которую мне нужно добавить или удалить элемент.Переменная инициализации класса Python для сторонних переменных

Я передаю эту переменную форме, когда объект инициализирован. т.е. form=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 

но не работает.

+0

Проверьте свой отступ во втором примере. –

+0

@ Даниэль Я исправил это.На самом деле это могло произойти, когда я скопировал и вставил код .... – Nick

ответ

3

class утверждения является исполняемым утверждением, что:

  1. создает пространство имен
  2. Execute, последовательно, весь код на верхнем уровне блока операторов класса
  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" 
+0

Спасибо, что я искал. И спасибо за подробности тоже – Nick

0

Это зависит от того, должен ли объем флага быть классом или экземпляром класса?

Если объем должен быть экземпляр (это то, что кажется с первого раза), то доступ к нему, выполнив:

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

Если, с другой стороны, переменная флаг принадлежит класс (а значит, есть только одно значение для флага для каждого экземпляра MyInfoForm), то вы можете получить доступ к нему, выполнив:

MyInfoForm.myFlag #using your second attempt 

Кроме того ... вы объявить переменную как myFlag и пытается печать myflag. Имена переменных чувствительны к регистру.

+0

Извините, что в моем втором примере была ошибка с отступом. Я хочу получить доступ к значению myFlag сразу после функции init. Я хочу инициализировать переменную myFlag через init и использовать ее позже. – Nick

Смежные вопросы