Django无法在view中处理manymany表单字段来创建和保存新的模型实例



我有两个多多关系的模型。在我看来,我想处理MultipleChoicesField的用户输入,并将选定的选项分配给polller对象。

会引发以下错误:

直接赋值给多对多集合的前端为禁止。请使用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,
#nopoller_categories,
created_by = created_by
)
p.save()
p.poller_categories.set(poller_categories)

这样做的基本原因可能是,在将两个项目链接在一起之前,您需要两个对象的主键,因此此时数据库中还没有p的记录。