私はプログラムを持つデータベースを作成しており、これらのプログラムにはリスクがあります。背景情報:プログラム(祖父母)には、複数のカテゴリー(子)を持つ複数の特性(親)があります。私はすでにこれらを含むデータベースを構築しましたが、特定のプログラムにリスクを追加したいと考えています。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)
編集:私は文字集合(Char.objects.filter(program__id = char.program_id))を持っていると言います。この質問セットに基づいてフォームを作成したいと思います。 4つの特性。私のフォームは、それぞれの特性のカテゴリを尋ねる4つのフィールドを持っている必要があります –