0

ユーザーに郵便番号の入力を求めるフォームがあります。完了すると、「pickup_date」というフィールドがある別のフォームに送信されます。これは、前のフィールドから郵便番号の値を取得し、その郵便番号に一致する利用可能なすべての pickup_dates を ChoiceField に取得します。これらすべてをモデル フォームのinit内に設定しました。

def __init__(self,*args,**kwargs):

    super(ExternalDonateForm,self).__init__(*args,**kwargs)

    if kwargs:
        zip = kwargs['initial']['zip']
        self.fields['pickup_date'] = forms.ChoiceField(choices = self.get_dates(zip))


    elif self.errors:
        zip = self.data['zip']
        self.fields['pickup_date'] = forms.ChoiceField(choices = self.get_dates(zip))

私が抱えている問題は、フォームに他のエラーがある場合です。を使用しelif self.errorsて可能な選択肢を再生成しますが、デフォルトで選択された元のオプションにはなりません。元に戻り、デフォルトで最初の選択に戻ります。フォームエラーのデフォルトオプションが最初に投稿されたものになるようにするにはどうすればよいですか?

4

2 に答える 2

1

self.fields['pickup_date'] を self.fields['pickup_date'].initial に変更し、それが役立つかどうかを確認します。

于 2013-01-14T21:23:56.973 に答える
0

しばらく遊んだ後、動作するようになりました。上記では、タプルを返す get_dates() 関数を使用してすべての動的な選択肢を設定していました。そうする代わりに、通常の ChoiceField の代わりにカスタマイズされた ModelChoiceField を使用して、このようなフィールド オブジェクトを返しました。

class MyModelChoiceField(ModelChoiceField):

    def label_from_instance(self, obj):
        return obj.date.strftime('%a %b %d, %Y')

日付関数

def get_dates(self,zip):        
            routes = Route.objects.filter(zip=zip).values_list('route',flat=True)
            pickups = self.MyModelChoiceField(queryset = PickupSchedule.objects.filter(         
                    current_count__lt=F('specials'),
                    route__in=routes,
                ).order_by('date')
            )    

            if not pickups:
                pickups = (('----','No Pickups Available At This Time'),)

            return pickups

初期化で、私はそのself.fields['pickup_date']ように値を設定しました..

self.fields['pickup_date'] = self.get_dates(zip)
于 2013-01-16T02:37:08.977 に答える