stark组件开发之列表页面定制列

先看一张页面展示的效果图:

看一看我的  model 表!是什么样子:

看一看数据库是什么样子:

看 页面展示图,有表头。 有数据。
模型表中,每一个字段, 都指定了 verbose_name。

如何解决?

每个子类中,自定义  list_display  用于指定, 需要展示。 表中的哪个字段(这个名字和表中的字段需要,对应上。 不能错。)
class
UserInfoHandler(StartHandler): list_display = ["name", "age", "depart"] # 定义表头显示字段 site.register(models.UserInfo, UserInfoHandler)
基类中 指定一个变量。 list_display = []  该变量。在子类指定之后。  对象调用时,就会是子类中的 list_display = [......]
class
StartHandler(object): list_display = [] def __init__(self, model_class, prve): self.model_class = model_class self.prev = prve def check_list_view(self, request): ''' 列表查看页面 :param request: :return: ''' # 页面要显示的列 self.list_display 示例:['name', 'age', 'depart'] # 1. 制作表头, 就是每张表中,每个字段写的 verbose_name.。 如何获取到这个值呢? # self.model_class._meta.get_field('name').verbose_name header_list = [] # 表头 for name in self.list_display: verbose_name = self.model_class._meta.get_field(name).verbose_name # 获取到 verbose_name 放入列表中 header_list.append(verbose_name) # 2. 处理 从数据库 取到的数据 # 用户访问的表 self.model_class data_list = self.model_class.objects.all() body_list = [] # 整体的body for row in data_list: row_list = [] # 每一行要展示的内容 for key in self.list_display: row_list.append(getattr(row, key)) # row是个model类对象,使用getattr 获取值 body_list.append(row_list) # 将每一行,添加到 body_list 中。 return render(request, "changelist.html", {"header_list": header_list, "data_list": data_list, "body_list": body_list})

 row_list.append(getattr(row, key))  一定要使用 getattr方法。 不能使用 句点符。

比如 row_list.append(row.key)  . 这样做。在去找外键的时候。 是会报错的。

stark组件开发之列表页面默认显示列:
上面的代码中,基类中的  list_display=[]  所以, 用户就必须要,自己写一个字类,并指定display列表。 才可以使用此功能。
所以需要一个默认展示的功能:

class StartHandler(object):
    list_display = []

    def __init__(self, model_class, prve):
        self.model_class = model_class
        self.prev = prve

    def check_list_view(self, request):
        '''
        列表查看页面
        :param request:
        :return:
        '''
        # 页面要显示的列 self.list_display  示例:['name', 'age', 'depart']

        # 1. 制作表头, 就是每张表中,每个字段写的 verbose_name.。 如何获取到这个值呢?
        # self.model_class._meta.get_field('name').verbose_name
        header_list = []  # 表头
        if self.list_display:
            for name in self.list_display:
                verbose_name = self.model_class._meta.get_field(name).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 self.list_display:
                for key in self.list_display:
                    row_list.append(getattr(row, key))
            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})
默认展示功能,如果用户自己没有,指定 list_display。 默认展示对象就行了。
原文地址:https://www.cnblogs.com/chengege/p/10735768.html