博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
strak组件(5):为列表定制预留钩子方法
阅读量:6656 次
发布时间:2019-06-25

本文共 5241 字,大约阅读时间需要 17 分钟。

效果图:

 

 新增函数

def get_list_display(self):  获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户的不同显示不同的

 

一、stark组件

stark/service/core_func.py

from django.urls import re_pathfrom django.shortcuts import HttpResponse, renderclass StarkHandler(object):    list_display = []    def __init__(self, model_class, prev):        self.model_class = model_class        self.prev = prev    def get_list_display(self):        """        获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户的不同显示不同的列        :return:        """        value = []        value.extend(self.list_display)        return value    def list_view(self, request):        """        列表页面        :param request:        :return:        """        list_display = self.get_list_display() # 会优先调用UserInfoHandler里的get_list_display()方法。        # 1. 处理表格的表头        header_list = []        if list_display:            for field in list_display:                verbose_name = self.model_class._meta.get_field(field).verbose_name                header_list.append(verbose_name)        else:            header_list.append(self.model_class._meta.model_name)  # 如果用户没有填写list_display,就显示表名        # 2. 处理表的内容        data_list = self.model_class.objects.all()        body_list = []        for obj in data_list:            tr_list = []            if list_display:                for field in list_display:                    tr_list.append(getattr(obj, field))            else:                tr_list.append(obj)  # 如果用户没有填写list_display,就显示表对象,所以表类要定义__str__方法            body_list.append(tr_list)        context = {            'data_list': data_list,            'header_list': header_list,            'body_list': body_list,        }        return render(request, 'stark/data_list.html', context)    def add_view(self, request):        """        添加页面        :param request:        :return:        """        return HttpResponse('添加页面')    def edit_view(self, request, pk):        """        编辑页面        :param request:        :return:        """        return HttpResponse('编辑页面')    def delete_view(self, request, pk):        """        删除页面        :param request:        :param pk:        :return:        """        return HttpResponse('删除页面')    def get_url_name(self, crud):        app_label, model_name = self.model_class._meta.app_label, self.model_class._meta.model_name        if self.prev:            return '%s_%s_%s_%s' % (app_label, model_name, self.prev, crud)        return '%s_%s_%s' % (app_label, model_name, crud)    @property    def get_list_url_name(self):        """        获取列表页面URL的name        :return:        """        return self.get_url_name('list')    @property    def get_add_url_name(self):        """        获取添加页面URL的name        :return:        """        return self.get_url_name('add')    @property    def get_edit_url_name(self):        """        获取编辑页面URL的name        :return:        """        return self.get_url_name('edit')    @property    def get_delete_url_name(self):        """        获取删除页面URL的name        :return:        """        return self.get_url_name('delete')    def get_urls(self):        patterns = [            re_path(r'^list/$', self.list_view, name=self.get_list_url_name),            re_path(r'^add/$', self.add_view, name=self.get_add_url_name),            re_path(r'^edit/(\d+)/$', self.edit_view, name=self.get_edit_url_name),            re_path(r'^delete/(\d+)/$', self.delete_view, name=self.get_delete_url_name),        ]        patterns.extend(self.extra_urls())        return patterns    def extra_urls(self):        return []class StarkSite(object):    def __init__(self):        self._registry = []        self.app_name = 'stark'        self.namespace = 'stark'    def register(self, model_class, handler_class=None, prev=None):        """        :param model_class: 是models中的数据库表对应的类。        :param handler_class: 处理请求的视图函数所在的类        :param prev: 生成URL的前缀        :return:        """        if not handler_class:            handler_class = StarkHandler        self._registry.append({
'model_class': model_class, 'handler': handler_class(model_class, prev), 'prev': prev}) def get_urls(self): patterns = [] for item in self._registry: model_class = item['model_class'] handler = item['handler'] prev = item['prev'] app_name, model_name = model_class._meta.app_label, model_class._meta.model_name if prev: patterns.append( re_path(r'^%s/%s/%s/' % (app_name, model_name, prev,), (handler.get_urls(), None, None))) else: patterns.append(re_path(r'^%s/%s/' % (app_name, model_name,), (handler.get_urls(), None, None))) return patterns @property def urls(self): return self.get_urls(), self.app_name, self.namespacesite = StarkSite()

 

二、业务

web/stark.py

from stark.service.core_func import site, StarkHandlerfrom web import modelsclass DepartmentHandler(StarkHandler):    list_display = ['title']class UserInfoHandler(StarkHandler):    list_display = ['name', 'age', 'email']    def get_list_display(self):        return ['name']site.register(models.Department, DepartmentHandler)  # 给部门的url增加了前缀:/stark/web/department/private/site.register(models.UserInfo, UserInfoHandler)

 

转载于:https://www.cnblogs.com/lshedward/p/10565673.html

你可能感兴趣的文章
关于学习程序设计
查看>>
关于Git无法提交 index.lock的解决办法(学)
查看>>
模拟 html radio 的单选效果
查看>>
SPOJ 8073 The area of the union of circles (圆并入门)
查看>>
关于互联网商业模式的一点思考
查看>>
实现待办事项网站回顾
查看>>
做产品也要造概念,讲故事,用优雅的措辞美化自己
查看>>
CPU多级缓存与缓存一致性
查看>>
【转载】#458 Errors While Converting Between enum and Underlying Type
查看>>
checked、disabled在原生、jquery、vue下不同写法
查看>>
android php mysql
查看>>
Java中的接口
查看>>
基于Docker容器的,Jenkins、GitLab构建持续集成CI 之一 Jenkins容器构建
查看>>
POJ-2559-Largest Rectangle in a Histogram(栈)
查看>>
ArcGIS中几种插值方法简述
查看>>
sql 表的连接与查找
查看>>
sqlalchemy python中的mysql数据库神器
查看>>
RSA加密
查看>>
android studio 中移除module和恢复module
查看>>
vue-cli搭建vue项目
查看>>