stark - 4 ⇲ 视图函数
✘ 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
在上面方法的架构基础下,实现以往对表〔编辑〕〔删除〕的基本功能,同样放在基类中
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)
示例:

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')]
当存储数据多了呢?滚动查找所有数据?
这边借鉴了前辈所写的分页组件

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

更多精彩