Django访问ModelForm中的实例数据

时间:2014-04-26 14:58:39

标签: django django-forms

在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),但没有结果。

1 个答案:

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