2017-03-31 87 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我正在通過我的答案。您是否認爲此答案有幫助?小心接受? –