0

ウィジェットで使用ModelFormsしています。ModelMultipleChoiceField2 つの質問があります。

  1. 処理オプションのチェックボックス ウィジェットは、データベース内のテーブルSelectOptionForStateFormから既存の選択をレンダリングします。stateoptionそのテーブルで既存のレコードを探すことをどのように知るのでしょうか? 私のviews.pyでは、テーブルを見ないオブジェクトdiseaseとオブジェクトのみを渡しています。statestateoption

  2. データベース内のテーブルSelectOutcomeForOptionFormから [治療結果] チェックボックスも事前に選択されるように、どのようにインスタンス化しますか?stateoptionoutcome

フォーム.py

class SelectOptionForStateForm(forms.ModelForm):
    class Meta:
       model = State
       exclude = ['state', 'relevantdisease']

    def __init__(self, *args, **kwargs):
       disease=kwargs.pop('disease', None)
       super(SelectOptionForStateForm, self).__init__(*args, **kwargs)
       self.fields['relevantoption']=forms.ModelMultipleChoiceField(queryset=Option.objects.filter(relevantdisease_id=disease),required=True, widget=forms.CheckboxSelectMultiple)
       self.fields['relevantoption'].label="Treatment Options"

class SelectOutcomeForOptionForm(forms.ModelForm):
    class Meta:
       model = StateOption
       exclude = ['partstate', 'partoption']

    def __init__(self, *args, **kwargs):
       disease=kwargs.pop('disease', None)
       super(SelectOutcomeForOptionForm, self).__init__(*args, **kwargs)
       self.fields['relevantoutcome']=forms.ModelMultipleChoiceField(queryset=Outcome.objects.filter(relevantdisease_id=disease),required=True, widget=forms.CheckboxSelectMultiple)
       self.fields['relevantoutcome'].label="Treatment Outcomes"

ビュー.py

def stateoptionoutcome(request, disease_id, state_id):

    state = get_object_or_404(State, pk=state_id)
    disease = get_object_or_404(Disease, pk=disease_id)

    if request.method == "POST":
        optionForm = SelectOptionForStateForm(request.POST, disease=disease, instance=state)
        outcomeForm = SelectOutcomeForOptionForm(request.POST, disease=disease, instance=state)

        if optionForm.is_valid() and outcomeForm.is_valid(): 
           #Deletes state objects so there are no duplicate options in the database
           try:
               state_option = StateOption.objects.filter(partstate=state).delete()

           except StateOption.DoesNotExist:
               state_option = None

           #Saves user options to database
           for option_id in request.POST.getlist('relevantoption'):
               state_option = StateOption.objects.create(partstate=state, partoption_id=int(option_id))

               #Deletes stateoption objects found in StateOptionOutcome 
               try:
                   state_option_outcome = StateOptionOutcome.objects.filter(stateoption=state_option).delete()

               except StateOptionOutcome.DoesNotExist:
                   state_option_outcome = None

               #Saves user outcomes to database
               for outcome_id in request.POST.getlist('relevantoutcome'):
                   state_option_outcome = StateOptionOutcome.objects.create(stateoption=state_option, relevantoutcome_id=int(outcome_id))

           return HttpResponseRedirect(reverse('diseasestateoptionlist', kwargs={'disease_id':disease_id, 'state_id':state_id}))

models.py

class State(models.Model):
       state = models.CharField(max_length=255)
       relevantdisease = models.ForeignKey(Disease)
       relevantoption = models.ManyToManyField(Option, through='StateOption')

class StateOption(models.Model):
       partstate = models.ForeignKey(State)
       partoption = models.ForeignKey(Option)
       relevantoutcome = models.ManyToManyField(Outcome, through='StateOptionOutcome')

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

1 に答える 1

0

これを使用して#2を解決できました:

stateoptionlist = StateOption.objects.filter(partstate_id=state_id) 
if not stateoptionlist:
    stateoption = state 
else: 
    stateoption = stateoptionlist[0]

が空のリストを返す (つまり、テーブルにレコードがない)state場合は、インスタンスを渡します。views.py を更新すると、すべてのインスタンスが に置き換えられます。stateoptionlistStateOptionSelectOutcomeForOptionFormstateoption

#2を解決するより効率的な方法があるかどうかを知りたい.

于 2013-09-18T23:10:23.293 に答える