在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