2011-08-04 24 views
2

CharFieldの選択肢のモデルクラスのフィルタリングされたリストを取得したいと思います。 2つの要素のタプルが含まれていれば、どのような繰り返しも可能です。Djangoの動的選択

コードは次のようになります:

 
    >>> x = [(m.__name__, m.__name__) for m in models.get_models() if 'WorkflowAware' in [b.__name__ for b in m.__bases__]] 
    >>> x 
    [('ActivityContent', 'ActivityContent')] 
    >>> x.__class__ 
    type 'list' 
    >>> x[0].__class__ 
    type 'tuple' 
    >>> x[0][0].__class__ 
    type 'str' 

私は管理インターフェイスに取得すべてはなし、標準CharFieldですレンダリングです:

WORKFLOWAWARE_MODELS = [(m.__name__, m.__name__) for m in models.get_models() if 'WorkflowAware' in [b.__name__ for b in m.__bases__]] 
class Workflow(models.Model): 
    """ Workflow controls who does what where """ 
    workflow_content_type = models.CharField(max_length=64, choices=WORKFLOWAWARE_MODELS, unique=True, blank=True) 

リストの内包が、このような2列のタプルのリストを返します。選択肢。

私はカットし、リスト内包管理者によって返された値を貼り付け選択肢レンダリング:私は何をしないのです

WORKFLOWAWARE_MODELS = [('ActivityContent', 'ActivityContent')] 

を??

PS tuple()は違いがありません。

答えて

4

問題は、正しいコンテキストが初期化される前にWORKFLOWAWARE_MODELS値が評価される可能性があることです。例えば。このモジュールをインポートする際、ActivityContentおよびActivityContentはまだロードされていません。 WORKFLOWAWARE_MODELSを呼び出し可能にする必要があります。ラムダを使用して。

WORKFLOWAWARE_MODELS = lambda: [(m.__name__, m.__name__) for m in models.get_models() if 'WorkflowAware' in [b.__name__ for b in m.__bases__]] 

このようにして、WORKFLOWAWARE_MODELSが呼び出されるたびに評価されます。

+0

ありがとうございました。それを働かせることができませんでした。私はジェームズ・ベネット(以下参照)からジャンゴ・スニペットを見つけることになった。 –

0
class WorkflowForm(forms.ModelForm): 
    content_type = forms.ChoiceField(choices=()) 
    def __init__(self, *args, **kwargs): 
     super(WorkflowForm, self).__init__(*args, **kwargs) 
     self.fields['content_type'].choices = [('', '---')] + WORKFLOWAWARE_MODELS()