2017-03-07 5 views
1

私のウェブサイトでDjango formsからいくつかの要素を改善しようとしています。私のcontext_processors variableがフィルタ条件に表示されない理由を見つけるためにあなたの助けが必要です。CustomLabelModelChoiceFieldでcontext_processors変数を使用する

他のモデル(Identity)によると2つのForeignKeysを持つモデル(BirthCertificate)があります。

  • アイデンティティ:このモデルは、町の人々に関するすべての情報が含まれています(姓、FIRSTNAME、...)

  • 出生届:このモデルでは、Identityからの新しい子供と親の情報に関するすべての情報が含まれていますモデル

私は両方のForeignKeyの選択肢フィールドを表示すると、リストが非常に長いです、私はこのForeigをフィルタリングしたいと思いますこのようなnKeys:

のみそれを行うためには、子

よりも、同じ姓を持つ人々を表示する、私はCustomLabelModelChoiceFieldを使用していると私はqueryset filterを作ってるんです。私はcontext_processorsも使用していますが、query filterの変数を拾うのに克服しません。

マイmodels.pyファイルは次のようになります。私は、私のviews.pyファイルで

class BirthCertificate(models.Model): 

    lastname = models.CharField(max_length=30, null=False, verbose_name='Nom de famille') 
    firstname = models.CharField(max_length=30, null=False, verbose_name='Prénom(s)') 
    sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe') 
    birthday = models.DateField(null=False, verbose_name='Date de naissance') 
    birthhour = models.TimeField(null=True, verbose_name='Heure de naissance') 
    birthcity = models.CharField(max_length=30, null=False, verbose_name='Ville de naissance') 
    birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance') 
    fk_parent1 = models.ForeignKey(Identity, related_name='ID_Parent1', verbose_name='ID parent1', null=False) 
    fk_parent2 = models.ForeignKey(Identity, related_name='ID_Parent2', verbose_name='ID parent2', null=False) 
    created = models.DateTimeField(auto_now_add=True) 

def cached_queries(request): 
    return {'VarLastname' : cache.get('VarLastname')} 

:私のcontext_processors.pyファイルで

def BirthCertificate_Form(request) : 

    query_lastname = request.GET.get('lastname') 
    cache.set('VarLastname', query_lastname, 300) 
    print cache.get('VarLastname') 

    if request.method == 'POST': 
    .... 

を私のforms.pyファイルは次のようになります:

class BirthCertificateForm(forms.ModelForm): 
    fk_parent1 = CustomLabelModelChoiceField(Identity.objects.filter(lastname = cached_queries), required=False, label = "Père", label_func=lambda obj: '%s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity)) 
    fk_parent2 = CustomLabelModelChoiceField(Identity.objects.filter(sex = "Feminin"), required=False, label = "Mère", label_func=lambda obj: '%s %s %s %s' % (obj.lastname, obj.firstname, obj.birthday, obj.birthcity)) 

しかし、クエリフィルタは私のVarLastnameでは機能しません。私は空リストを取得しています。

は私が交換する場合:CustomLabelModelChoiceField(Identity.objects.filter(lastname = "test")によって

CustomLabelModelChoiceField(Identity.objects.filter(lastname = cached_queries)それは働きます!

ご存じですか?

EDIT:@Udiからの回答では

、私の見解は次のようになります。

def BirthCertificate_Form(request) : 
    # Fonction permettant de créer le formulaire Acte de Naissance et le remplissage 

    query_lastname = request.GET.get('lastname') 

    if request.method == 'POST': 

     parents = Identity.objects.filter(lastname=query_lastname) 
     Bform = BirthCertificateForm(request.POST) 
     Bform.fields['fk_parent1'].queryset = parents.filter(sex="Masculin") 
     Bform.fields['fk_parent2'].queryset = parents.filter(sex="Feminin") 

     if Bform.is_valid() : # Vérification sur la validité des données 
      if '_save2' in request.POST : 
       post = Bform.save() 
       return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id})) 

    else: 
     Bform = BirthCertificateForm() 

    context = { 
     "Bform" : Bform, 
     "query_lastname" : query_lastname, 
    } 

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

しかし、動作するようには思えません。私は、フォームのインスタンスを作成した後、フィールドのクエリセットを変更し、あなたのビューでは、なぜ^^

+0

私は理解していれば、あなたが選択リスト '$( "id_fk_parent1")をしたい'と '$( "id_fk_parent2は")'際 '変更します$( "id_lastname") 'が変更されました。 '$(" id_lastname ")。on(" change "、function(...))によってトリガされたajax呼び出しでそれを行う必要があります。 – albar

+0

私は明確にするために私の投稿を完全に編集します! – Deadpool

+0

'request.POST'がありません:' Bform = BirthCertificateForm(request.POST) '!!! – Udi

答えて

1

を探しています:

parents = Identity.objects.filter(lastname=query_lastname) 
form = BirthCertificateForm() 
form.fields['fk_parent1'].queryset = parents.filter(sex="M") 
form.fields['fk_parent2'].queryset = parents.filter(sex="F") 

context_processorsまたはキャッシュを使用する必要はありません。固定(および一部のスタイル)の後

def get_form(lastname, data=None): 
    form = BirthCertificateForm(data) 

    if lastname: 
     qs = Identity.objects.filter(lastname=query_lastname) 
     form.fields['fk_parent1'].queryset = qs.filter(sex="Masculin") 
     form.fields['fk_parent2'].queryset = qs.filter(sex="Feminin") 

    return form 

def birth_certificate_view(request) : 
    lastname = request.GET.get('lastname') 

    if request.method == 'POST': 
     form = get_form(lastname, request.POST) 
     if form.is_valid() : # Vérification sur la validité des données 
      if '_save2' in request.POST : 
       post = form.save() 
       return HttpResponseRedirect(reverse('BC_treated', kwargs={'id': post.id})) 

    else: 
     form = get_form(lastname) 

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

    return render(request, 'bc_form.html', context) 
+0

あなたの答えは私の質問を編集しましたが、今までのところ、 'request.get'ユーザから' fk_parent'をフィルタリングするのに克服していません。 – Deadpool

+0

コードに2つの 'Bform = BirthCertificateForm()'オカレンスがあります。あなたはそれらの両方に対処しなければならないでしょう。 – Udi

+0

私はあなたの答えを編集し、かなりうまくいくソリューションを追加しました;)ありがとう!私は昨日疲れていましたが、今日はあなたが言ったことを理解しています;)このリンクは私が理解するのに役立ちます:http://www.wikiorts.com/wkblog/2009/08/10/pre-populate-django-modelform-with-specific- queryset/ – Deadpool