0

多くのフィールドをデータベースに保存するのに問題があります。私が持っている結果の数に基づいて生成される多くの「outcomevalue_#」フィールドがあります。ユーザーは結果のサブセット (関連する結果) を選択し、関連する値を入力します。関連する値を結果に保存したいと思います。これまでのところ、問題を解決しないフィールド名しか配線できません。

ビュー.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)

フォーム.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

インデックス位置ではなくリスト内の値を取得しているため

4

2 に答える 2

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)
于 2013-08-28T20:12:45.047 に答える
0

私がこれを正しく理解している場合、1 対多であるべきところに 1 対 1 の関係を使用しようとしています。1 つの StateOption に対して複数の結果を持つ場合は、多対多のブリッジ テーブルを使用して、どの StateOption がどの結果を持つかをリンクすることをお勧めします。次に、そのブリッジ テーブルに、関連する値を、適切な StateOption/Outcome ペアの追加の列として格納することもできます。

于 2013-08-28T19:15:20.530 に答える