2013-08-03 78 views
0

我有一種疾病與多個指標相關聯。我的問題是,每當我保存我的指標並從我的下拉列表中選擇一種疾病時,就會將新疾病寫入與指標鏈接的分貝。Django formsets inlineformset保存到數據庫沒有外鍵鏈接

我想要一個下拉菜單,從我的疾病表中抽樣。用戶選擇疾病並在指標中進行分類。指標被保存在指標表中,與疾病表中的疾病相關聯(而不是在疾病表中編寫新疾病)。

我以此爲參考參考:http://charlesleifer.com/blog/djangos-inlineformsetfactory-and-you/

Views.py

def drui(request): 
    if request.method == "POST": 

    diseaseForm = DiseaseForm(request.POST) 

    if diseaseForm.is_valid(): 
     new_disease = diseaseForm.save(commit=False) 
     indicatorInlineFormSet = IndicatorFormSet(request.POST, instance=new_disease) 

     if indicatorInlineFormSet.is_valid(): 
     new_disease.save() 
     indicatorInlineFormSet.save() 
     return HttpResponseRedirect(reverse(valdrui)) 

else: 
    diseaseForm = DiseaseForm() 
    indicatorInlineFormSet = IndicatorFormSet(instance=Disease()) 

return render_to_response("drui.html", {'diseaseForm': diseaseForm, 'indicatorInlineFormSet': indicatorInlineFormSet},context_instance=RequestContext(request)) 

forms.py

class DiseaseForm(forms.ModelForm): 
    disease = forms.ModelChoiceField(queryset=Disease.objects.all()) 
    class Meta: 
     model = Disease 

class IndicatorForm(forms.ModelForm): 
    class Meta: 
     model = Indicator 

IndicatorFormSet = inlineformset_factory(Disease, 
    Indicator, 
    can_delete=False, 
    extra=MAX_INDICATORS) 

HTML:

{{ diseaseForm.as_table }} 
{{ indicatorInlineFormSet.as_table }} 

更新: 我得到它的工作使用Mariodev的建議,但只有當我把在PK = 1或一些其他硬編碼數字。我如何通過用戶選擇的PK?選擇來自PK = id的疾病表。這裏是我的views.py的一個片段:

def drui(request, id): 

    if request.method == "POST": 


     disease = get_object_or_404(Disease, pk=id) 
     diseaseForm = DiseaseForm(request.POST, instance=disease) 

     if diseaseForm.is_valid(): 
      new_disease = diseaseForm.save(commit=False) 
      indicatorInlineFormSet = IndicatorFormSet(request.POST, instance=new_disease) 

      if indicatorInlineFormSet.is_valid(): 
      new_disease.save() 
      indicatorInlineFormSet.save() 
      return HttpResponseRedirect(reverse(valdrui)) 

我得到這個錯誤,當我點擊提交:drui()到底需要2個參數(1給出)。有什麼建議麼?

回答

0

是的,我的第一個建議是錯誤的。你應該做的是在編輯視圖中顯示inlineformset,這樣你可以用現有對象創建DiseaseForm的實例。因此,而不是:

diseaseForm = DiseaseForm(request.POST) 

你這樣做:

disease = get_object_or_404(Disease, pk=disease_id) 
diseaseForm = DiseaseForm(request.POST, instance=disease) 

disease_id從URL採取

+0

我得到disease_id了「列空值‘’違反了非空約束」當我刪除該行。似乎需要與疾病表相關聯。 – nlr25

+0

謝謝,這絕對有效,但我在pk = disease_id部分遇到問題。我如何傳遞用戶選擇的疾病ID?如果我把它的表名(疾病)和PK列名(id),我得到了disease_id作爲URL和一個錯誤消息「全球名稱」disease_id「沒有定義」。如果我把PK = 1,上面的方法絕對有效。它會在我的表格中找到第一個疾病列。 – nlr25

+0

Mariodev,我編輯了原始問題以包含我的views.py現在的樣子。希望能幫助任何人。 – nlr25