django - 如何将字段动态添加到特定模型字段而不是全部
问题描述
我正在构建一个应用程序,该应用程序的模型包含公司、姓名、职位三个字段。在同一模型中,我希望将公司名称作为一个字段,而用户可以为多个候选人添加姓名和职位。我试图这样做的原因是因为我没有找到任何合适的方法来设置根据输入的公司名称自动选择外键,因为外键是一个下拉列表并且无法弄清楚使外键字段等于公司的方法输入的名称。
感谢我想到的方法的帮助和建议。
解决方案
您需要两种形式(或者更有用的是一种形式和一种形式集)。使用表单前缀使它们可区分。将两者都传递给模板,比如模板中的selectform
and 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
进入一个表格集,记录在这里,它可以让你输入任意数量的候选人,以附加到一个选定的公司。
推荐阅读
- sql - 我的 SQL 查询末尾的“a”是什么意思?
- python - 基于复杂索引方案分配numpy数组值
- javascript - 允许使用 plotly js 以不同格式导出
- substrate - 将使用 aura + staking 的独立基板节点转换为 polkadot 平行链所需的修改
- reactjs - 如何使用 Tabs 作为链接组件创建 AppBar?
- ruby-on-rails - 在 Windows 10 上使用 Postgres 在 Rails 6 上创建数据库时出错
- python - 将项目分配给熊猫数据框
- bash - 当应用程序使用超过一定数量的 RAM 时,如何从 macOS 获取警报?
- node.js - 为什么 postgres 使用不同的时区进行格式化?
- python - pyodbc 将参数作为 nvarchar 发送