• Xadmin控件的实现:〇五查询视图三——list视图封装


    到现在为止,我们已经为list视图添加了分页、显示表头、显示数据内容,添加制定按钮、选择器等功能。结果就是list函数比较臃肿,下面我们就要考虑一下怎么把list视图函数进行一下封装。

    我们看一下现有的ConfXadmin类里的部分函数

    因为list函数调用的多个函数,而这些函数之间还有可能是互相牵扯的,所以这里就不太适合按照函数的形式来封装,这里就应该按照类的形式来封装

    显示类的构造

     就现有的视图目的来说,list视图主要有两个部分:字段标题的显示和数据内容的显示,所以我们把标题和内容分别封装到两个方法里

    class List_View():
        def __init__(self):
            pass
    
        def get_title(self):
            pass
    
        def get_data(self):
            pass

    下面要做的就是把前面list_view里的部分函数直接贴过来

     1 class List_View():
     2     def __init__(self,conf_obj,data_list,request):
     3         self.conf_obj = conf_obj
     4         self.data_list = data_list
     5         self.request = request
     6 
     7     #标题显示
     8     def get_title(self):
     9         
    10         field_title_list = []
    11         for field in self.conf_obj.get_display_field():
    12             if callable(field):
    13                 field_title = field(self.conf_obj,get_title=True)
    14             else:
    15 
    16                 if field == '__str__':
    17                     field_title = self.conf_obj.model_name.upper()
    18                 else:
    19                     field_title = self.conf_obj.model._meta.get_field(field).verbose_name
    20 
    21             field_title_list.append(field_title)
    22 
    23         return field_title_list
    24     
    25     #内容显示
    26     def get_data(self):
    27         show_data_list = []
    28                 
    29         #分页
    30         page = int(self.request.GET.get('page',1))
    31 
    32         data_totle = self.data_list.count()
    33         page_cut = Page_Cut(page=page,
    34                             url_prefix=self.conf_obj.get_list_url(),
    35                             param=self.request.GET,
    36                             data_totle=data_totle)
    37 
    38         cut_html = page_cut.page_html
    39 
    40         cut_data = self.data_list[page_cut.ID_start:page_cut.ID_end]
    41 
    42         for model_obj in cut_data:
    43             temp = []
    44 
    45             for field in self.conf_obj.get_display_field():
    46                 if callable(field):
    47                     val = field(self.conf_obj,model_obj)
    48                 else:
    49                     val = getattr(model_obj,field)
    50                 temp.append(val)
    51 
    52             show_data_list.append(temp)
    53 
    54         return show_data_list,cut_html
    55         
    List_View代码

    这里要注意的地方就是贴代码的时候,self在贴到List_View类里以后随着调用方发生改变,self代指的对象也就不一样了。注意在原函数中,原先的self是ConfXadmin类里的调用的,所以我们需要来List_Vist在实例化的时候把这个self传过去

     1 def list_view(self,request):
     2     new_data_url = self.get_add_url()
     3     all_data = self.model.objects.all()
     4 
     5     view_obj = List_View(self,all_data,request)
     6     
     7 
     8     field_title_list = view_obj.get_title()
     9 
    10     show_data_list,cut_html = view_obj.get_data()
    11 
    12     return render(request,'list.html',locals())

    注意第5行里的实例化的过程,这个self代表的是什么。

    而在后期我们需要修改视图的时候,只要修改那个类就行啦。

    模板的渲染

    由于我们只是修改了list_view()视图,然后在render的时候通过locals()传递的模板变量。所以list.html文件我们是不用修改的。

    其实 还有一种渲染模板的方法,就是直接把实例化的对象传过去,然后在模板中直接调用

    {{view_obj.get_title}}

    这样就拿到了视图中的view_obj对象。然后可以通过for循环生成需要的html代码。

  • 相关阅读:
    unity配置Android SDK,并构建导出apk格式
    eclipse安装Android插件
    jQuery常用事件详解
    jQuery的DOM操作小案例
    jQuery的DOM操作详解
    jQuery九类选择器详解
    jQuery简单入门
    JS表单前台校验模板
    SSH框架整合(全注解)
    SSH框架整合(XML)
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/13511991.html
Copyright © 2020-2023  润新知