2016-10-13 24 views
2

我正在創建一個具有程序和這些程序有風險的數據庫。一些背景信息:程序(祖父母)具有多個具有多個類別(子女)的特徵(父母)。我已經構建了一個包含這些數據庫的數據庫,但是,我想爲特定的程序添加風險。Django - 基於外鍵的動態表單域

也就是說,例如我有我想要添加到程序1的風險1。我必須回答以下問題:風險1具有哪些特徵?爲了回答這個問題,我想構建一個動態表單字段。 (請注意,特徵的數量可以是任意數量,也可以是每個特徵的類別數量)。

我該如何構建這樣的表單?我已經嘗試過formset,但是我不知道如何以實用的方式實現這些(我對Python還是有點新鮮)。

這是我希望如何實現的打印屏幕:https://gyazo.com/40c448c0096a9ec5da751ba9883dc912
但是,我不知道該怎麼做。 (請注意,下拉菜單中的可能答案是與特定特性對應的類別)。 這就是我得到:https://gyazo.com/25fd18e2f31e6931bfd3639ce4be632c

這是相應的代碼我迄今:

# 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) 

我發現我的答案。

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

不,我很抱歉誤解,因爲在第二個打印屏幕中,初始值設置爲---- ---。在第一個打印屏幕中,我已經手動設置了它們的值,問題是,如何在最後一行代碼中動態定義'char'(因此變量獲取char標籤)。是不可通過的,但是,我想知道一個解決方法 –