我正在构建一个应用程序,该应用程序具有带有三个字段Company,Name,position的模型。在同一模型中,我希望将公司名称作为一个字段,而用户可以为多个候选人添加名称和职位。之所以尝试这样做,是因为我没有找到任何适当的方法来设置基于输入的公司名称自动选择外键的方法,因为外键是一个下拉列表,并且无法找出使外键字段等于公司的方法输入的姓名。
如果有任何想法,请提供帮助和建议。
答案 0 :(得分:0)
您需要两种形式(或更有用的是一种形式和一种形式集)。使用表单前缀使它们可区分。将两者都传递给模板,分别表示为selectform
和candidate_formset
,并在模板中使用
{{selectform}}
{{candidate_formset}}
第一个是公司选择表格。例如,可能是
class CompanySelectForm(forms.ModelForm):
class Meta:
model = Candidate
fields = ['company']
第二个是用于输入一个或(通过一个表单集)要输入的尽可能多的候选者的表单或表单集。看起来像
class CandidateForm(forms.ModelForm):
class Meta:
model = Candidate
fields = ['name','position']
现在,您使用commit=False
(docs)创建对象,但不保存它们。首先,处理CandidateSelectForm
,这将为您提供一个带有有效Candidate
实例的company
对象,但不会保存它。然后再次使用CandidateForm
处理commit=False
的格式集,这将为您提供candidate
实例的列表,这些实例中没有公司,但又未保存。最后,对于此列表中的每个candidate
,将每个candidate
的公司字段设置为CandidateSelectForm
检索到的对象上的字段,并将其保存。
写一个纯视图函数可能比弄乱方法重写试图使基于类的视图以这种方式处理两种形式要容易得多。
编辑-根据要求添加。
该视图可以在Django文档中的this one上建模。我已经按照答案的前面部分进行了明显的更改,但是其中可能充满了错误,在这里我将不再对其进行调试
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create form instances and populate with data from the request:
cs_form = CompanySelectForm(request.POST, prefix="cs")
cand_form = CandidateSelectForm( request.POST, prefix="cand")
# check whether it's valid:
if cs_form.is_valid() and cand_form.is_valid():
selector = cs_form.save(commit=False)
candidate = cand_form(commit=False)
candidate.company = selector.company
candidate.save()
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
cs_form = CompanySelectForm( prefix='cs')
cand_form = CandidateSelectForm( prefix='cand')
return render(request, 'name.html', {
"select_form": cs_form,
"candidate_form": cand_form,
})
针对单个候选人完成此工作后,您可以将candidate_form
转换为记录here的表单集,这将使您输入要附加到所选候选人的任意数量的候选人公司。