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 是一个函数

     

  • 相关阅读:
    STOAdiary20110315完成的任务
    java MD5 密码加密例子
    STOAdiary20110316完成的任务
    个人实习总结
    STOAdiary20110317完成的任务
    Android 操作XML的几种方式
    Ubuntu 桌面图标不见,鼠标右键的问题
    20110329日记
    MySql 中文问题的处理
    20110312wmh日记
  • 原文地址:https://www.cnblogs.com/chengege/p/10736881.html
Copyright © 2011-2022 走看看