对于展示页面, 可能需要显示一些。 数据库中,没有的字段。 比如, 删除按钮, 编辑按钮。 这个数据库,是没有的。
所以,可能就需要, 添加一个这个东西。 比如我在渲染的时候, 给他添加两个函数进去。 这个两函数就用来,编辑删除。
基类:
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 是一个函数