zoukankan      html  css  js  c++  java
  • stark组件开发之列表页面自定义函数扩展

    对于展示页面, 可能需要显示一些。 数据库中,没有的字段。 比如, 删除按钮, 编辑按钮。  这个数据库,是没有的。

    所以,可能就需要, 添加一个这个东西。  比如我在渲染的时候, 给他添加两个函数进去。 这个两函数就用来,编辑删除。

    基类:

    class StartHandler(object):
        list_display = []
    
        def __init__(self, model_class, prve):
            self.model_class = model_class
            self.prev = prve
    
        def get_list_display(self):
            '''
            获取不同用户登录时, 页面应该显示的列. 使用时在子类中,重写该方法,指定list_display 要包含哪些值
            :return:
            '''
            value = []
            value.extend(self.list_display)
            return value
    
        def check_list_view(self, request):
            '''
            列表查看页面
            :param request:
            :return:
            '''
            list_display = self.get_list_display()
            # 页面要显示的列 self.list_display  示例:['name', 'age', 'depart']
    
            # 1. 制作表头, 就是每张表中,每个字段写的 verbose_name.。 如何获取到这个值呢?
            # self.model_class._meta.get_field('name').verbose_name
            header_list = []  # 表头
            if list_display:
                for key_or_func in list_display:
                    if isinstance(key_or_func, FunctionType):  # 判断当前参数, 是一个字符串还是一个函数。
                        verbose_name = key_or_func(self, obj=None, is_header=True)
                    else:
                        verbose_name = self.model_class._meta.get_field(key_or_func).verbose_name
                    header_list.append(verbose_name)
            else:
                header_list.append(self.model_class._meta.model_name)
    
            # 2. 处理 从数据库 取到的数据   # 用户访问的表  self.model_class
            data_list = self.model_class.objects.all()
    
            body_list = []
            for row in data_list:
                row_list = []
                if list_display:
                    for key_or_func in list_display:
                        if isinstance(key_or_func, FunctionType):
                            # 这里is_header=False  obj=row(数据库中循环的每一行的对象)
                            row_list.append(key_or_func(self, obj=row, is_header=False))
                        else:
                            row_list.append(getattr(row, key_or_func))
                else:
                    row_list.append(row)
                body_list.append(row_list)
    
            return render(request, "changelist.html",
                          {"header_list": header_list, "data_list": data_list,
                           "body_list": body_list})

     子类:

    class UserInfoHandler(StartHandler):
    
        def display_edit(self, obj=None, is_header=None):
            '''
            自定义页面,显示的列,(表头和内容)
            :param obj:   数据库中每一行记录的 model对象
            :param is_header:  判断是否为表头
            :return:
            '''
            if is_header:
                return "编辑表头"
            return mark_safe("<a href='http://www.baidu.com'>编辑</a>")
    
        def display_del(self, obj=None, is_header=None):
            if is_header:
                return "删除表头"
            return mark_safe("<a href='http://www.baidu.com'>删除</a>")
    
        list_display = ["name", "age", display_edit, display_del]  # 定义表头显示字段
    
    
    site.register(models.UserInfo, UserInfoHandler)

    这样就可以,随意的。在页面展示,想要的内容。

    函数和方法:

    Class Foo(object):
      def func(self, name):
        print(name)

    使用:
    obj = Foo()
    obj.func("alex") # 打印显示 alex。 并且self 自动传递, 不需要手动传递

    然后:
    obj = Foo()
    Foo.func(obj, "alex") # 打印显示 alex。 类去找他下面的方法,需要手动的去传入self。 参数

    一般 使用对象,去调用的时候, 称为 方法。 因为这个是   bound method  绑定方法
    而使用类,去调用的时候, 称为 函数。这个是  function 是一个函数

     

  • 相关阅读:
    sparql学习sparql示例、dbpedia在线验证
    中国绿卡
    逾期率的水有多深,你知道吗?
    ICO和区块链区别
    What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?
    Link static data in sql source control
    sql data compare
    viewbag
    多态的实际使用
    win10 sedlauncher.exe占用cpu处理
  • 原文地址:https://www.cnblogs.com/chengege/p/10736881.html
Copyright © 2011-2022 走看看