在Django应用程序,我在其中包含的Django用户模型中的多对多关系的模型投注:Django的ModelForms:显示多对多字段单选
class Bet(models.Model):
...
participants = models.ManyToManyField(User)
用户应该能够启动新的赌注使用表格。直到现在,投注正好有两个参与者,其中一个是自己创建投注的用户。这意味着在新的赌注形式中,你必须选择一个参与者。投注创建者在保存表单数据时作为参与者添加。
我使用的ModelForm我NewBetForm
:
class NewBetForm(forms.ModelForm):
class Meta:
model = Bet
widgets = {
'participants': forms.Select()
}
def save(self, user):
... # save user as participant
通告参与者领域的重新定义窗口小部件,这使得确保你只能选择一个参与者。
然而,这给了我一个验证错误:
Enter a list of values.
我真的不知道在这从何而来。如果我在开发人员工具中查看POST数据,则看起来与使用默认小部件并仅选择一个参与者完全相同。但是,似乎ManyToManyField的to_python()
方法在这些数据中存在问题。如果启用Select小部件,至少不会创建User对象。
我知道我可以通过从表单中排除参与者字段并自己定义它来解决此问题,但如果仍然可以使用ModelForm的容量(毕竟,它只是一个小部件更改),那将会好很多。也许我可以用某种方式操纵传递的数据,如果我知道的话。
任何人都可以告诉我这个问题到底是什么,如果有一个很好的方法来解决它?
在此先感谢!
编辑
作为评价建议:视图的(相关)码。
def new_bet(request):
if request.method == 'POST':
form = NewBetForm(request.POST)
if form.is_valid():
form.save(request.user)
... # success message and redirect
else:
form = NewBetForm()
return render(request, 'bets/new.html', {'form': form})
M2M关系背后的想法是,将有可能将功能扩展到以后两人以上的参与者。所以我认为,m2m是适当的。 – j0ker