在django中向模型表单添加其他字段

时间:2014-07-24 19:15:01

标签: python django django-forms

我遇到类似于this one的问题,但其中提出的解决方案对我不起作用。

views.py:

@login_required
def contract(request):
    form = ContractorForm()
    return render(request,'portal/main_form.html',{'form': form })

forms.py

class ContractorForm (forms.ModelForm):
    def _init_(self, *args, **kwargs):
        super(ContractorForm, self).__init__(*args, **kwargs)
        self.fields['phone'].choices= [('123',1235),('256',1256),]

    phone= forms.ChoiceField(choices=())

    class Meta:
        model = Contractor
        fields = ['name','phone']   

    def con_phone(self, user):
        return Phone.objects.filter(contractor__user = user)

我遇到的问题是手机字段在选择时没有任何选项,如果我反过来略微更改forms.py(如下所示),它按预期工作

class ContractorForm (forms.ModelForm):
    phone= forms.ChoiceField(choices=[('123',1235),('256',1256),])

    class Meta:
        model = Contractor
        fields = ['name','phone']
    def _init_(self, *args, **kwargs):
        super(ContractorForm, self).__init__(*args, **kwargs)


    def con_phone(self, user):
        return Phone.objects.filter(contractor__user = user)

我的问题是我打算将用户作为参数传递给构造函数,然后获取他的电话号码并将它们作为选项添加到表单中,所以我[至少不认为我可以]使用声明代码工作

我很确定我做的事情很傻(我对django来说还是新手),你们给我的任何帮助都会非常感激

1 个答案:

答案 0 :(得分:1)

在视图中,您可以指定表单的phone字段的查询集

假设您的Contractor模型有一个名为phones的字段,并假设它是从ContractorPhone的一对多,即在Phone您有

contractor = model.ForeignKey(Contractor, related_name='phones')

您可以将表单中的phone字段更改为ModelChoiceField,并在视图中执行以下操作

u = request.user
form.fields['phone'].queryset = u.phones.all()