2017-01-31 14 views
2

フォームを継承して簡単なフォームを直接作成できます。しかし、管理者が指定したキー値に基づいてフォームを動的に作成したい。私の現在のアプローチがあるかもしれないdjangoはカスタムフォームを作成します

from django import forms 
class CommentForm(forms.Form): 
    name = forms.CharField(label='name') 
    url = forms.URLField(label='url') 

:私は下のクラスベースのフォームの作成に相当し、フォームを作成することができますどのように上に示したマップに基づいて

[ 
    { 
    "key": "name", 
    "value": "CharField" 
    }, 
    { 
    "key": "url", 
    "value": "URLField" 
    } 
] 

:ユーザーのようにマップを提供し、考えてみましょう各キーと値のペアを反復し、HTML形式を手動で作成します。クラス定義を記述することなく、djangoで動的フォームを作成することは可能ですか?

+0

ここで、余分な属性( 'label'、' choices'など)を取得していますか? – schwobaseggl

+0

今のところ、keyの値を取ることができます。しかし、マップに基づいてメタデータを追加します。 – Pant

答えて

1

はい、フォームの機能でこれを行うことができます。

フォームを作成するときに、追加のキーワード引数としてマッピング配列を渡してから、initメソッドをsuperから呼び出す前にkwargsからポップします。

これを使用すると、フィールドをフォームに動的に追加できます。

class CommentForm(forms.Form): 

    def __init__(self , *args, **kwargs): 
     field_mapping_array = kwargs.pop('field_mapping_array') 
     super(CommentFrom, self).__init__(*args, **kwargs)   

     for field_type in field_mapping_array: 
      field_name = field_type['key'] # make sure keys are unique 
      if field_type[value] == "CharField": 
       self.fields[field_name] = form.CharField(...extra args here)  
      elif field_type['value'] == 'UrlField' : 
       self.fields[field_name] = form.UrlField(...extra args here) 
      elif .... map other field types here.... 

フォームを作成するときに、field_mapping_arrayをフォームクラスに渡します。

field_mapping = [ 
    { 
     "key": "name", 
     "value": "CharField" 
    }, 
    { 
     "key": "url", 
     "value": "URLField" 
    } 
] 
comment_form = CommentForm(field_mapping_array=field_mapping) 
関連する問題