2013-08-28 51 views
0

我很難將很多字段保存到數據庫中。我有很多'outcomevalue_#'字段是根據我擁有的結果數量生成的。用戶選擇結果的子集(相關結果)並輸入關聯的值。我想將相關值與結果一起保存。到目前爲止,我只能通過硬連線來解決問題。將自定義表單字段保存到數據庫的有效方法

views.py

stateoption = get_object_or_404(StateOption, pk=stateoption_id) 

if request.method == "POST": 
    form = UpdateStateOptionWithOutcomesForm(request.POST, instance=stateoption) 
    if form.is_valid(): 

     cd = form.cleaned_data 
     outcomevalue = cd['outcomevalue_1'] #hardwired. This needs to be generalized.   

     for outcome_id in request.POST.getlist('relevantoutcome'): 
      stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue) 

forms.py

class UpdateStateOptionWithOutcomesForm(forms.ModelForm): 
    class Meta: 
     model = StateOption 

    def __init__(self, *args, **kwargs): 
     super(UpdateStateOptionWithOutcomesForm, self).__init__(*args, **kwargs) 
     self.fields['relevantoutcome']=forms.ModelMultipleChoiceField(queryset=Outcome.objects.all(),required=True, widget=forms.CheckboxSelectMultiple) 

     outcome_qs=Outcome.objects.all() 
     for outcome in outcome_qs: 
      self.fields['outcomevalue_%s' % outcome.pk] = forms.CharField(required=False) 

更新

這裏是我剝奪了models.py

class StateOptionOutcome(models.Model): 
    stateoption = models.ForeignKey(StateOption) 
    relevantoutcome = models.ForeignKey(Outcome) 
    outcomevalue = models.CharField(max_length=20) 

一些打我身邊後有類似:

outcomelist = request.POST.getlist('relevantoutcome') 
for outcome_id in outcomelist: 
     cd = form.cleaned_data 
     outcomevalue = cd['outcomevalue_%s' % outcomelist[int(outcome_id)]] 

     stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue) 

,但得到的錯誤:

list index out of range 

,因爲它抓住的列表,而不是索引位置

回答

0

值如果我沒有理解這個正確地說,您嘗試使用一對一的關係,應該有一對多關係。如果你將有一個StateOption的多個結果,我可以建議你使用一個多對多的橋接表來連接哪個StateOption有哪個結果。然後在該橋接表中,您還可以將關聯值存儲爲適當的StateOption/Outcome對的附加列。

+0

我有表橋。我會在上面張貼它。我無法保存結果的所有結果值。代碼解決了它,但並未保存所有結果的所有值。作爲參考:http://stackoverflow.com/questions/18494595/passing-custom-form-values-to-views – nlr25

0

通過解決它:

outcomelist = request.POST.getlist('relevantoutcome') 
     for i,outcome_id in enumerate(outcomelist): 
      cd = form.cleaned_data 
      outcomevalue = cd['outcomevalue_%s' % outcomelist[i]] 

      stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue) 
相關問題