2013-08-03 27 views
0

我想在表單中添加額外的行,但它似乎被忽略。我有一個與django inlineformset_factory extra attribute being ignored?類似的設置,但沒有基本型號。我試圖實現該解決方案,但沒有成功。有沒有人有解決方案在我的表單中添加額外的行?Django inlineformset被忽略的額外行

這裏是我的代碼:

Models.py

class Disease(models.Model): 
    disease = models.CharField(max_length=300, verbose_name="disease") 

    def __unicode__(self): 
     return self.disease 


class Indicator(models.Model): 
    relevantdisease = models.ForeignKey(Disease, verbose_name="disease")  
    indicator = models.CharField(max_length=300, verbose_name="indicators") 

    def __unicode__(self): 
     return self.indicator 

Forms.py

MAX_INDICATORS = 3 

class DiseaseForm(forms.ModelForm): 
    class Meta: 
     model = Disease 

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

DiseaseFormSet = inlineformset_factory(Disease, 
    Indicator, 
    can_delete=False, 
    extra=MAX_INDICATORS, 
    form=DiseaseForm) 

IndicatorFormSet = inlineformset_factory(Indicator, 
    IndicatorValue, 
    can_delete=False, 
    extra=MAX_INDICATORS, 
    form=IndicatorForm) 

Views.py

def drui(request): 

if request.method == "POST": 

    indicatorForm = IndicatorForm(request.POST) 

    if indicatorForm.is_valid(): 
     new_indicator = indicatorForm.save() 
     diseaseInlineFormSet = DiseaseFormSet(request.POST, request.FILES, instance=new_indicator) 

     if diseaseInlineFormSet.is_valid(): 
     diseaseInlineFormSet.save() 
     return HttpResponseRedirect(reverse(something)) 

else: 
    indicatorForm = IndicatorForm() 
    diseaseInlineFormSet = DiseaseFormSet() 

return render_to_response("something.html", {'indicatorForm': indicatorForm, 'diseaseInlineFormSet': diseaseInlineFormSet},context_instance=RequestContext(request)) 

更新的代碼: 現在,1疾病將與多個指標掛鉤,我可以得到額外的線。然而,現在的問題是,只要我保存指標並從數據庫中選擇一種疾病,就會將新疾病寫入與指標相關的數據庫中。

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 }} 

回答

1

在你看來,你有一個Indicator實例的單個IndicatorForm,具有沿DiseaseFormSet綁定多個Disease實例到那個單獨的Indicator。然而在你的models.py中,你有一個ForeignKey,從IndicatorDisease,這意味着Indicator只能綁定到一個單一的Disease實例,而Disease實例可以有任意數量的Indicators

爲了解決這個問題,在ForeignKeyIndicator模型到模型Disease被改變,在Disease模型到模型Indicator是 - 或者,如果你想讓它周圍的其他方法,堅持使用,您對模型得到並使用IndicatorFormSet與一個單一的DiseaseForm

+0

感謝您的建議。我與後者一起去了,並堅持使用模型,以便1種疾病可以有多個指標。但是,出現了一個新問題,每次提交時都會在我的數據庫表中創建一個新的疾病。我希望能夠從數據庫中挑選,並有指標與我選擇的疾病相關聯。我以前的解決方案能夠做到這一點。 – nlr25

+0

嗯,在我看來,你實際上想要單一疾病的多種疾病和單一疾病的多個指標?使用['ManyToManyField'](https://docs.djangoproject.com/en/dev/ref/models/fields/#manytomanyfield)。無論如何,你能否更新你的問題中的代碼? – knbk

+0

我實際上只想要一個疾病的多個指標(希望這可以讓事情變得更容易)。我會更新我的問題中的代碼。 – nlr25