根据同一模型中的queryset选择表单中的字段

时间:2017-01-30 13:02:29

标签: python django widget modelform

我想在我的coach_id字段的表单中填入一个查询集结果的下拉列表。我只希望用户能够选择一个选项,而不是多个选项。我正在尝试使用ModelMultipleChoiceField ...失败......

QDomNode

这是我的模特:

class PersonForm(forms.ModelForm):
    coach_id = forms.ModelMultipleChoiceField(queryset=Person.objects.filter(assign_as_coach="Person is a coach"), widget=forms.Select())

    class Meta:
        model = Person
        fields = [ 'id', 'first_name', 'surname', 'email', 'coach_id', 'assign_as_coach', 'position', 'contract_type']
        # exclude = ['initials', 'sam']
        labels = {
            'first_name': _('First Name'),
            'surname': _('Surname'),
            'email': _('Email'),
            'coach_id': _('Select Coach'),
            'assign_as_coach': _('Assign as a coach?'),
            'position': _('Position'),
            'contract_type': _('Contract Type'),
        }

        widgets = {
        'first_name': forms.TextInput(
            attrs={'placeholder': 'First Name', 'id': 'person-first-name'}
        ),
        'surname': forms.TextInput(
            attrs={'placeholder': 'Surname', 'id': 'person-surname'}
        ),
        'email': forms.TextInput(
            attrs={'placeholder': 'Email Address', 'id': 'person-email'}
        ),
        # 'coach_id': forms.Select(
        #   attrs={'placeholder': 'Select Coach', 'id': 'person-coach-id'}
        # ),
        'assign_as_coach': forms.Select(
            attrs={'placeholder': 'Assign person as a coach?', 'id': 'person-is-coach'}
        ),
        'position': forms.TextInput(
            attrs={'placeholder': 'Current position', 'id': 'person-position'}
        ),
        'contract_type': forms.Select(
            attrs={'placeholder': 'Select Contract Type', 'id': 'person-contract'}
        ),

目前我的模板上有一个coach_id选择字段渲染,其中没有任何内容并且格式错误。

1 个答案:

答案 0 :(得分:0)

您可以将coach_id重命名为coach(否则您将获得有冲突的列名称)并将其设为同一模型的ForeignKey:coach=models.ForeignKey('self', on_delete=models.CASCADE, null=True)。这将导致您的教练字段成为下拉列表。

然后,您可以通过设置表单queryset方法中字段的init属性来限制下拉菜单的选项:

self.fields['coach'].queryset = Person.objects.filter(assign_as_coach__exact='Y')