2016-10-13 45 views
2

私はプログラムを持つデータベースを作成しており、これらのプログラムにはリスクがあります。背景情報:プログラム(祖父母)には、複数のカテゴリー(子)を持つ複数の特性(親)があります。私はすでにこれらを含むデータベースを構築しましたが、特定のプログラムにリスクを追加したいと考えています。Django - 外部キーに基づく動的フォームフィールド

たとえば、私はプログラム1に追加したいリスク1を持っています。次の質問に答える必要があります。リスク1の特徴は?これに答えるために、私は動的フォームフィールドを構築したいと考えています。 (特性の量は、任意の数だけでなく、各特性が有するカテゴリーの量にもよる)。

このようなフォームを作成するにはどうすればよいですか?私はフォームセットを試しましたが、実用的な方法でそれらを実装する方法はわかりません(私はまだPythonで少し新しいです)。

これはどのように実装したいのかのプリントスクリーンです:https://gyazo.com/40c448c0096a9ec5da751ba9883dc912
しかし、私は何をすべきか分かりません。 (ドロップダウンメニューの可能な回答は、その特定の特性に対応するカテゴリです)。 これは私が取得していますものです:私は私の答えを見つけた

# views.py 
def risk_create(request): 
program = get_object_or_404(Program, id=20) 
RiskFormSet = formset_factory(RiskForm, ... 
    ... extra=len(Program.objects.get(id=program.id).char_set.all())) 
context = { 
    'title': 'New Risk', 
    'form': RiskFormSet 
} 
return render(request, 'risk_form.html', context) 


# forms.py 
class RiskForm(forms.Form): 
for char in Program.objects.get(id=20).char_set.all(): 
    char = forms.ModelChoiceField(char.cat_set.all(), label=char) 

https://gyazo.com/25fd18e2f31e6931bfd3639ce4be632c

は、これは私がこれまで持って対応するコードです。

class RiskForm(forms.Form): 
def __init__(self, *args, **kwargs): 
    programid = kwargs.pop('programid', None) 
    super(RiskForm, self).__init__(*args, **kwargs) 
    for i in range(0,len(Program.objects.get(id=programid).char_set.all())): 
     charid = Program.objects.get(id=programid).char_set.all()[i].id 
     charlabel = Program.objects.get(id=programid).char_set.all()[i].label 
     self.fields['char_field_%i' %i] = forms.ModelChoiceField(Char.objects.get(id=charid).cat_set.all(), label=charlabel) 
+0

編集:私は文字集合(Char.objects.filter(program__id = char.program_id))を持っていると言います。この質問セットに基づいてフォームを作成したいと思います。 4つの特性。私のフォームは、それぞれの特性のカテゴリを尋ねる4つのフィールドを持っている必要があります –

答えて

0

あなたの質問を言い換えると、フォームフィールドをあらかじめ入力する方法を尋ねていますか?もしそうなら、使用することを検討してくださいinitial values in your formsets

+0

いいえ、私は2番目の印刷画面で、初期値が---- ---。最初の印刷画面では、すでに手作業で値を設定しています。むしろ、最後のコード行で 'char'を動的に定義する方法(つまり変数がcharラベルを取得する方法)です。しかし、私は回避策を知りたい –

関連する問題