Django autocomplete-light ModelSelect2Multiple提交报Select a valid choice错误如何解决
这个报错的核心原因是你在表单的players字段中,将校验用的查询集设置为了空集Profile.objects.none()。Django的ModelMultipleChoiceField在校验提交数据时,会验证提交的主键是否属于你指定的查询集范围,空查询集自然匹配不到任何提交的Profile主键,因此抛出合法性校验错误。
修复方法非常简单:只需要把players字段的初始查询集替换为实际需要的范围即可,如果你没有特殊的过滤需求,直接替换为全量Profile查询集即可。如果有动态过滤的需求,可以在表单的__init__方法中按需调整players的查询集,和你当前处理game字段的逻辑一致。
修正后的forms.py代码参考:
from django import forms from .models import Game, Profile, Team from dal import autocomplete class TeamForm(autocomplete.FutureModelForm): players = forms.ModelMultipleChoiceField(label='Team Members', # 把空集替换为实际需要的查询集 queryset=Profile.objects.all(), widget=autocomplete.ModelSelect2Multiple(url='profile-autocomplete')) class Meta: model = Team fields = [ 'name', 'game', 'players' ] def __init__(self, *args, **kwargs): super(TeamForm, self).__init__(*args, **kwargs) self.fields['game'].queryset = Game.objects.filter(is_team_game=True) # 如果有动态过滤players的需求,在这里加逻辑即可,比如仅允许添加已激活用户的Profile: # self.fields['players'].queryset = Profile.objects.filter(user__is_active=True)
如果你的业务需要限制可选的Profile范围(比如仅允许添加同地区的用户、仅允许添加已实名认证的用户等),只需要调整players的查询集过滤条件即可,只要保证前端可选的Profile都在校验用的查询集范围内,就不会再触发该错误。
内容的提问来源于stack exchange,提问作者Monu Yadav
相关产品推荐
相关产品推荐

