Django не удается обработать поле формы ManyToMany в представлении для создания и сохранения нового экземпляра модели
У меня есть две модели с отношением ManyToMany. В моем представлении я хочу обработать пользовательский ввод поля MultipleChoicesField и присвоить выбранные варианты объекту Poller.
Вызывает следующую ошибку:
Прямое назначение на прямую сторону множества "многие-ко-многим" запрещено. запрещено. Вместо этого используйте poller_categories.set().
.
Models.py
class Categories(models.Model):
poller_category = models.CharField(max_length=30)
poller_category_id = models.IntegerField(default=0)
def __str__(self):
return str(self.poller_category)
class Pollers(models.Model):
[..]
# Poller Category
poller_categories = models.ManyToManyField(Categories)
def __str__(self):
return str(self.poller_id)
Forms.py
class PollersForm(forms.Form):
[..]
# Poller Tags
poller_categories = forms.ModelMultipleChoiceField(queryset=Categories.objects.all())
views.py
def raise_poller(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = PollersForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
poller_nature = form.cleaned_data['poller_nature']
poller_text = form.cleaned_data['poller_text']
poller_choice_one = form.cleaned_data['poller_choice_one']
poller_choice_two = form.cleaned_data['poller_choice_two']
poller_categories = form.cleaned_data['poller_categories']
# Get the user
created_by = request.user
# Save the poller to the database
p = Pollers(poller_nature = poller_nature,
poller_text = poller_text,
poller_choice_one = poller_choice_one,
poller_choice_two = poller_choice_two,
poller_categories = poller_categories, # here seems to be my issue?
created_by = created_by)
p.save()
# redirect to a new URL:
return HttpResponseRedirect('/')
Вы не можете напрямую присвоить значение объекту poller_categies
. Вы должны сначала сохранить объект Pollers
в базе данных, а затем использовать p.poller_categories.set(…)
для заполнения отношения многие-ко-многим: отношение
p = Pollers(
poller_nature = poller_nature,
poller_text = poller_text,
poller_choice_one = poller_choice_one,
poller_choice_two = poller_choice_two,
# no poller_categories,
created_by = created_by
)
p.save()
p.poller_categories.set(poller_categories)
Основная причина этого заключается в том, что вам нужен первичный ключ объектов both, прежде чем вы сможете связать два элемента вместе, поэтому в этот момент в базе данных еще нет записи для p
.