具有动态查询集 ModelMultipleChoiceField 的 Django 表单

Django form with dynamic queryset ModelMultipleChoiceField

我正在尝试将 queryset 作为初始值传递给表单 ModelMultipleChoiceField。我想发送过滤后的 queryset 作为所有选择和初始选择。好像失败了is_valid。谁能告诉我我做错了什么?

forms.py

class sendListForm(forms.Form):

    recipients = forms.ModelMultipleChoiceField(queryset = CustomUser.objects.all())
    title = forms.CharField(max_length=100,required=True)
    description = forms.CharField(max_length=500,required=False,widget=forms.Textarea(attrs={'cols': 20, 'rows': 4}))
    extraInfo = forms.CharField(max_length=500,required=False, help_text='Add a message to send',widget=forms.Textarea(attrs={"rows":4, "cols":20}),label='Extra Message')
    startDate = forms.DateField(required=False,widget=forms.HiddenInput())
    startTime = forms.TimeField(required=False,widget=forms.HiddenInput())
    endDate = forms.DateField(required=False,widget=forms.HiddenInput())
    endTime = forms.TimeField(required=False,widget=forms.HiddenInput())
    yearName = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        recipients = kwargs.pop('recipients')
        super(sendListForm, self).__init__(*args, **kwargs)
        self.fields['recipients'] = forms.ModelMultipleChoiceField(queryset=recipients)

views.py

def eventSendList(request, modelPk=None):

    event = get_object_or_404(Event, pk=modelPk)

    if request.method == 'POST':
        form = sendListForm(request.POST,recipients=CustomUser.objects.all())
        if form.is_valid():
            print('valid')

    baseInfo = {
        'recipients':recipients,
        'title':event.title,
        'description':event.description,
        'startDate':event.startDate,
        'startTime':event.startTime,
        'endDate':event.endDate,
        'endTime':event.endTime,
        'yearName':event.yearName.name,
    }

    classParents = CustomUser.objects.all()
    form = sendListForm(initial=baseInfo,recipients=classParents) 

    return render(request, 'page/sendListForm.html',{'form':form})  

它永远不会超过视图中的 if form.is_valid():...

您可以通过打印 form.errors 字段轻松找到您的表单错误。