将基于功能的视图迁移到基于类的视图

时间:2017-10-12 15:01:33

标签: django

根据这个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部分。

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我在这里看到另一个问题,你在这里错过了@login_required部分检查,这样做就像这样使用mixin:

from django.contrib.auth.mixins import LoginRequiredMixin

class IdentityIndividuFormView(LoginRequiredMixin, CreateView) :

我想在GET请求的情况下你可以用这个来更新上下文:

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