如何将字段动态添加到特定模型字段而不是全部字段

时间:2019-08-12 18:31:34

标签: django django-models django-forms django-templates django-views

我正在构建一个应用程序,该应用程序具有带有三个字段Company,Name,position的模型。在同一模型中,我希望将公司名称作为一个字段,而用户可以为多个候选人添加名称和职位。之所以尝试这样做,是因为我没有找到任何适当的方法来设置基于输入的公司名称自动选择外键的方法,因为外键是一个下拉列表,并且无法找出使外键字段等于公司的方法输入的姓名。

如果有任何想法,请提供帮助和建议。

1 个答案:

答案 0 :(得分:0)

您需要两种形式(或更有用的是一种形式和一种形式集)。使用表单前缀使它们可区分。将两者都传递给模板,分别表示为selectformcandidate_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=Falsedocs)创建对象,但不保存它们。首先,处理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的表单集,这将使您输入要附加到所选候选人的任意数量的候选人公司。