基于类的视图上的多个Django函数

时间:2017-09-12 08:11:37

标签: python django

我正在寻找在同一个班级中使用Multiple Django functions并在同一个模板上显示这些功能。

这两个函数都在我的Django模板中,但都没有用,我也不知道为什么。

第一个功能:

此功能可让我根据3个条件搜索我的数据库中的某个人:firstnamelastnamebirthcity。然后我在我的数组中显示查询结果。

第二功能:

此功能很简单Django form

这是我的第一个Django类:

class SocieteFormulaire(TemplateView) :

    template_name= "Societe.html"
    model = Societe


    def get_context_data(self, **kwargs):

        request = self.request

        if 'recherche' in request.GET:

            query_Lastname_ID = request.GET.get('q1LastnameID')
            query_Firstname_ID = request.GET.get('q1FirstnameID')
            query_BirthCity_ID = request.GET.get('q1BirthCityID')

            sort_params = {}

            set_if_not_none(sort_params, 'Lastname__icontains', query_Lastname_ID)
            set_if_not_none(sort_params, 'Firstname__icontains', query_Firstname_ID)
            set_if_not_none(sort_params, 'BirthCity__icontains', query_BirthCity_ID)

            query_list = Societe_Recherche.Recherche_Filter(Societe, sort_params)

            context = {
                "query_Lastname_ID" : query_Lastname_ID,
                "query_Firstname_ID" : query_Firstname_ID,
                "query_BirthCityID" : query_Birthcity_ID,
                "query_list" : query_list,
            }

            return context


    def get_context_data(self, **kwarg) :

        success = False
        request = self.request

        if request.method == 'POST':

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

            if form.is_valid() :
                post = form.save(commit=False)
                for element in settings.BDD :
                    post.save(using=element, force_insert=True)

                messages.success(request, 'Le formulaire a été enregistré !')
                return HttpResponseRedirect(reverse('IndividuResume', kwargs={'id': post.id}))

            else:
                messages.error(request, "Le formulaire est invalide !")

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

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

        return context

我将这两个函数命名为同名,因为如果我不这样做,我的模板上就不会显示第一个函数或我的表单。

所以我的问题是:如何在同一个Django类和同一个Django模板中设置多个函数?

1 个答案:

答案 0 :(得分:2)

你在这里有几个误解和误解。

你不能在Python类中拥有两个具有相同名称的方法。加载类时,第一个将被覆盖。通常的解决方案是将所有代码放在一个方法中,或者使用两个不同的名称,并从另一个方法中调用一个。

但是,你也应该考虑到这个逻辑都不属于get_context_data。这是为模板准备上下文数据,而不是为处理表单提交。

根本问题在于你选择了错误的类来继承并覆盖错误的方法。 TemplateView是一个非常基本的类,当然不应该像这样使用。视图的实际操作是显示和处理创建元素的表单;所以,你应该使用CreateView。然后你可以摆脱第二种方法中的几乎所有代码;视图将为您完成所有处理,您唯一需要做的就是定义form_valid来执行自定义保存逻辑。

如果您愿意,搜索逻辑可以保留在get_context_data中。但是你需要记住调用超类方法,并且即使'recherche' in request.GET为假也返回上下文。