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

 

原文地址:https://www.cnblogs.com/chengege/p/10736881.html