2012-02-14 3 views
0

これらの2つの方法は同等です。Django Dynamic Class

方法1

class X(object): 
    a = 1 

私は同等であるかを知りたい方法2

X = type('X', (object,), dict(a=1)) 

class ObjectTable(tables.ModelTable): 

    id = tables.Column(sortable=False, visible=False) 
    societe = tables.Column(sortable=False, visible=False) 

    class Meta: 
     model = models.get_model('core', "Fournisseur") 

が、私はこれを試みたが、動作しません。

ObjectTable=type('ObjectTable',(tables.ModelTable,),dict(model=myModel)) 
ObjectTable=type('ObjectTable',(tables.ModelTable,),dict(meta.model=myModel)) 
ObjectTable=type('ObjectTable',(tables.ModelTable,),dict(meta=myModel)) 

ありがとうございます。

+0

、あなたを示すことなく、「私はXを行うにはどうすればよい」形式の質問とここに来ることが悪い形でありますこれまでの試み。 – Marcin

+0

私は結果なしで多くのことを試しました。コメントありがとう。 – Youssef

+0

それで、どの意味でこれはうまくいかなかったのですか? – Marcin

答えて

1

:真剣

def CreateForm(for_model, request=None, instance=None, user=None): 
    class _StateMachineBaseModelForm(ModelForm): 
     class Meta: 
      model = for_model 
      exclude = ('societe',) 

     def __init__(self, *args, **kwargs): 
      super(_StateMachineBaseModelForm, self).__init__(*args, **kwargs) 
      try: 
       if user: 
        self.fields['banque'].queryset = Banque.objects.filter(pays=user.get_profile().societe.pays) 
      except: 
       pass 

    if for_model: return _StateMachineBaseModelForm(request, instance=instance) 
0

正確に同じものの値をdjangoの例で見つけてください。自分で試してみてください。

Metaを綴らすべきことは、あなたのすべての例(a)は、あなたがmeta以外の任意のフィールドを作成しないので、あなたはそれを置くとして、「動作しない」(B)(C)Metaの値があるべき(旧式)クラス。

+0

問題は、メタのモデル属性です。 – Youssef

+0

@Youssef:どうしたの?あなたはすでにメンバーとクラスを作成する方法を知っています。 – Marcin

+0

はい、問題はモデルのようなメタデータを使ってクラスダイナミクスを作成する方法です。 – Youssef

0

私が始める前に、私はコメントでS. Lottに同意します。あなたはほとんど確実にこれをしたくありません。ここで

は行く:これは解決策である

# You can't create an old-style class with type, 
# so define a function that creates one. 
def make_meta_class(): 
    class Meta: 
     model = models.get_model('core', "Fournisseur") 
    return Meta 

# Create the dictionary (remember to include the fields as well as the meta class) 
d=dict(, 
    Meta=make_meta_class(), 
    id=tables.Column(sortable=False, visible=False) 
    societe=tables.Column(sortable=False, visible=False) 
) 
# Create the class dynamically 
ObjectTable=type('ObjectTable', (tables.ModelTable,), d) 
+0

通常の構文を使って 'Meta'を定義していれば、OPが求めているものは何も得られませんでした。それは、彼はそれをする方法も自分自身のために働くことができるはずだ。 – Marcin

+0

公正なポイント。私は答えを更新しました。 – Alasdair

関連する問題