✘  list_view

1.处理表格(默认是显示表结构的所有字段)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
 1 list_display = self.get_list_display()
 2 # 4.1处理表头
 3 header_list = []
 4 if list_display:
 5     for multi_key in list_display:
 6         if isinstance(multi_key,FunctionType):  #判断 传入值是否为函数
 7             verbose_name = multi_key(self,obj=None,is_header=True)
 8         else:
 9             verbose_name = self.model_class._meta.get_field(multi_key).verbose_name
10         header_list.append(verbose_name)
11 else:
12     header_list.append(self.model_class._meta.model_name)
13 
14 # 4.2处理表的内容
15 data_list = queryset[pager.start:pager.end]
16 
17 body_list = []
18 for row in data_list:  #row 是UserInfo object (1)
19     row_list = []
20 
21     if list_display:
22         for multi_key in list_display:
23             if isinstance(multi_key,FunctionType):
24                 row_list.append(multi_key(self,row,is_header=False,*args,**kwargs))
25             else:
26                 row_list.append(getattr(row,multi_key))  #获取UserInfo object (1)的属性
27     else:
28         row_list.append(row)
29 
30     body_list.append(row_list)

 

为了能够扩展以后业务的功能(推出新的业务,高级用户可能要显示多的列或者新的功能),我们可以针对某张表进行自定义修改定制。只需在自己的Handler子类重写此方法

这是StarkHandler类的方法
1
list_display = [] 2 def get_list_display(self): 3 """ 4 获取页面上应该显示的列,预留自定义扩展 5 :return: 6 """ 7 field_list = [] 8 field_list.extend(self.list_display) 9 return field_list

 

 

在上面方法的架构基础下,实现以往对表〔编辑〕〔删除〕的基本功能,同样放在基类中

如图           stark - 4 ⇲ 视图函数 随笔 第1张

 1 def display_edit(self,obj=None,is_header=None):
 2     """
 3     生成<编辑>a标签
 4     :param obj:
 5     :param is_header:
 6     :return:
 7     """
 8     if is_header:
 9         return "编辑操作"
10     change_url = self.reverse_change_url(pk=obj.pk)
11     return mark_safe('<a href="%s">编辑</a>'%change_url)
12 
13 def display_delete(self,obj=None,is_header=None):
14     """
15     生成<删除>a标签
16     :param obj:
17     :param is_header:
18     :return:
19     """
20     if is_header:
21         return "删除操作"
22     delete_url = self.reverse_delete_url(pk=obj.pk)
23     return mark_safe('<a href="%s">删除</a>'% delete_url)

 

示例:

stark - 4 ⇲ 视图函数 随笔 第2张
 1 #models.py下的Major类:
 2 #class Major(models.Model):
 3 #    title = models.CharField(verbose_name='专业',max_length=32)
 4 #
 5 #    def __str__(self):
 6 #        return self.title
 7 
 8 #该model类view函数下,继承StarkHanler,list_display[字段+方法]:
 9 from stark.service.v1 import StarkHandler
10 
11 class MajorHandler(StarkHandler):
12     list_display = ['title',StarkHandler.display_edit,StarkHandler.display_delete]
View Code

 

但是,如果表结构里有choice字段呢?

则需要使用obj.get_字段名_display 获取orm对象的信息。解决的话,同样写一个方法放在基类,以后提取choice字段的信息直接使用

 1 def get_choice_text(title,field):
 2     """
 3     对于Stark组件中定义列时,choice如果想要显示中文信息,调用此方法即可
 4     :param title: 表头名称(自定义)
 5     :param field: 字段名称(需要提取的)
 6     :return:
 7     """
 8     def inner(self,obj=None,is_header=None):
 9         if is_header:
10             return title
11         method = "get_%s_display" %field
12         return getattr(obj,method)()
13 
14     return inner

Exa: list_display=[get_choice_text('性别','gender')]

 

当存储数据多了呢?滚动查找所有数据?

这边借鉴了前辈所写的分页组件

stark - 4 ⇲ 视图函数 随笔 第4张
  1 """
  2 分页组件
  3 """
  4 from django.utils.safestring import mark_safe
  5 
  6 class Pagination(object):
  7     def __init__(self, current_page, all_count, base_url, query_params, per_page=20, pager_page_count=11):
  8         """
  9         分页初始化
 10         :param current_page: 当前页码
 11         :param per_page: 每页显示数据条数
 12         :param all_count: 数据库中总条数
 13         :param base_url: 基础URL
 14         :param query_params: QueryDict对象,内部含所有当前URL的原条件
 15         :param pager_page_count: 页面上最多显示的页码数量
 16         """
 17         self.base_url = base_url
 18         try:
 19             self.current_page = int(current_page)
 20             if self.current_page <= 0:
 21                 raise Exception()
 22         except Exception as e:
 23             self.current_page = 1
 24         self.query_params = query_params
 25         self.per_page = per_page
 26         self.all_count = all_count
 27         self.pager_page_count = pager_page_count
 28         pager_count, b = divmod(all_count, per_page)
 29         if b != 0:
 30             pager_count += 1
 31         self.pager_count = pager_count
 32 
 33         half_pager_page_count = int(pager_page_count / 2)
 34         self.half_pager_page_count = half_pager_page_count
 35 
 36     @property
 37     def start(self):
 38         """
 39         数据获取值起始索引
 40         :return:
 41         """
 42         return (self.current_page - 1) * self.per_page
 43 
 44     @property
 45     def end(self):
 46         """
 47         数据获取值结束索引
 48         :return:
 49         """
 50         return self.current_page * self.per_page
 51 
 52     def page_html(self):
 53         """
 54         生成HTML页码
 55         :return:
 56         """
 57         # 如果数据总页码pager_count<11 pager_page_count
 58         if self.pager_count < self.pager_page_count:
 59             pager_start = 1
 60             pager_end = self.pager_count
 61         else:
 62             # 数据页码已经超过11
 63             # 判断: 如果当前页 <= 5 half_pager_page_count
 64             if self.current_page <= self.half_pager_page_count:
 65                 pager_start = 1
 66                 pager_end = self.pager_page_count
 67             else:
 68                 # 如果: 当前页+5 > 总页码
 69                 if (self.current_page + self.half_pager_page_count) > self.pager_count:
 70                     pager_end = self.pager_count
 71                     pager_start = self.pager_count - self.pager_page_count + 1
 72                 else:
 73                     pager_start = self.current_page - self.half_pager_page_count
 74                     pager_end = self.current_page + self.half_pager_page_count
 75 
 76         page_list = []
 77 
 78         if self.current_page <= 1:
 79             prev = '<li><a href="#">上一页</a></li>'
 80         else:
 81             self.query_params['page'] = self.current_page - 1
 82             prev = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url, self.query_params.urlencode())
 83         page_list.append(prev)
 84         for i in range(pager_start, pager_end + 1):
 85             self.query_params['page'] = i
 86             if self.current_page == i:
 87                 tpl = '<li class="active"><a href="%s?%s">%s</a></li>' % (
 88                     self.base_url, self.query_params.urlencode(), i,)
 89             else:
 90                 tpl = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.query_params.urlencode(), i,)
 91             page_list.append(tpl)
 92 
 93         if self.current_page >= self.pager_count:
 94             nex = '<li><a href="#">下一页</a></li>'
 95         else:
 96             self.query_params['page'] = self.current_page + 1
 97             nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),)
 98         page_list.append(nex)
 99         page_str = "".join(page_list)
100         return mark_safe(page_str)
View Code

 

✘  add_view

✘  change_view

✘  delete_view

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄