我有两个多多关系的模型。在我看来,我想处理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
的记录。