Django:使用外键保存动态表单
Django: saving dynamic forms with foreign key
我想就我的问题寻求帮助和指导。
我有以下型号:
class myinfo(models.Model):
name = models.CharField(max_length=30, null=True)
class mynumbers(models.Model):
fkey = models.ForeignKey("myinfo")
Job_Position = models.CharField(max_length=30, null=True)
mynumbers
模型是通过 django-dynamic-formset 动态生成的。
我的表格
class info(ModelForm):
name= forms.CharField( max_length=20)
class Meta:
model = APPLICANT_DATA
fields = ('name',)
class numbers(ModelForm):
number = forms.CharField( max_length=20)
class Meta:
model = APPLICANT_DATA
fields = ('number',)
如果您想保存动态表单域,您必须在视图中执行此操作
for field in formset:
field.save()
我的观点:
def index(request):
aformset = formset_factory(numbers)
formset = aformset(request.POST)
form = info(request.POST)
if request.method == 'POST':
if form.is_valid():
if formset.is_valid():
for field in formset:
formset.save()
form.save()
但是当我动态生成的字段有一个引发错误的外键 (mynumbers
) 时,问题就开始了 must be a myinfo instance
。我将如何保存 mynumbers
具有指向 myinfo
的外键的 2 个表单?有没有比我所做的更好的方法?提前谢谢你,
这是 inlineformset_factory
的用武之地。这允许您拥有一个父模型和多个子模型(通过外键与父模型相关)并将它们保存在一起。有许多参数可以传递给 inlineformset_factory 以自定义行为(例如允许的内联表单的最小和最大数量,用户是否可以删除内联表单等)但关键如下所示.
# views.py
from django.forms.models import inlineformset_factory
from my_app.forms import numbers as NumberForm
from my_app.forms import info as InfoForm
from my_app import models
myFormset = inlineformset_factory(models.myinfo,
models.mynumbers,
form=NumberForm
)
def index(request):
if request.POST:
form = InfoForm(request.POST)
if form.is_valid():
info = form.save(commit=False)
formset = myFormset(request.POST, instance=info)
if formset.is_valid():
info.save()
formset.save()
return HttpResponse('saved successfully')
else:
form = InfoForm()
formset = myFormset(instance=models.myinfo())
return render_to_response("recipes/submit.html", {
"form": form,
"formset":formset,
},
context_instance=RequestContext(request))
请注意:在您的问题中,您输入了for field in formset: formset.save()
。表单集是表单的集合,而不是字段的集合。
表单集可能很棘手,需要使用不属于常规表单的其他模板组件正确呈现模板(例如 management_form
允许 Django 正确处理已 added/deleted/moved/changed).为了了解最佳实践,绝对值得做一些教程,这样您就不会陷入使用自定义实现进行故障排除的困境。
我建议 this post from Charles Leifer 作为熟悉基础知识的好入门。
我想就我的问题寻求帮助和指导。
我有以下型号:
class myinfo(models.Model):
name = models.CharField(max_length=30, null=True)
class mynumbers(models.Model):
fkey = models.ForeignKey("myinfo")
Job_Position = models.CharField(max_length=30, null=True)
mynumbers
模型是通过 django-dynamic-formset 动态生成的。
我的表格
class info(ModelForm):
name= forms.CharField( max_length=20)
class Meta:
model = APPLICANT_DATA
fields = ('name',)
class numbers(ModelForm):
number = forms.CharField( max_length=20)
class Meta:
model = APPLICANT_DATA
fields = ('number',)
如果您想保存动态表单域,您必须在视图中执行此操作
for field in formset:
field.save()
我的观点:
def index(request):
aformset = formset_factory(numbers)
formset = aformset(request.POST)
form = info(request.POST)
if request.method == 'POST':
if form.is_valid():
if formset.is_valid():
for field in formset:
formset.save()
form.save()
但是当我动态生成的字段有一个引发错误的外键 (mynumbers
) 时,问题就开始了 must be a myinfo instance
。我将如何保存 mynumbers
具有指向 myinfo
的外键的 2 个表单?有没有比我所做的更好的方法?提前谢谢你,
这是 inlineformset_factory
的用武之地。这允许您拥有一个父模型和多个子模型(通过外键与父模型相关)并将它们保存在一起。有许多参数可以传递给 inlineformset_factory 以自定义行为(例如允许的内联表单的最小和最大数量,用户是否可以删除内联表单等)但关键如下所示.
# views.py
from django.forms.models import inlineformset_factory
from my_app.forms import numbers as NumberForm
from my_app.forms import info as InfoForm
from my_app import models
myFormset = inlineformset_factory(models.myinfo,
models.mynumbers,
form=NumberForm
)
def index(request):
if request.POST:
form = InfoForm(request.POST)
if form.is_valid():
info = form.save(commit=False)
formset = myFormset(request.POST, instance=info)
if formset.is_valid():
info.save()
formset.save()
return HttpResponse('saved successfully')
else:
form = InfoForm()
formset = myFormset(instance=models.myinfo())
return render_to_response("recipes/submit.html", {
"form": form,
"formset":formset,
},
context_instance=RequestContext(request))
请注意:在您的问题中,您输入了for field in formset: formset.save()
。表单集是表单的集合,而不是字段的集合。
表单集可能很棘手,需要使用不属于常规表单的其他模板组件正确呈现模板(例如 management_form
允许 Django 正确处理已 added/deleted/moved/changed).为了了解最佳实践,绝对值得做一些教程,这样您就不会陷入使用自定义实现进行故障排除的困境。
我建议 this post from Charles Leifer 作为熟悉基础知识的好入门。