Django ModelForm ManyToManyField初始值
Django ModelForm ManyToManyField initial value
我正在使用 Django 1.11.2 开发一个网站。我使用 ModelForms 在我的网站上编辑我的模型实例。在我看来,表单的每个字段都通过 'initial' 获得我要编辑的实例的合适值。它适用于除 ManyToManyFields 之外的所有字段。
相关代码如下所示:
models.py:
class model1(models.Model):
name = models.CharField(max_length=45, blank=False, null=False)
class model2(models.Model):
name = models.CharField(max_length=45, blank=False, null=False)
relation = models.ManyToManyField(model1)
forms.py 中的 ModelForm:
class model2_form(forms.ModelForm):
class Meta:
model = model2
fields = '__all__'
以及我用来编辑 model2 实例的视图:
def model2_edit(request, objectid):
link = 'Model2'
model2_inst = model2.objects.get(id=objectid)
form = model2_form(initial={'name': model2_inst.name,
'relation': ???})
if request.method == 'POST':
f = model2_form(request.POST, instance=model2_inst)
if f.is_valid():
f.save()
return HttpResponseRedirect('/model2')
return render(request, "edit_db.html",
{"form": form, "link":link})
每次我通过 ModelForm 编辑 model2 的实例时,已经存在的实例的 'relations' 不会被预选('initial' 不工作)。如果我像这样保存表格而不再次选择关系,它们将被删除并且 model2 的实例不再有任何关系。
在“???”的地方在我的代码中,我尝试了很多方法来获取已在表单中选择的那些关系,但我找不到可行的方法。
我希望我能够描述我的问题,在此先感谢您的任何帮助或想法。
form = model2_form(initial={'name': model2_inst.name,
'relation': [i.id for i in model2_inst.relation.all()]})
您应该为 GET 和 POST 请求提供 instance
。这样,您不需要提供 initial
数据 - Django 会自动从实例中获取值。
model2_inst = model2.objects.get(id=objectid)
form = model2_form(instance=model2_inst)
我正在使用 Django 1.11.2 开发一个网站。我使用 ModelForms 在我的网站上编辑我的模型实例。在我看来,表单的每个字段都通过 'initial' 获得我要编辑的实例的合适值。它适用于除 ManyToManyFields 之外的所有字段。
相关代码如下所示:
models.py:
class model1(models.Model):
name = models.CharField(max_length=45, blank=False, null=False)
class model2(models.Model):
name = models.CharField(max_length=45, blank=False, null=False)
relation = models.ManyToManyField(model1)
forms.py 中的 ModelForm:
class model2_form(forms.ModelForm):
class Meta:
model = model2
fields = '__all__'
以及我用来编辑 model2 实例的视图:
def model2_edit(request, objectid):
link = 'Model2'
model2_inst = model2.objects.get(id=objectid)
form = model2_form(initial={'name': model2_inst.name,
'relation': ???})
if request.method == 'POST':
f = model2_form(request.POST, instance=model2_inst)
if f.is_valid():
f.save()
return HttpResponseRedirect('/model2')
return render(request, "edit_db.html",
{"form": form, "link":link})
每次我通过 ModelForm 编辑 model2 的实例时,已经存在的实例的 'relations' 不会被预选('initial' 不工作)。如果我像这样保存表格而不再次选择关系,它们将被删除并且 model2 的实例不再有任何关系。 在“???”的地方在我的代码中,我尝试了很多方法来获取已在表单中选择的那些关系,但我找不到可行的方法。
我希望我能够描述我的问题,在此先感谢您的任何帮助或想法。
form = model2_form(initial={'name': model2_inst.name,
'relation': [i.id for i in model2_inst.relation.all()]})
您应该为 GET 和 POST 请求提供 instance
。这样,您不需要提供 initial
数据 - Django 会自动从实例中获取值。
model2_inst = model2.objects.get(id=objectid)
form = model2_form(instance=model2_inst)