2017-03-31 23 views
2

私はDjangoフォームを最初に別のアプリケーションのデータに基づいて作成したいと考えています。私は関数を記述するために、このSO例に従っ:Django:最初にフォームにデータを取り込むためにテーブルからデータを抽出します。

Initial populating on Django Forms

しかし、私は私が欲しいものを得るためにsuccedませんでした。

多くの情報(firstname、...)を持つPersonという名前のモデルがあり、それぞれの人を区別するために非常に便利なunique numberというモデルがあります。これは私の機能です。

次に、出産法を作成するために、フォーム付きの別のモデルBirthCertificateがあります。私のフォームビューでは、ユーザーはunique numberとDjangoは良い人(難しくない)を検索することができます。最初は私のフォーム(Person.modelとBirthCertificate.modelの間にいくつかの共通フィールドがあります)にデータを取り込みます。

私は2つのステップがあります。

  • まず:ユーザが第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になりました。

IDが一意であるため、Personモデルから1つのオブジェクトだけを取得しようとしています。つまり、人が存在し、ユニークであるか、まったく存在しないということです。上記のように、クエリーセットをフィルタリングする必要はありませんが、1つのエントリ(存在する場合)を取得するにはPerson.objects.get(...)で完了します。

@require_http_methods(["GET", "POST"])デコレータを使用すると、ビューにGETリクエストとPOSTリクエストしか許可されず、コード内の2つをチェックする必要があります。基本的には、ケースを2つに制限しています。残りのサービスは、Method not allowedに応答します。

+0

こんにちは、@Deadpool私は私の答えを通過していました。この回答は役に立ちましたか?受け入れるケア? –

関連する問題