我正在使用django ModelForms来生成我的输入表单。
我在表单模型中指定仅使用一组字段:
class <Model>Form(ModelForm):
class Meta:
model = <Model>
fields = ('date', 'comment_1')
我的模型定义为:
class <Model>(models.Model):
fk_id_1 = models.ForeignKey(<ExternalModel1>, null=False, blank=False)
fk_id_2 = models.ForeignKey(<ExternalModel2>, null=False, blank=False)
date = models.DateField()
comment_1 = models.CharField(max_length=100)
comment_2 = models.CharField(max_length=100)
但是,ForeignKey框显示。
我怎么可能将它们隐藏在表格中?另外,如何在视图中设置这些Dropbox的值并且不确定,从外部说JQuery可以做到吗?理想情况下,在''is_valid()''检查之后,我想设置我的外键的ID,然后进行保存。也许我应该用另一种方式来解决这个问题?
这是视图:
def <Model>_add(request, trainee_id):
<Model>FormSet = modelformset_factory(<Model>)
if request.method == 'POST':
formset = <Model>FormSet(request.POST, request.FILES)
if formset.is_valid() and formset.has_changed():
formset.save()
# do something.
else:
formset = <Model>FormSet(queryset=<Model>.objects.none())
return render_to_response("<Model>_add.html", {
"formset": formset, "fk_id_1": fk_id_1,
}, context_instance=RequestContext(request))
我可以使用JQuery解决这个问题,但我想要一个更优雅的方法。
注意:我之前尝试发布此内容,但我认为它不像现在这样明确:Presetting values on a foreign entity relationship in a ModelForm ...我不明白究竟是什么关于QuerySet。
答案 0 :(得分:2)
您需要更明确地定义表单:
class <Model>Form(ModelForm):
class Meta:
model = <Model>
fields = ['date', 'comment_1']
exclude = ['fk_id_1', 'fk_id_2']
然后在你看来:
from django.shortcuts import render, redirect
def <Model>_add(request, trainee_id):
<Model>FormSet = modelformset_factory(<Model>)
if request.method == 'POST':
formset = <Model>FormSet(request.POST, request.FILES)
if formset.is_valid() and formset.has_changed():
forms = formset.save(commit=False)
for form in forms:
form.fk_id_1 = SomeOtherModel.objects.get(pk=1)
form.fk_id_2 = SomeOtherModel.objects.get(pk=2)
form.save()
# add your success redirect here, for example:
return redirect('/')
else:
formset = <Model>FormSet(queryset=<Model>.objects.none())
return render(request, "<Model>_add.html", {"formset": formset})
答案 1 :(得分:1)
每个ModelForm也有一个save()方法。 doc
或:
在views.py中
form.instance.fk_id_1 = ...
form.instance.fk_id_2 = ...
form.save()