2017-03-31 90 views
2

我正在寻找最初使用基于其他应用的数据填充我的Django表单。我跟着这个SO比如为了写我的功能:Django:从表中提取数据以最初填充表单

Initial populating on Django Forms

不过,我并没有赢得成功得到我想要的东西。这是我的功能应该做的:

我有一个模型被命名为:Person有很多信息(名字,...)和一个非常有用的unique number为了区分每个人。

然后,我有另一个模型命名为BirthCertificate与形式,以创建一个出生法。在我的表单视图中,用户给出了这个unique number,并且Django能够搜索好人(不难)并且最初填充我的表单(它们在Person.model和BirthCertificate.model之间有一些共同的字段)。

我有2个步骤:

  • 第一:用户写人的唯一编号
  • 二:用户写父母的唯一编号

我提交此信息的第一步应首先填写共同的领域。第二步工作得很好。

这是我的功能,但是有些事情还是不工作:

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我的一部分?

谢谢

回答

1

的原因,为什么它不工作是:sc_obj不会存在填充初始数据时,不发送social_number。理想情况下,它会引发异常“sc_obj未定义”。

您可以通过将其放在try: except:块中,然后打印/记录堆栈跟踪来避免这种情况。

此外,如果表单无效,您将重新填充表单。通过这样做,你正在失去表单的错误部分。

让我知道这是否正常工作/这是你期待什么:

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}) 
1

TL; DR:

from django.views.decorators.http import require_http_methods 

@require_http_methods(["GET", "POST"]) # Allow only GET, POST methods 
def BirthCertificate_Form_Unique_Number_View(request): #Add View in name for clarity 
    # GET request case 
    if request.method == "GET": 
     data = request.GET 
     sc_obj = Person.objects.get(social_number=data.get('social_number', '')) 
     if sc_obj: 
      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 = data.get('social_number_father') 
      query_social_number_mother = data.get('social_number_mother') 
      form = BirthCertificateForm() 
      parent1 = Person.objects.get(social_number=query_social_number_father) 
      parent2 = Person.objects.get(social_number=query_social_number_mother) 
      form.fields['fk_parent1'] = parent1 
      form.fields['fk_parent2'] = parent2 
    # POST request case 
    elif request.method == "POST": 
     form = BirthCertificateForm(request.POST) 
     # Assuming this works as intended 
     if form.is_valid(): # Check data 
      post = form.save() 
      return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id})) 

    context = { 
     "form" : form, 
     "person" : person, 
    } 

    return render(request, 'BC_form2.html', context) 

所呈现你的方法,试图填补该表单无需等待请求中的数据social_number。因此,它默认为你的代码的else部分。

您正试图从Person模型中获取一个对象,因为该ID是唯一的。这意味着,一个人存在并且是独一无二的,或根本不存在。上面提到过,你不需要过滤你的查询集,而只需要检索一个条目(如果存在),并且这是通过Person.objects.get(...)完成的。

随着@require_http_methods(["GET", "POST"])修饰器的使用,您只允许对您的视图进行GET和POST请求,并且您必须在代码中检查这2个。从本质上讲,您仅限于两种情况,其余服务将回复:Method not allowed

+0

嗨,@Deadpool我正在通过我的答案。您是否认为此答案有帮助?小心接受? –