要实现,这个方法。子类中 list_diplay 这个列表, 就不能够写死。
他应该是 可以根据。用户的不同,返回不同的值。

所以 就需要一个函数, 可以进行判断当前用户是谁。 并且往这个列表中添加,他可以查看的东西。
所以,我在 StartHandler 基类中。 定义了一个方法,就是用于返回。这个list_display 列表。

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 name in 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 list_display:
                for key in 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})
StartHandler
def get_list_display(self):  这段代码的作用,就只是。获取到,当前这个对象的  list_display 列表然后。 返回一个列表。

然后,列表视图函数中, 要使用这个  list_display   就掉用这个方法。 就可以了!

完成了,这个就很容易了。  我只需要在 继承这个 基类的  子类中。 再次去重写这个  def get_list_display(self):    并且返回值是一个包含模型表中,字段的列表就可以了!

在这里,每个 Handler 子类。 就可以分别进行。判断当前用户是谁。 并且它拥有哪些查看的权限。从而让他查看哪些内容。

逻辑代码写在这里,就没问题了!

比如,先来个简单的:

class UserInfoHandler(StartHandler):

    def get_list_display(self):
        '''预留的自定义扩展。调用父类方法,返回一个包含 模型表字段的 列表。 并且可以根据用户的不同,显示不同的列'''
        return ["depart"]

 

只返回一个  ["depart"]  

看页面的展示:

 

 只有  部门 能够查看了!! 

 

posted on 2019-04-19 15:55  rookiehbboy  阅读(225)  评论(0编辑  收藏  举报