2017-10-12 95 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部分在我的功能,但兩個部分是獨立的。第一個讓我們對我的數據庫進行研究。第二個可以創建一個對象到我的數據庫。

我的問題是:我可以用基於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)) 

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

我的問題或我的腳本也許是不好的,看看人們是否存在)和CreateForm。 但這兩個元素都是獨立的。 'get_context_data'可能不是很好的功能? – Deadpool

+0

不幸的是,我不完全理解你,可能是你可以添加你的邏輯,而不是當前代碼的問題。 –

+0

好的,我會編輯我的問題。但是,如果我只想對我的數據庫進行一些研究並使用基於類的視圖將結果顯示在我的模板中,我該怎麼寫呢? – Deadpool

1

我在這裏看到另外一個問題,你在這裏漏掉了檢查的@login_required一部分,這樣做這樣使用的mixin:

from django.contrib.auth.mixins import LoginRequiredMixin 

class IdentityIndividuFormView(LoginRequiredMixin, CreateView) : 

而且我在猜想GET請求的情況下,您可以使用此更新上下文:

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

感謝您的登錄部分。但我最初的問題是:我如何可以有兩個不同的功能,獨立於相同的模板:/ – Deadpool

+0

我想你的表單使用GET請求來顯示頁面和POST來創建一些數據。因此,將完整的GET部分移至def get(),並將創建部分留在form_valid()方法中。 –

相關問題