2017-10-12 8 views
1

このpostによれば、DjangoアプリケーションでClass Based Views(CBV)を取得するためにスクリプト全体を変更しようとしています。関数ベースのビューをクラスベースのビューに移行

私はCBVを初めて使用しているので、助けを受けたいと思います。

私の前のスクリプト機能は次のようになります。

@login_required 
def IdentityIndividuForm(request) : 

    success = False 
    query_Nom_ID = query_Prenom_ID = query_VilleNaissance_ID = None 

    if 'recherche' in request.GET: 

     query_Nom_ID = request.GET.get('q1NomID') 
     query_Prenom_ID = request.GET.get('q1PrenomID') 
     query_VilleNaissance_ID = request.GET.get('q1VilleNaissanceID') 

     sort_params = {} 

     lib.Individu_Recherche.set_if_not_none(sort_params, 'Nom__icontains', query_Nom_ID) 
     lib.Individu_Recherche.set_if_not_none(sort_params, 'Prenom__icontains', query_Prenom_ID) 
     lib.Individu_Recherche.set_if_not_none(sort_params, 'VilleNaissance__icontains', query_VilleNaissance_ID) 

     query_ID_list = Individu.objects.filter(**sort_params) 

    else : 
     query_ID_list = Individu.objects.none() 

    if request.method == 'POST': 

     form = IndividuFormulaire(request.POST or None, request.FILES or None) 

     if form.is_valid() : 
      post = form.save() 

      return HttpResponseRedirect(reverse('IndividuResume', kwargs={'id': post.id})) 

    else : 
     form = IndividuFormulaire() 
     form.fields['Utilisateur'].initial = request.user.last_name + " " + request.user.first_name 

    context = { 
     "form" : form, 
     "Individu" : Individu, 
     "query_Nom_ID" : query_Nom_ID, 
     "query_Prenom_ID" : query_Prenom_ID, 
     "query_VilleNaissance_ID" : query_VilleNaissance_ID, 
     "query_ID_list" : query_ID_list, 
    } 

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

私は私の機能にGET部分とPOST部分があったが、両方の部分が独立しています。最初のものは私のデータベースを研究することができます。 2つ目は、データベースにオブジェクトを作成することです。

私の質問は、どのようにCBVに基づいた関数でGET部分を上書きできるのですか?

私の新しい機能form_valid(self, form)はうまく機能しますが、GETの部分をCBVの部分に移行するために克服しません。

ありがとうございました!

答えて

1

あなたが望むようにそれが処理を行った後、最初のスーパーコンテキストデータを取得し、それを試してみて、それの後にデフォルトCreateViewであなた

とコンテストのデータを更新することができますがよう、get方法を提供ProcessFormViewのサブクラスであります:

def get(self, request, *args, **kwargs): 
    form_class = self.get_form_class() 
    form = self.get_form(form_class) 
    return self.render_to_response(self.get_context_data(form=form)) 

ので、あなたがgetメソッドをオーバーライドしようとすることができますreturnとして:

return self.render_to_response(self.get_context_data(request, form=form)) 

と私は、このようにミックスインを使用行うために、あなたはここでチェックの@login_required一部を逃したことを、ここでは別の問題を参照してくださいget_context_data

def get_context_data(self, **kwargs) : 

    context_data = super(IdentityIndividuFormView, self).get_context_data(**kwargs) 

    if 'recherche' in self.request.GET: 

     query_Nom_ID = self.request.GET.get('q1NomID') 
     query_Prenom_ID = self.request.GET.get('q1PrenomID') 
     query_VilleNaissance_ID = self.request.GET.get('q1VilleNaissanceID') 

     sort_params = {} 

     lib.Individu_Recherche.set_if_not_none(sort_params, 'Nom__icontains', query_Nom_ID) 
     lib.Individu_Recherche.set_if_not_none(sort_params, 'Prenom__icontains', query_Prenom_ID) 
     lib.Individu_Recherche.set_if_not_none(sort_params, 'VilleNaissance__icontains', query_VilleNaissance_ID) 

     query_ID_list = Individu.objects.filter(**sort_params) 
     context_data['queryset'] = query_ID_list 

    else : 
     query_ID_list = Individu.objects.none() 
     context_data['queryset'] = query_ID_list 

    return context_data 
+0

私の質問やスクリプトは多分悪いですが、私のテンプレートには2つの異なるものがあります。人々が存在するかどうかを参照)とCreateForm。 しかし、両方の要素は独立しています。 'get_context_data'は良い関数ではないでしょうか? – Deadpool

+0

残念ながら、私は完全にあなたを理解していない、質問に現在のコードの代わりにロジックを追加することができるかもしれません。 –

+0

私は質問を編集します。しかし、私はちょうど私のデータベースでいくつかの研究を行い、クラスベースのビューで私のテンプレートに結果を表示したい場合、どのようにそれを書くことができますか? – Deadpool

1

from django.contrib.auth.mixins import LoginRequiredMixin 

class IdentityIndividuFormView(LoginRequiredMixin, CreateView) : 

をそして私は仮定GETリクエストの場合は、次のようにコンテキストを更新することができます:

def get(self, request, *args, **kwargs): 
+0

ありがとうログイン部分。しかし、私の最初の質問は:どのように私は同じテンプレートで独立した2つの異なる機能を持つことができます:/ – Deadpool

+0

あなたのフォームは、ページを表示するためにGET要求といくつかのデータを作成するPOSTを使用すると仮定します。したがって、完全なGET部分をdef get()に移動し、作成部分をform_valid()メソッドのままにしておきます。 –

関連する問題