在ModelForm中,如何仅使用与当前实例相关的值来过滤“选择”窗口小部件内容? (调用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', }), }
我想要做的是仅使用包含sms参考的电话过滤该phoneSMS。这是模特:
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)
,但没有结果。
答案 0 :(得分:3)
在声明的那一刻,您没有关于模型实例的信息,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已设置 - 它取决于可选实例参数。因此,更好地附加适当的条件和处理此类案件的方式。