首页 > 解决方案 > 如何将字段动态添加到特定模型字段而不是全部

问题描述

我正在构建一个应用程序,该应用程序的模型包含公司、姓名、职位三个字段。在同一模型中,我希望将公司名称作为一个字段,而用户可以为多个候选人添加姓名和职位。我试图这样做的原因是因为我没有找到任何合适的方法来设置根据输入的公司名称自动选择外键,因为外键是一个下拉列表并且无法弄清楚使外键字段等于公司的方法输入的名称。

感谢我想到的方法的帮助和建议。

标签: djangodjango-modelsdjango-formsdjango-templatesdjango-views

解决方案


您需要两种形式(或者更有用的是一种形式和一种形式集)。使用表单前缀使它们可区分。将两者都传递给模板,比如模板中的selectformand 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 ) 创建对象但不保存它们。首先, process CandidateSelectForm,它将为您提供一个Candidate具有有效company实例的对象,但不保存它。然后处理 的表单集CandidateForm,再次使用commit=False,这将为您candidate提供没有公司的实例列表,再次未保存。最后,对于candidate此列表中的每个,将每个的公司字段设置为candidate检索到的对象上的字段CandidateSelectForm并保存。

编写一个普通的视图函数可能会更容易,而不是弄乱方法覆盖试图让基于类的视图以这种方式处理两个表单。

编辑 - 应要求添加。

该视图可以在 Django 文档中以该视图为模型。我已经根据答案的前面部分进行了明显的更改,但它可能充满了错误,我不打算在这里进一步调试

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进入一个表格集,记录在这里,它可以让你输入任意数量的候选人,以附加到一个选定的公司。


推荐阅读