Форма ModelMultipleChoiceField возвращает null [IntegrityError]
Используется Django 4.0.5, Python 3.10.5.
Я создал форму, которая должна возвращать объект модели "матч". Он правильно отображает "игроков" для выбора на форме, но после попытки сохранить его я получаю IntegrityError, что я якобы нарушаю мое ограничение not-null. Ниже приведены детали сбойной строки:
DETAIL: Неудачная строка содержит (2bc3f5f6-3249-4823-ae76-90fe44dc9c89, 2022-09-09, null, null).
Значения, которые я передаю, это UUID, дата и две команды, которые являются полями ManyToManyFields, содержащими объекты Player. Я не могу понять, почему оба поля команд возвращают null. Любая помощь будет принята с благодарностью, выкладываю соответствующий код ниже. Если потребуется что-то кроме этого, я обновлю его.
forms.py [соответствует приложению]
class PlayerChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj: Player) -> str:
return obj.nickname
class MatchForm(forms.ModelForm):
date = forms.DateField(widget=forms.SelectDateWidget(), initial=datetime.date.today, label="Match Date")
blackTeamPlayers = PlayerChoiceField(queryset=Player.objects.all(), widget=forms.CheckboxSelectMultiple)
whiteTeamPlayers = PlayerChoiceField(queryset=Player.objects.all(), widget=forms.CheckboxSelectMultiple)
class Meta:
model = Match
fields = ['date', 'blackTeamPlayers', 'whiteTeamPlayers']
models.py [matches app]
class Match(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
date = models.DateField(null=False)
blackTeamPlayers = models.ManyToManyField(
Player, related_name='%(class)s_black_team_players'
)
whiteTeamPlayers = models.ManyToManyField(
Player, related_name='%(class)s_white_team_players'
)
views.py [соответствует приложению, соответствующая часть]
class MatchCreateView(CreateView):
template_name: str = 'add_match.html'
form_class = MatchForm
queryset = Match.objects.all()
def form_valid(self, form):
return super().form_valid(form)
models.py [players app]
class Player(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
firstname = models.CharField(max_length=25)
lastname = models.CharField(max_length=25)
nickname = models.CharField(max_length=50)
def get_absolute_url(self):
return reverse("players:player_details", kwargs={"id": self.id})
Оказывается, ответ был тривиальным, в коде все в порядке. Пожалуйста, не забывайте makemigrations
после игры с вашими моделями...