Поля ModelChoiceField не сохраняются, что делать?
На сайте есть возможность создать пост для конкретной игры. Когда вы пытаетесь создать пост, он создается, но поле ManyToManyField остается пустым. Как это исправить?
forms.py
class AddPost(forms.ModelForm):
title = forms.CharField(label='Title', widget=forms.TextInput(attrs={'placeholder': 'Заголовок...'}),
help_text='Максимум 100 символів.')
games = forms.ModelChoiceField(queryset=Game.objects.filter(draft=False), widget=forms.Select, required=True)
tags = forms.ModelMultipleChoiceField(queryset=Tags.objects.all(), widget=forms.SelectMultiple(
attrs={'style': "padding: 10px; background:#edf2ff; border:none;"}))
foreword_description = forms.CharField(label='Small Description',
widget=forms.Textarea(attrs={'placeholder': 'Коротке описання...'}),
help_text='Максимум 335 символів.')
description = forms.CharField(label='Description', widget=CKEditorUploadingWidget())
rank = forms.FloatField(label='Rank', widget=forms.TextInput(attrs={'placeholder': 'Оцінка...'}))
good = forms.ModelChoiceField(queryset=Good.objects.all(), widget=forms.Select(
attrs={'style': "padding: 10px; background:#edf2ff; border:none;"}))
bad = forms.ModelChoiceField(queryset=Bad.objects.all(), widget=forms.Select(
attrs={'style': "padding: 10px; background:#edf2ff; border:none;"}))
url = forms.SlugField(label='Title', widget=forms.TextInput(attrs={'placeholder': 'Унікальний ідентифікатор...'}),
help_text='Максимум 255 символів.')
premiere = forms.DateField(label='Date', widget=forms.SelectDateWidget(attrs=({'style': 'width: 10%; display: inline-block;'})),
help_text='У форматі: 24.03.2022.')
class Meta:
model = Post
fields = (
'title', 'games', 'tags', "foreword_description", "description", "rank", "good", "bad", "url", "premiere",)
views.py
def addpost(request):
if request.method == "POST":
form = AddPost(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.save()
return redirect('../blogs/')
else:
form = AddPost()
data = {
'form': form,
'add': True
}
return render(request, 'gamelibs/user-post-manager.html', {'form': form})
models.py
html
Что я делаю не так или как еще я могу это реализовать? Я просто не совсем понимаю, почему форма сохраняется, но поля ModelChoiceField пустые, почему? Буду благодарен за ваши ответы
Отсутствует связь между вашими полями "многие ко многим" и вашей формой.
Возьмем 'game'. В вашей модели это поле типа "многие ко многим". Но в вашей форме это поле ModelChoiceField. Поле ModelChoiceField должно ссылаться на поле, которое имеет отношение Foreignkey (многие к одному), а не многие ко многим. Так, в данном случае ваша модель говорит, что пост может быть о многих различных играх, но ваша форма позволяет пользователю выбрать только одну. При использовании отношения "один ко многим" вы можете иметь много сообщений (во множественном числе), относящихся к одной игре, но каждое отдельное сообщение может относиться только к одной игре.
Если вы хотите, чтобы пользователь мог выбрать несколько игр для каждого поста, то форма должна иметь поле ModelMultipleChoiceField. Если вы хотите, чтобы пост был только об одной игре, то модель должна иметь ForiegnKey (один-ко-многим), а не отношения многие-ко-многим. Тогда форма и модель будут согласовываться и обрабатывать друг друга соответствующим образом.