我有两个模型(组和联系人)。一个组可以有多个联系人,而一个联系人可以在多个组中。
我可以创建联系人,但现在无法创建组。
当我验证form.is_valid()时,它返回false,而我得到的错误是
{'contacts': [ValidationError(['Enter a list of values.'])]}
我在这里想念什么?
models.py
class Contact(models.Model):
# Fields
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=32)
contacts = models.ManyToManyField(Contact, related_name='groups')
表格
class CreateGroupForm(ModelForm):
class Meta:
model = Group
fields = ["name", "contacts"]
widgets = {
'name': TextInput(attrs={
"placeholder" : "",
"class": "form-control"
}),
'contacts': Select(attrs={
"placeholder" : "",
"class": "form-control"
})
}
class CreateContactForm(ModelForm):
class Meta:
model = Contact
fields = "__all__"
widgets = {
'first_name': TextInput(attrs={
"placeholder" : "Nombre",
"class": "form-control"
}),
'last_name': TextInput(attrs={
"placeholder" : "Apellido",
"class": "form-control"
})
}
views.py
def create_group(request):
if request.method == "POST":
form = CreateGroupForm(request.POST)
if form.is_valid():
group = form.save(commit=False)
group.save()
else:
print(form.errors.as_data())
form = CreateGroupForm()
return render(request, 'create-group.html', {'form':form})
elif request.method == "GET":
form = CreateGroupForm(request.POST or None)
return render(request, "create-group.html", { 'form' : form})
对于ManyToManyField
,使用Select
窗口小部件[Django-doc]并没有多大意义,因为仅选择单个元素,因此构建了SelectMultiple
窗口小部件[Django-doc]来选择多个对象。
您还应该查看HTML表单是否确实为该contact
字段提交值。您可以通过检查浏览器数据来做到这一点。
但是,即使您可以使用commit=False
,该表单也无法保存“多对多”字段。事实上,为了节省在许多到许多领域的记录,首先Group
对象应保存,因为结表[维基]有ForeignKey
S到Contact
和Group
,因此这些记录需要首先创建。如果表单无效,也最好不要构造一个新的Form
,因为这样在呈现该表单时将报告错误:
def create_group(request):
if request.method == 'POST':
form = CreateGroupForm(request.POST)
if form.is_valid():
form.save() # ← no commit=False
return redirect('name-of-some-view')
# do not create a new form.
else:
form = CreateGroupForm()
return render(request, "create-group.html", { 'form' : form})
注意:如果POST请求成功,则应创建一个
redirect
[Django-doc]以实现Post / Redirect / Get模式[wiki]。这样可以避免在用户刷新浏览器时发出相同的POST请求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句