2016-10-24 16 views
0

今、私はしばらくこの問題に苦労していますが、私はこれをPython/Djangoでどうやってやるべきかを本当に理解できません。データベースに根本的に何か問題があるかもしれません。その場合、助けに感謝します。可変属性に基づくDjangoフォーム

これは私のデータベース構造が含まれている印刷画面である:https://gyazo.com/bcb0c1090a005c581f3a62ba24d9302e

注、プログラムは、各猫(カテゴリー)の任意の量を持つことができる文字数の任意の量(特性)を、持つことができます。

ここで、この特定のテストプログラムでは、フォームを使用してリスクを追加したいと考えています。このリスクはすべてのチャーに応答し、各カーの猫の1つを選択する必要があります。 (テストリスク1:{入居者:農場、建造物:金属フレーム、スプリンクラー:はい、保護クラス:1})

どうすればいいですか?

これは、これまでのリスクのための私のPythonコードです:最初にこのよう

def add_new_risk(request, id=None): 
program = get_object_or_404(Program, id=id) 
new_risk_form = NewRiskForm(request.POST or None) 
if new_risk_form.is_valid(): 
    new_risk = new_risk_form.save(commit=False) 
    new_risk.save() 
    return HttpResponseRedirect(program.get_absolute_url() + 'risks/create/' + str(new_risk.id)) 
context = { 
"form": new_risk_form 
} 
return render(request, 'form.html', context) 

、私はその後、私はその中に含まれているすべての特性に答える必要があり、私はリスクを追加するプログラムを選択しますプログラム。私はこれを試しました:

def answer_risk_chars(request, id=None, program_id=None): 
program = get_object_or_404(Program, id=program_id) 
risk = RiskClass(program=Program.objects.get(id=program.id)) 
chars = program.char_set.all() 
for c in chars: 
    setattr(risk, c.label, models.CharField(max_length=200, choices=c.cat_set.all(), default=c[0])) 

しかし、「リスク」に基づいたフォームを構築する方法はわかりませんが、すべての正しい属性を含める必要があります。私はこれが可能かどうかも知らない。

これを行う方法はありますか?

ありがとうございます。

答えて

0

答えは「はい」です。任意のDjangoフォームまたは他のエンティティを、宣言的クラスではなく実行時に動的に構築することができます。私の自己回答の喜びを熟読することが役に立つかもしれません。How to reduce Django class based view boilerplateこれはフォームに関するものではありませんが、Djangoスタイルの宣言であるclassから同じことを動的に構築する方法を完全に解説しています。

Googleの「Django dynamic form」を使用すると、より多くのフォーム関連のものが見つかります。必要なものはすでに完了しているかもしれません(DjangoパッケージのWebサイトを検索してみてください)。

自分でロールする必要がある場合は、クラスを構築するPythonのtype組み込み引数の3つの引数の書式の(かなり簡単な)ドキュメントを読み込み、再読み込みする必要があります。次に、あなたのような何かを試してみましょうdict_of_fieldsは(不完全、アウトラインコード)のようなものを構築することがあります

MyDynamicFormClass = type('MyDynamicForm', (forms.Form,), dict_of_fields) 

dict_of_fields = {} 

for cat in cats: 
    choices = [ ] 
    for char in get_characteristics(cat): 
     choices.append((db_value_for_char, user_label_for_char)) 

    dict_of_fields[ cat_name ] = forms.ChoiceField(choices, ...)  

このようなすべての形態のため同じですフィールドのセットがある場合MyBaseFormをフォームに含めるのではなく、MyBaseFormから継承することができます。まったく新しいクラスを作成するのではなく、実行時に余分なフィールドを追加するMyBaseFormのインスタンスを変更する方法もよく知られています。

+0

お返事ありがとうございます。今すぐこれを掘り起こすだろう。何か質問があれば、これにコメントします。まだPython/Django(3週間の経験)で苦労していますので、これを完全に理解するにはしばらく時間がかかります。 –

+0

よろしいですか?私はPythonシェルで作業しているフィールドを知っています(Pythonシェルに必要なものの99%を取得します)。しかし、私の主な問題は、Djangoスクリプトの実装です。クラスを定義する方法、フォームを定義する方法など、実際に働いていることは全くわかりません。 –

+0

ああ、すでにコメントを投稿してください。編集できません。次のことがあります。私はちょうどそれを追加しなければならないプログラムを与えたいです。 URL http://127.0.0.1:8000/programs/ /risk/create /があるとします。次に、プログラムのすべての特性を持つフォームを自動的に取得する必要があります。それは意味がある場合 –

関連する問題