Skip to main content
 首页 » 编程设计

python之Django : Extract data from table to initially populate a form

2024年10月01日34findumars

我希望最初使用基于另一个应用程序的数据填充我的 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})