在ModelForm中,如何仅使用与当前实例相关的值来筛选Select小部件内容?(调用ModelForm的实例)
例如:
class smsForm(ModelForm):
class Meta:
model = SMS
fields = ['phone', 'state']
widgets = {
'phone': Select(choices=phoneSMS.objects.all().values_list('id', 'phone'), attrs={'class':'form-control',}),
'state': bootStrapButtonSelect( attrs={'class': 'buttons-sms', }), }
我想做的是只用包含短信引用的手机来过滤手机短信。以下是型号:
class SMS(models.Model):
student = models.ForeignKey(Student)
day = models.DateField(db_index=True)
tries = models.IntegerField(default=0)
phone = models.CharField(max_length=9, default='---')
sent = models.BooleanField(default=False)
state = models.CharField(max_length=20, choices=OPTIONS, default='nothing')
class phoneSMS(models.Model):
phone= models.CharField(max_length=120)
sms = models.ForeignKey(SMS)
我尝试了objects.filter(sms=SMS)
,但没有结果。
在声明的那一刻,您没有关于模型实例的信息,ModelForm将用初始化。
当模型实例已知并且发生时间不早于__init__()
方法时,您必须动态设置选项:
class SmsForm(ModelForm):
class Meta:
model = SMS
fields = ['phone', 'state']
widgets = {
'phone': Select(attrs={'class':'form-control',}),
'state': bootStrapButtonSelect( attrs={'class': 'buttons-sms', })
}
def __init__(self, *args, **kwargs):
super(SmsForm, self).__init__(*args **kwargs)
self.fields['phone'].widget.choices =
phoneSMS.objects.filter(sms=self.instance.sms)
.values_list('id', 'phone')
仍然要小心,因为没有人保证self.instance已设置-它取决于可选实例参数。因此,最好附上适当的条件和处理此类案件的方式。