要实现,这个方法。子类中 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})
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"]
看页面的展示:
只有 部门 能够查看了!!