0

我有一个表格,要求用户输入他们的邮政编码。一旦他们这样做,它就会将他们发送到另一个表单,其中有一个名为“pickup_date”的字段。这会从前一个字段中获取 zip 的值,并将与该邮政编码匹配的所有可用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() 函数设置所有动态选择。我没有这样做,而是使用自定义的ModelChoiceField而不是常规的 ChoiceField返回了这样的字段对象。

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 回答