Django访问ModelForm中的实例数据



在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已设置-它取决于可选实例参数。因此,最好附上适当的条件和处理此类案件的方式。

最新更新