0

私は、従業員が都市、旅行区間の状態に入り、マイレージの払い戻しを自動的に計算できるフォームを作成しています。現在、forms.py に次のコードがあります。

leg1a = forms.CharField(max_length=20, required=False)
leg1b = forms.CharField(max_length=20, required=False)
leg2a = forms.CharField(max_length=20, required=False)
leg2b = forms.CharField(max_length=20, required=False)
leg3a = forms.CharField(max_length=20, required=False)
leg3b = forms.CharField(max_length=20, required=False)
leg4a = forms.CharField(max_length=20, required=False)
leg4b = forms.CharField(max_length=20, required=False)
leg5a = forms.CharField(max_length=20, required=False)
leg5b = forms.CharField(max_length=20, required=False)
leg6a = forms.CharField(max_length=20, required=False)
leg6b = forms.CharField(max_length=20, required=False)

次に、別のスクリプトを使用して各区間のマイルを集計し、合計にマイレージ レートを掛けます。機能しますが、フォームが醜いです。フォームには 6 組のフィールドがあり、すべてオプションです。開始するペアが 1 つあり、ユーザーがクリックして別のレッグを追加できるオプションが必要です。

('city, ST','city2, ST')距離計算関数のように、データをタプル形式で保持する必要があります。

データをクリーニングしてマイレージ ハンドラに送信するために、フォーム ビューで現在使用しているコードは次のとおりです。

走行距離計算

        leg_list = [(leg1a, leg1b), (leg2a, leg2b), (leg3a, leg3b), (leg4a, leg4b), (leg5a, leg5b), (leg6a, leg6b)]
        
        cleaned_leg_list = []
        #get rid of empty variables
        for leg in leg_list:
            if leg == ('',''):
                pass
            else:
                cleaned_leg_list.append(leg)
        leg_distance = []
        #sends each leg of mileage claim to distance handler
        for leg in cleaned_leg_list:
            pre_leg = main(leg)
            leg_distance.append(pre_leg)
        #sums legs of mileage claim 
        sum_distance = sum(leg_distance)
4

1 に答える 1

3

1 つのフォームとフォームセットを使用します。フォームセットは、1 つのフォームの複数のインスタンスを処理します。

https://docs.djangoproject.com/en/dev/topics/forms/formsets/

必要に応じて、javascript を使用してフォームセットのクローンを作成し、ビューをリロードせずに必要な数の領域を動的に追加することができます。

これは、コードをクリーンアップする絶好の機会でもあります。脚の距離を計算して外部スクリプトを呼び出すメソッドをフォーム定義に配置します。あなたのビューは、数行のコードで合計を行うことができます!

フォームセット クラスを自分で構築し、そこに合計関数を追加することもできるため、ビューは次のように単純になります。if formset.is_valid(): print formset.sum_leg_distances()

class MyForm(forms.Form):
    start_city = forms.CharField()
    start_state = forms.CharField()
    end_city = forms.CharField()
    end_state = forms.CharField()

MyFormSet = formset_factory(form=MyForm, extra=6)

def my_view(request):
   formset = MyFormSet(request.POST or None)
   if request.POST:
       if formset.is_valid():
           for form in formset.forms:
               form.cleaned_data['start_city'] # here's your leg data.
               # form.calculate_leg_distance()
           # sum([form.calculat_leg_distance() for form in formset])


   return render(request, 'my_template', {'formset': formset})

<form method="post">
   {{ formset.as_p }}
   {{ formset.management_form }}
<input type="submit" />
</form>
于 2012-08-20T02:33:54.313 に答える