我希望最初使用基于另一个应用程序的数据填充我的 Django 表单。我按照这个 SO 示例来编写我的函数:
Initial populating on Django Forms
然而,我并没有成功得到我想要的。这是我的函数应该做的:
我有一个名为 : Person 的模型,其中包含很多信息(名字,...)和一个非常有用的 unique number 以区分每个人。
然后,我有另一个名为 BirthCertificate 的模型,其中包含一个用于创建出生法案的表单。在我的表单 View 中,用户提供了这个 unique number 并且 Django 能够搜索好人(不难)并且最初填充我的表单(它在 Person.model 和 BirthCertificate.model 之间有一些公共(public)字段) .
我有 2 个步骤:
- 首先:用户写下个人的唯一编号
- 第二:用户写下 parent 的唯一号码
我提交此信息,第一步应该首先填充公共(public)字段。第二步效果很好。
这是我的功能,但有些东西仍然无法正常工作:
def BirthCertificate_Form_unique_number(request) :
#User fill some fields
query_social_number = request.GET.get('social_number')
query_social_number_father = request.GET.get('social_number_father')
query_social_number_mother = request.GET.get('social_number_mother')
if query_social_number :
query_social_number_list = Person.objects.filter(social_number=query_social_number)
if query_social_number_list:
sc_obj = query_social_number_list[0]
#For example : sc_obj.lastname will extract lastname
# etc ...
else :
query_social_number_list = Person.objects.none()
initial_data = {
'lastname': sc_obj.lastname,
'firstname': sc_obj.firstname,
'birthday': sc_obj.birthday,
'sex' : sc_obj.sex,
'birthcity': sc_obj.birthcity
}
form = BirthCertificateForm(request.POST or None, initial=initial_data)
if form.is_valid() : # Check data
post = form.save()
return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id}))
else:
form = BirthCertificateForm()
parent1 = Person.objects.filter(social_number=query_social_number_father)
parent2 = Person.objects.filter(social_number=query_social_number_mother)
form = BirthCertificateForm(request.POST or None)
form.fields['fk_parent1'].queryset = parent1
form.fields['fk_parent2'].queryset = parent2
context = {
"form" : form,
"person" : person,
}
return render(request, 'BC_form2.html', context)
如何重新组织关于 query_social_number 的部分?
谢谢
请您参考如下方法:
它不起作用的原因是:sc_obj 不会在未发送 social_number 时出现以填充初始数据。理想情况下,它会引发异常“sc_obj 未定义”。
您可以通过将它放在 try: except: block 中然后打印/记录堆栈跟踪来避免这种情况。
如果表单无效,您还要重新填写表单。通过这样做,您将丢失表单的错误部分。
让我知道这是否可行/这是否符合您的期望:
def BirthCertificate_Form_unique_number(request):
# User fill some fields
if request.method == 'GET':
data = request.GET
persons = Person.objects.filter(social_number=data.get('social_number', ''))
if persons:
sc_obj = persons.first() # .latest()
# For example : sc_obj.lastname will extract lastname
# etc ...
initial_data = {
'lastname': sc_obj.lastname,
'firstname': sc_obj.firstname,
'birthday': sc_obj.birthday,
'sex': sc_obj.sex,
'birthcity': sc_obj.birthcity
}
form = BirthCertificateForm(initial=initial_data)
else:
query_social_number_father = request.GET.get('social_number_father')
query_social_number_mother = request.GET.get('social_number_mother')
form = BirthCertificateForm()
parent1 = Person.objects.filter(social_number=query_social_number_father)
parent2 = Person.objects.filter(social_number=query_social_number_mother)
form.fields['fk_parent1'].queryset = parent1
form.fields['fk_parent2'].queryset = parent2
elif request.method == 'POST':
form = BirthCertificateForm(request.POST)
if form.is_valid(): # Check data
post = form.save()
return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id}))
else:
raise Exception("Method not allowed")
return render(request, 'BC_form2.html', {"form": form, "person": person})
