def role_list(request): """ 角色列表 :param request: :return: """ role_queryset = models.Role.objects.all().order_by('-id') query_params = request.GET.copy() pager = Pagination(current_page=request.GET.get('page'), all_count=role_queryset.count(), base_url=request.path_info, query_params=query_params, per_page=10) data_list = role_queryset[pager.start:pager.end] user_name = None user_name_dict = request.session.get("show_permission") if user_name_dict: user_name = user_name_dict.get("user_name") return render( request, 'rbac/role_list.html', { 'roles': data_list, 'pager': pager, "users": user_name, "rest_password": request.session.get("rest_password"), "user_edit_href": request.session.get("user_edit_href"), "queryset_count": request.session.get("queryset_count"), "queryset_count_all": request.session.get('queryset_count_all') })
def changelist_view(self, request): if request.method == 'POST': action_name = request.POST.get('action') action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求') response = getattr(self, action_name)(request) if response: return response # ##### 处理搜索 ##### search_list, q, con = self.get_search_condition(request) # ##### 处理分页 ##### from stark.utils.pagination import Pagination total_count = self.model_class.objects.filter(con).count() query_params = request.GET.copy() query_params._mutable = True page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=7) # 获取组合搜索筛选 origin_queryset = self.get_queryset() # logger.debug(con,self.get_list_filter_condition()) # 获取开始结束时间 kssj, jssj = self.get_time(request) queryset = origin_queryset.extra( select={"inserttime": "DATE_FORMAT(inserttime, '%%Y-%%m')"}).filter(inserttime__range=(kssj,jssj)).filter(con).filter(**self.get_list_filter_condition()).order_by( *self.get_order_by()) src=self.get_plt(request,queryset) cl = CangeList_pic(self, queryset, q, search_list, page) # ######## 组合搜索 ######### # list_filter = ['name','user'] context = { 'cl': cl, 'src':src, } return render(request,'business_presen/picmon.html',context)
def changelist_view(self, request): """ 所有URL的查看列表页面 :param request: :return: """ if request.method == 'POST': action_name = request.POST.get('action') action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求') response = getattr(self, action_name)(request) if response: return response # ##### 处理搜索 ##### search_list, q, con = self.get_search_condition(request) # ##### 处理分页 ##### total_count = self.model_class.objects.using('orac119').filter(con).count() query_params = request.GET.copy() query_params._mutable = True page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=7) list_filter = self.get_list_filter() # 获取组合搜索筛选 queryset = Domain.objects.using('orac119').filter(con).filter(**self.get_list_filter_condition()).order_by(*self.get_order_by()).distinct()[page.start:page.end] cl = ChangeList(self, queryset, q, search_list, page) # ######## 组合搜索 ######### # list_filter = ['name','user'] context = { 'cl': cl } return render(request, 'stark/changelist.html', context)
def changelist_view(self, request): """ 列表页面 :param request: :return: """ # 1.处理分页 # 数据库里面所有的数据 all_data = self.model_class.objects.all() query_params = request.GET.copy() # copy方法是默认不能修改request.GET里面的参数的 query_params._mutable = True # 这样就可以修改request.GET 里面的参数值了 pager = Pagination( current_page=request.GET.get('page'), # 获取页面返回的获取的页码 all_count=all_data.count(), # 数据库里面所有数据的计算 base_url=request. path_info, # 访问的基础URL,例如 http://127.0.0.1/abc?name=ryan&age=18 里面的 http://127.0.0.1/abc/ params= query_params, # 用户URL里面的参数,例如 http://127.0.0.1/abc?name=ryan&age=18里面的name=ryan&age=18,它是 QueryDict类型 per_page_num=self.per_page_num # 这个是每页显示的个数(扩展,可以在网页端输入,然后在传入服务器端) ) # 列表展示页使用分页的设置 (切片的应用) data_list = all_data[pager.start:pager.end] # 2.处理表格 list_display = self.get_list_display() # 2.1 处理表头 header_list = [] if list_display: # 如果有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: # 如果没有list_display(展示列),那么表头就是它的表名 header_list.append(self.model_class._meta.model_name) # 2.2 处理表的内容 # queryset[对象1,对象2] body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append(key_or_func(self, row, is_header=False)) else: tr_list.append(getattr(row, key_or_func)) else: tr_list.append(row) body_list.append(tr_list) # 3.添加按钮 add_btn = self.get_add_btn() return render(request, 'stark/changelist.html', locals())
def changelist_view(self, request): """ 视图的get请求-list 所有URL的查看列表页面 """ # POST请求 if request.method == 'POST': # action获取用户选择的批量动作 action_name = request.POST.get('action') # 获取执行动作 key 函数名 value 函数本身 action_dict = self.get_action_dict() # 判断用户提交请求是否在执行动作里面 因为后面要用反射执行方法,所有要判断,不然有黑客攻击,尝试提交各种方法动作 if action_name not in action_dict: return HttpResponse('非法请求') # self 对象本生 action_name:函数名(该函数需要自己在每个app下stark组件编写) 传入参数 request请求体 response = getattr(self, action_name)(request) # 拿到处理结果-响应体 self starkconfig对象 if response: # 响应体内容存在 return response # 返回数据给用户 # ##### 处理搜索 ##### search_list, q, con = self.get_search_condition(request) # ##### 处理分页 ##### from stark.utils.pagination import Pagination # filter 接收 查询条件 显示数据 count() 将查询出来的数据计算条数, 用于分页 total_count = self.model_class.objects.filter(con).count() # 复制GET请求的数据 query_params = request.GET.copy() # 保修搜索条件 # 可以修改用户提交的请求体数据 query_params._mutable = True # 分页实例 # request.GET.get('page'):用户选择的页码数 # total_count:数据总条数 # request.path_info:URL # query_params:用户提交的所有GET请求数据 # per_page:每页显示的数量 page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=7) # list_filter = self.get_list_filter() # 试试用到没,先注释了 # 获取组合搜索筛选 origin_queryset = self.get_queryset() # queryset(queryset数据数据类型-当作列表使用) 根据查询条件进行显示数据 [page.start:page.end]:列表切片操作 显示多少数据 # 在组合查询中添加distinct-为了数据去重 # 而且该连表查询:inner join queryset = origin_queryset.filter(con).filter(**self.get_list_filter_condition()).order_by( *self.get_order_by()).distinct()[page.start:page.end] # cl实例化ChangeList列表页面所有功能 # config = self 对象本身(实例化:StarkConfig) #q:用户提交查询 #search_list:查询字段列表 # page:分页对象 cl = ChangeList(self, queryset, q, search_list, page) # 字典是要传给前端模板中做渲染用的 context = { 'cl': cl } return render(request, 'stark/changelist.html', context)
def __init__(self, config_obj, queryset, request): self.config_obj = config_obj self.request = request self.queryset = queryset # 分页功能三行代码 current_page = self.request.GET.get("page", 1) self.page_obj = Pagination(current_page=current_page, all_count=self.queryset.count(), params=self.request.GET) self.page_queryset = self.queryset[self.page_obj.start:self.page_obj. end]
def changelist_view(self, request, *args, **kwargs): """ 所有URL的查看列表页面 :param request: :return: """ if request.method == 'POST' and request.POST.get('_action'): action_name = request.POST.get('action') action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求') response = getattr(self, action_name)(request) if response: return response # ##### 处理搜索 ##### search_list, q, con = self.get_search_condition(request) # ##### 处理分页 ##### from stark.utils.pagination import Pagination total_count = self.model_class.objects.filter(con).count() query_params = request.GET.copy() query_params._mutable = True page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=7) # ##### 获取组合搜索筛选 ##### origin_queryset = self.get_queryset(request, *args, **kwargs) queryset = origin_queryset.filter(con).filter( **self.get_list_filter_condition()).order_by( *self.get_order_by()).distinct()[page.start:page.end] # ##### model formset ##### model_form_set_class = self.get_model_form_set_class() model_formset = model_form_set_class(queryset=queryset, form_kwargs={'request': request}) if request.method == "POST" and request.POST.get('_multi_save'): model_formset = model_form_set_class( data=request.POST, queryset=queryset, form_kwargs={'request': request}) if model_formset.is_valid(): model_formset.save() return redirect(self.reverse_list_origin_url()) cl = ChangeList(self, queryset, q, search_list, page, model_formset) context = {'cl': cl} return render(request, 'stark/changelist.html', context)
def changelist_view(self, request): """ 列表页面 :param request: :return: """ # 1.处理分页 # 数据库里面所有的数据 all_data = self.model_class.objects.all() query_params = request.GET.copy() # copy方法是默认不能修改request.GET里面的参数的 query_params._mutable = True # 这样就可以修改request.GET 里面的参数值了 pager = Pagination(current_page=request.GET.get('page'), all_count=all_data.count(), base_url=request.path_info, params=query_params, per_page_num=self.per_page_num) # 列表展示页使用分页的设置 data_list = all_data[pager.start:pager.end] # 处理表格 list_display = self.get_list_display() # 1.处理表头 header_list = [] if list_display: # 如果有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: # 如果没有list_display(展示列),那么表头就是它的表名 header_list.append(self.model_class._meta.model_name) # 2.处理表的内容 # queryset[对象1,对象2] body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append(key_or_func(self, row, is_header=False)) else: tr_list.append(getattr(row, key_or_func)) else: tr_list.append(row) body_list.append(tr_list) return render(request, 'stark/changelist.html', locals())
def changelist_view(self, request): """ 数据表格的处理和展示 展示内容 1、数据表格 2、批量操作 3、添加按钮 4、 :param request: :return: """ ####批量操作Action#### if request.method == 'POST': action_name = request.POST.get('action') # 为过滤非法请求而使用字典,判断请求的方法在不在字典中 action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求') response = getattr(self, action_name)(request) if response: # 返回值的作用是,提高体验感,做玩操作后,应该有展示该动作执行后的效果 return response ####关键字搜索#### search_list, search_condition, con = self.get_search_condition(request) #####处理分页##### page = self.request.GET.get('page') # 数据总条数 obj_tatal_count = self.model_class.objects.filter(con).count() # 原条件URL,直接copy后传递过去,默认不能修改 query_params = request.GET.copy() # 设置_mutable,或者用QueryDict方法转换成字典,就可以修改了 query_params._mutable = True page_obj = Pagination(page, obj_tatal_count, request.path_info, query_params, per_page=7) # 表格要显示的数据对象列表 orign_queryset = self.get_queryset() queryset = orign_queryset.filter(con).filter( **self.get_list_filter_condition()).order_by( *self.get_order_by()).distinct()[page_obj.start:page_obj.end] # 传参数类对象的应用 change_list_parameter = ChangeListParameters(self, queryset, search_list, search_condition, con) return render(request, 'stark/changelist.html', locals())
def changelist_view(self, request): """ 所有URL的查看列表后面 :param request: :return: """ if request.method == 'POST': action_name = request.POST.get('action') action_dict = self.get_action_dict() if action_name not in action_dict: # 防止恶意执行其他函数 return HttpResponse('非法请求') response = getattr(self, action_name)(request) # 根据反射执行相应函数 if response: return response # ########处理搜索####### search_list, q, con = self.get_search_condition(request) # ########处理分页########## from stark.utils.pagination import Pagination total_count = self.model_class.objects.filter(con).count() query_params = request.GET.copy() query_params._mutable = True page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=15) self.get_list_filter() # 获取组合搜索筛选 origin_queryset = self.get_queryset() queryset = origin_queryset.filter(con).filter( **self.get_list_filter_condition()).order_by( *self.get_order_by()).distinct()[page.start:page.end] cl = ChangeList(self, queryset, q, search_list, page) # 调用封装函数 # ####组合搜索###### # list_filter = ['name', 'user'] context = {'cl': cl} return render(request, 'stark/changelist.html', context)
def business_presen_dqpic_list(self,request,pk): '''图片显示''' search_list = ['colleteid'] con = self.get_search_condition_url(request) conn =self.get_search_condition_dqpic(request,search_list) total_count = DqPic.objects.using('orac119').filter(domainid=pk).filter(con).filter(conn).count() query_params = request.GET.copy() query_params._mutable = True page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=8) queryset = DqPic.objects.using('orac119').filter(domainid=pk).filter(con).filter(conn).distinct().values('url')[page.start:page.end] # print(queryset) q = request.GET.get('q', "") context = { 'urls': queryset, 'page': page, 'search_list': search_list, 'q': q, } return render(request, 'business_presen/url.html',context)
def changelist_view(self, request): """ 所有URL查看列表页面 :param request: :return: """ if request.method == 'POST': action_name = request.POST.get('action') action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求') response = getattr(self, action_name)(request) if response: return response ### 处理搜索 ### search_list, q, con = self.get_search_condition(request) # ##### 处理分页 ##### from stark.utils.pagination import Pagination # 总条数 total_count = self.model_class.objects.filter(con).count() # 复制GET参数 query_params = request.GET.copy() # 允许编辑 query_params._mutable = True # 使用分页类Pagination,传入参数。每页显示3条 page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=3) # 根据排序列表进行排序,以及分页功能 queryset = self.model_class.objects.filter(con).order_by( *self.get_order_by())[page.start:page.end] cl = ChangeList(self, queryset, q, search_list, page) context = {'cl': cl} # 注意:要传入参数 return render(request, 'stark/changelist.html', context)
def changelist_view(self, request): """ 所有URL的查看列表页面 """ if request.method == "POST": action_name = request.POST.get("action") action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求') response = getattr(self, action_name)(request) if response: return response ############ 搜索处理 ################ search_list, q, con = self.get_search_condition(request) ############ 分页处理 ################ from stark.utils.pagination import Pagination total_count = self.model_class.objects.filter(con).count() query_params = request.GET.copy() query_params._mutable = True # 实例化,每页显示7条数据 page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=7) list_filter = self.get_list_filter() # 获取组合搜索筛选 queryset = self.model_class.objects.filter(con).filter(**self.get_list_filter_condition()).order_by( *self.get_order_by()).distinct()[page.start:page.end] cl = ChangeList(self, queryset, q, search_list, page) ############ 组合搜索 ################ context = { 'cl': cl, } return render(request, 'stark/changelist.html', context)
def changelist_view(self, request, *args, **kwargs): """ 列表页面 :param request: :return: """ ################ 1.批量操作(处理Action 下拉框) ############# action_list = self.get_action_list() action_dict = { func.__name__: func.text for func in action_list } # {'action_multi_delete':'批量删除','action_depart_multi_init':'批量初始化'} # 并且此时的multi_delete 是一个对象的名称 if request.method == "POST": action_func_name = request.POST.get( "action" ) # action_func_name,type(action_func_name),bool(action_func_name) = multi_init <class 'str'> True if action_func_name and action_func_name in action_dict: # <bound method UserInfoHandler.multi_delete of <app01.stark.UserInfoHandler object at ...>> action_response = getattr(self, action_func_name)(request, *args, **kwargs) print("action_response", action_response) if action_response: # 如果调用的批量处理函数有返回值,则执行返回值 return action_response ################ 2.模糊搜索 ############# """ 1.如果search_list 中没有值,则不显示搜索框 2.获取用户提交的关键字 3.构造条件 """ search_list = self.search_list search_key_value = request.GET.get('q', '') from django.db.models import Q # Q 用于构造复杂的ORM查询条件 conn = Q() conn.connector = 'OR' if search_key_value: for item in search_list: conn.children.append((item, search_key_value)) ################ 3.排序处理 ############# order_list = self.get_order_list() ################ 4.处理分页 ############# # 数据库里面所有的数据 # 获取组合搜索条件 search_group_condition = self.get_search_group_condition(request) prev_queryset = self.get_queryset(request, *args, **kwargs) all_data = prev_queryset.filter(conn).filter( **search_group_condition).order_by(*order_list) query_params = request.GET.copy() # copy方法是默认不能修改request.GET里面的参数的 query_params._mutable = True # 这样就可以修改request.GET 里面的参数值了 pager = Pagination( current_page=request.GET.get('page'), # 获取页面返回的获取的页码 all_count=all_data.count(), # 数据库里面所有数据的计算 base_url=request. path_info, # 访问的基础URL,例如 http://127.0.0.1/abc?name=ryan&age=18 里面的 /abc params=query_params, # 用户URL里面的参数,例如 http://127.0.0.1/abc?name=ryan&age=18里面的name=ryan&age=18,它是 QueryDict类型 per_page_num=self.per_page_num # 这个是每页显示的个数(扩展,可以在网页端输入,然后在传入服务器端) ) # 列表展示页使用分页的设置 (切片的应用) data_list = all_data[pager.start:pager.end] ################ 5.处理表格 ############# list_display = self.get_list_display() # 5.1 处理表头 header_list = [] if list_display: # 如果有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: # 如果没有list_display(展示列),那么表头就是它的表名 header_list.append(self.model_class._meta.model_name) # 5.2 处理表的内容 # queryset[对象1,对象2] body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append( key_or_func(self, row, is_header=False, *args, **kwargs)) else: tr_list.append(getattr(row, key_or_func)) else: tr_list.append(row) body_list.append(tr_list) ################ 6.添加按钮 ############# add_btn = self.get_add_btn(request, *args, **kwargs) ################ 7.组合搜索 ############# search_group_row_list = [] search_group = self.get_search_group() # ['gender', 'depart'] for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) return render(request, self.change_list_template or 'stark/changelist.html', locals())
def list_view(self, request, *args, **kwargs): """ 列表页面 :param request: :return: """ # 处理批量操作 action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list} # {'multi_delete':'批量删除','multi_init':'批量初始化'} if request.method == 'POST': action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: return action_response # 获取搜索关键词列表 search_list = self.get_search_list() search_value = request.GET.get('q', '') conn = Q() conn.connector = 'OR' if search_value: for item in search_list: conn.children.append((item, search_value)) # 获取排序结果 order_list = self.get_order_list() # 获取组合搜索条件 search_group_condition = self.get_search_group_condition(request) prev_queryset = self.get_queryset(request, *args, **kwargs) queryset = prev_queryset.filter(conn).filter( **search_group_condition).order_by(*order_list) # 处理分页 all_count = queryset.count() query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), base_url=request.path_info, all_count=all_count, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] # 处理表格的表头 display_list = self.get_display_list() header_list = [] if display_list: for key_or_func in display_list: if isinstance(key_or_func, FunctionType): verbose_name = key_or_func(self, None, True, *args, **kwargs) else: tmp_field = self.model_class._meta.get_field(key_or_func) verbose_name = tmp_field.verbose_name header_list.append(verbose_name) else: header_list.append(self.model_class._meta.model_name) # 处理表格的内容 body_list = [] for row in data_list: tr_list = [] if display_list: for key_or_func in display_list: if isinstance(key_or_func, FunctionType): tr_list.append( key_or_func(self, row, False, *args, **kwargs)) else: tr_list.append(getattr(row, key_or_func)) else: tr_list.append(row) body_list.append(tr_list) # 生成添加按钮 add_btn = self.get_add_btn(request, *args, **kwargs) # 处理组合搜索 search_group_row_list = [] search_group = self.get_search_group() # ['depart', 'gender'] for option_obj in search_group: row = option_obj.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) return render( request, self.list_template or 'stark/list.html', { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group_row_list': search_group_row_list, })
def list_view(self, request, *args, **kwargs): """ 列表页面 :param request: :return: """ # 1. 处理action action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list} # 往模板传函数,模板会自动执行,所以要用这个方式,而且后台也需要获取函数名,然后通过反射执行这个函数。 # {'multi_delete':'批量删除', 'multi_init':'批量初始化'} if request.method == 'POST': action_func_name = request.POST.get('action') # 不能为空(用户必须选择了复选框),而且函数名必须在定义的字典里,防止用户在前端传入其他函数名对网站造成破坏。 if action_func_name and action_func_name in action_dict: action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: # 如果有返回值就返回返回值,不往下走了。 例如: redirect('https://www.taobao.com) return action_response # 2. 处理搜索 search_list = self.get_search_list() search_value = request.GET.get('q', '') conn = Q() conn.connector = 'OR' if search_value: for item in search_list: conn.children.append((item, search_value)) # 3. 获取排序 order_list = self.get_order_list() # 获取组合搜索的条件 search_group_condition = self.get_search_group_condition(request) prev_queryset = self.get_queryset(request, *args, **kwargs) queryset = prev_queryset.filter(conn).filter( **search_group_condition).order_by(*order_list) # 4.处理分页 all_count = queryset.count() query_params = request.GET.copy() # page=1&level=2 # query_params._mutable = True # 把_mutable变成True,才可以被修改page # query_params['page'] = 2 pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page_data=self.per_page_count, ) data_list = queryset[pager.start:pager.end] list_display = self.get_list_display(request, *args, **kwargs) # 5. 处理表格的表头 # 访问http://127.0.0.1:8000/stark/app01/userinfo/list # 页面上要显示的列,示例:['name', 'age', 'email'] header_list = [] if list_display: for field_or_func in list_display: # self.model_class._meta.get_field()拿到的是数据库里的一个字段 if isinstance(field_or_func, FunctionType): verbose_name = field_or_func(self, obj=None, is_header=True) header_list.append(verbose_name) else: verbose_name = self.model_class._meta.get_field( field_or_func).verbose_name header_list.append(verbose_name) else: header_list.append( self.model_class._meta.model_name) # 没有定义list_display,让表头显示表名称 # 6. 处理表的内容 ['name','age'] body_list = [] for queryset_obj in data_list: tr_list = [] if list_display: for field_or_func in list_display: if isinstance(field_or_func, FunctionType): # field_or_func是函数(类调用的),所以要传递self tr_list.append( field_or_func(self, queryset_obj, False, *args, **kwargs)) else: tr_list.append(getattr(queryset_obj, field_or_func)) # obj.depart else: tr_list.append(queryset_obj) body_list.append(tr_list) # 7.处理添加按钮 add_btn = self.get_add_btn(request, *args, **kwargs) # 8. 处理组合搜索 search_group = self.get_search_group() # ['gender','depart'] search_group_row_list = [] for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) # 传request,*args,**kwargs是为了处理用户通过url传过来的参数 context = { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group': search_group, 'search_group_row_list': search_group_row_list, } # 定义了self.list_template就用self.list_template当模板 return render(request, self.list_template or 'stark/data_list.html', context)
def changelist_view(self, request, *args, **kwargs): """ 列表页面 :param request: :return: """ # 访问http://127.0.0.1:8000/stark/app01/depart/list/; self.model_class = app01.models.Depart # 访问http://127.0.0.1:8000/stark/app01/userinfo/list/; self.model_class = app01.models.UserInfo # 访问http://127.0.0.1:8000/stark/app02/role/list/; self.model_class = app02.models.Role # 访问http://127.0.0.1:8000/stark/app02/host/list/; self.model_class =app02.models.Host # self.models_class # ########## 1. 处理Action ########## action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list } # {'multi_delete':'批量删除','multi_init':'批量初始化'} if request.method == 'POST': # 批量操作,执行对应的函数 action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: # 如果该函数想批量操作完成后,跳转,可以给函数写返回值 action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: # return redirect("http://www.baidu.com") return action_response search_list = self.get_search_list() search_value = request.GET.get('q', '') conn = Q() conn.connector = 'OR' if search_value: for item in search_list: conn.children.append((item, search_value)) # ########## 1. 获取排序 ########## order_list = self.get_order_list() # 获取组合的条件 search_group_condition = self.get_search_group_condition(request) queryset = self.model_class.objects.filter(conn).filter( **search_group_condition).order_by(*order_list) # ########## 2. 处理分页 ########## all_count = queryset.count() # 默认是不可以被修改的 query_params = request.GET.copy() # 该项设置为True,就可以修改了 query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] # ########## 2. 处理表格 ########## list_display = self.get_list_display() # 1. 处理表格的表头 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. 处理表的内容 # data_list = self.model_class.objects.all() body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: # obj = Foo() # # obj.func('wupeiqi') # 方法 # print(obj.func) # <bound method Foo.func of <__main__.Foo object at 0x00000184BC63D390>> # 不需要手动传递self # 如果是函数 # # obj = Foo() # # Foo.func(obj, 'vita') # 函数 # print(Foo.func) # <function Foo.func at 0x00000184BE473950> # 需要手动传递self if isinstance(key_or_func, FunctionType): tr_list.append(key_or_func(self, row, is_header=False)) else: tr_list.append(getattr(row, key_or_func)) # obj.gender else: tr_list.append(row) body_list.append(tr_list) # ##########3. 添加按钮 ######### add_btn = self.get_add_btn() # ########## 7. 组合搜索 ######### search_group_row_list = [] search_group = self.get_search_group() # ['gender', 'depart'] for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) return render( request, 'stark/changelist.html', { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'add_btn': add_btn, 'search_group_row_list': search_group_row_list })
def changelist_view(self, request, *args, **kwargs): """ 列表页面 :param request: :return: """ # ########## 1. 处理Action ########## action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list } # {'multi_delete':'批量删除','multi_init':'批量初始化'} if request.method == 'POST': action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: return action_response # ########## 2. 获取排序 ########## search_list = self.get_search_list() search_value = request.GET.get('q', '') conn = Q() conn.connector = 'OR' if search_value: for item in search_list: conn.children.append((item, search_value)) # ########## 3. 获取排序 ########## order_list = self.get_order_list() # 获取组合的条件 search_group_condition = self.get_search_group_condition(request) queryset = self.model_class.objects.filter(conn).filter( **search_group_condition).order_by(*order_list) # ########## 4. 处理分页 ########## all_count = queryset.count() query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] # ########## 5. 处理表格 ########## list_display = self.get_list_display() # 5.1 处理表格的表头 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) # 5.2 处理表的内容 body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append(key_or_func(self, row, is_header=False)) else: tr_list.append(getattr(row, key_or_func)) # obj.gender else: tr_list.append(row) body_list.append(tr_list) # ########## 6. 添加按钮 ######### add_btn = self.get_add_btn() # ########## 7. 组合搜索 ######### search_group_row_list = [] search_group = self.get_search_group() # ['gender', 'depart'] for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) return render( request, 'stark/changelist.html', { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group_row_list': search_group_row_list })
def changelist_view(self, request, *args, **kwargs): """ 列表页面 - self.list_display的查找顺序 - 'Model'Handler()对象中找 - 'Model'Handler类中找 - StarkHandler类中找 :param request: :param self.list_display: 页面要显示的列(要显示的表中的字段) :param self.model_class: 用户要访问的表 :return: """ # ********************************************需要初始化的数据************************************************** order_list = self.get_ordered_list() # 获取排序 # ********************************************自定义批量操作下拉菜单******************************************** action_list = self.get_action_list() # 获取自定义批量操作函数的列表 action_dict = {func.__name__: func.text for func in action_list} # 为了页面能进行展示并方便后期调用函数,选择使用字典格式,key是函数名,value是函数的中文名 """ action_dict = { 函数名:函数中文名, } """ if request.method == "POST": func_name = request.POST.get("batch_operation") # 获取被选中的批量操作的函数名称 if func_name and func_name in action_dict: # 判断批量操作选项是否忘记了选,从而设置了默认选项 action_response = getattr(self, func_name)(request, *args, **kwargs) # 通过反射来查找批量操作的函数,执行对应的函数,并把提交来的所有数据的ID的列表传进函数内 if action_response: return action_response # ********************************************进行关键字搜索操作************************************************ search_list = self.get_search_list() # 获取搜索位置的字段 if not search_list: # 如果当前表没有定义搜索的字段,则不显示搜索框,反之就显示 search_list = None keyword = request.GET.get("keyword", "") conn = Q() # 实例化一个Q查询对象,用于构造搜索条件 if keyword: # 获取搜索关键字 conn.connector = "OR" # 指明里面的多个关系之间用or(或)链接 for condition in search_list: conn.children.append((condition, keyword)) # 批量导入搜索的字段和关键字,来批量生成搜索条件 prev_queryset = self.get_queryset(request, *args, **kwargs) search_group_condition = self.get_search_group_condition(request) # 获取组合搜索的条件也同样加到filter里面进行过滤 query_set = prev_queryset.filter(conn).filter(**search_group_condition).order_by(*order_list) # ********************************************做一个分页器****************************************************** # 实例化一个分页器对象 """ 做一个分页器 1.根据用户访问的页面,计算出数据库索引的位置 2.生成HTML中的页码 """ data_count = query_set.count() # 从数据库中获取所有的数据 query_params = request.GET.copy() # 复制GET中的所有数据 query_params._mutable = True # 设置request.GET中的数据可以被修改 pager = Pagination( current_page=request.GET.get("page"), # 获取当前页码 all_count=data_count, # 表中数据的数量 base_url=request.path_info, # 基础URL query_params=query_params, # GET中原有的数据 per_page=self.per_page_count, # 每页显示的条数 ) # ********************************************进行页面表头部分的展示******************************************** # 获取表头需要展示的部分 header_list = [] # 用于存放表头的verbose_name(中文名称) list_display = self.get_list_display(request, *args, **kwargs) # 根据用户的不同来定制不同的列 if list_display: # 这里是表进行了自定义展示列的情况 for field_or_func in list_display: if isinstance(field_or_func, FunctionType): # 判断列表中这个元素是一个字符串还是一个函数(用于展示修改删除按钮的) verbose_name = field_or_func(self, obj=None, is_header=True, *args, **kwargs) # 如果是一个函数,就执行这个函数 else: verbose_name = self.model_class._meta.get_field(field_or_func).verbose_name # 通过字段获取当初在表中设置的该字段的verbose_name header_list.append(verbose_name) else: # 这里是默认展示的情况 header_list.append(self.model_class._meta.model_name) # ********************************************进行页面表内部分的展示******************************************** # 处理表内展示的内容 data_list = [] # 从数据库中获取所有的数据(通过页码来进行切片,决定一次取出多少数据) data_queryset = query_set[pager.start:pager.end] for row in data_queryset: row_list = [] # 为每个row记录初始化一个空列表用于存放每个对应字段的值 if list_display: # 这是当自定义展示时的处理 for field_or_func in list_display: if isinstance(field_or_func, FunctionType): # 用于判断开发者是否在列表内放了函数(用于展示的修改删除按钮) row_list.append(field_or_func(self, obj=row, is_header=False, *args, **kwargs)) # 把生成的按钮也放入需要展示的列表中 else: row_list.append(getattr(row, field_or_func)) # 通过反射来获取每个记录中对应字段的值 else: row_list.append(row) # 如果是默认展示的情况,就直接展示记录对象,不对记录字段进行展开显示 data_list.append(row_list) # 把一个row完整的数据存放到汇总的列表中 # ********************************************组合搜索功能****************************************************** search_group_row_list = [] search_group = self.get_search_group() # 获取组合搜索字段列表 for search_option_obj in search_group: # 根据str格式的字段名去对应的表中获取字段,并根据对象去获取关联数据 # 这个row可能是元祖类型或者是Queryset类型 row = search_option_obj.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) # 根据开发者自定义的字段和条件来获取相应的数据,用于展示组合搜索 search_group_row_list.append(row) # ********************************************给页面设置一个公用的数据添加按钮********************************** add_btn = self.get_add_btn(request, *args, **kwargs) # 处理添加按钮 return render( request, self.change_list_template or "stark/change_list.html", { "data_list": data_list, "header_list": header_list, "pager": pager, "add_btn":add_btn, "search_list": search_list, "current_keyword": keyword, "action_dict": action_dict, "search_group_row_list": search_group_row_list, } )
def changelist_view(self, request): # 批量操作 if request.method == 'POST': action_name = request.POST.get('action') action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求!') response = getattr(self, action_name)(request) if response: return response action_list = self.get_action_list() action_list = [{ 'name': func.__name__, 'text': func.text } for func in action_list] #处理搜索 search_list, q, conn = self.get_search_condition(request) #处理分页 total_count = self.model_class.objects.filter(conn).count() query_params = request.GET.copy() query_params._mutable = True page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=10) query_set = self.model_class.objects.filter(conn).filter( **self.get_list_filter_condition()).order_by( *self.get_order_by()).distinct()[page.start:page.end] list_display = self.get_list_display() #添加按钮 add_btn = self.get_add_btn() #组合搜索 list_filter = self.get_list_filter() list_filter_rows = [] for option in list_filter: _field = self.model_class._meta.get_field(option.field) row = option.get_queryset(_field, self.model_class, request.GET) list_filter_rows.append(row) header_list = [] if list_display: for name_or_func in list_display: if isinstance(name_or_func, FunctionType): verbose_name = name_or_func(self, header=True) else: verbose_name = self.model_class._meta.get_field( name_or_func).verbose_name header_list.append(verbose_name) else: header_list.append(self.model_class._meta.model_name) body_list = [] for row in query_set: row_list = [] if not list_display: row_list.append(row) body_list.append(row_list) continue for name_or_func in list_display: if isinstance(name_or_func, FunctionType): val = name_or_func(self, row=row) else: val = getattr(row, name_or_func) row_list.append(val) body_list.append(row_list) return render(request, 'stark/changelist.html', locals())
def changelist_view(self, request, *args, **kwargs): """ 所有URL的查看列表页面 :param request: :return: """ if request.method == 'POST' and request.POST.get('_action'): action_name = request.POST.get('action') action_dict = self.get_action_dict() if action_name not in action_dict: return HttpResponse('非法请求') response = getattr(self, action_name)(request) if response: return response # ##### 处理搜索 ##### search_list, q, con = self.get_search_condition(request) # ##### 处理分页 ##### from stark.utils.pagination import Pagination total_count = self.model_class.objects.filter(con).count() query_params = request.GET.copy() query_params._mutable = True page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=15) print(">>>>>", page.start, page.end) # ################################## # from app01.utils import dome_ping # host_list_quert= self.model_class.objects.filter(id__lt=page.end,id__gt=page.start).values() # print(">>>>host_list_quert",host_list_quert) # # hosts = [] # host_staus = [] # for h in host_list_quert: # hosts.append(h["hostname"]) # host_staus.append({h["hostname"]: h["device_status_id"]}) # # host_ping_result = dome_ping.demo_ping(hosts) # for host_result in host_ping_result: # for k, v in host_result.get().items(): # # print("k is %s,v is %s" % (k, v)) # if v: # self.model_class.objects.filter(hostname=k).update(device_status_id=1) # else: # self.model_class.objects.filter(hostname=k).update(device_status_id=2) ############################### # ##### 获取组合搜索筛选 ##### origin_queryset = self.get_queryset(request, *args, **kwargs) queryset = origin_queryset.filter(con).filter( **self.get_list_filter_condition()).order_by( *self.get_order_by()).distinct()[page.start:page.end] print("queryset", queryset) # ##### model formset ##### model_form_set_class = self.get_model_form_set_class() model_formset = model_form_set_class(queryset=queryset, form_kwargs={'request': request}) if request.method == "POST" and request.POST.get('_multi_save'): model_formset = model_form_set_class( data=request.POST, queryset=queryset, form_kwargs={'request': request}) if model_formset.is_valid(): model_formset.save() return redirect(self.reverse_list_origin_url()) cl = ChangeList(self, queryset, q, search_list, page, model_formset) context = {'cl': cl} return render(request, 'stark/changelist.html', context)
def check_list_view(self, request, *args, **kwargs): ''' 列表查看页面 :param request: :return: ''' list_display = self.get_list_display( request, *args, ** kwargs) # 页面要显示的列 self.list_display 示例:['name', 'age', 'depart'] # ####################1. 处理 Action ###################### action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list } # func.__name__获取函数名, func.text获取函数文本 if request.method == "POST": action_func_name = request.POST.get("action") if action_func_name and action_func_name in action_dict: # 前端发送过来的name 必须要在 action_dict中。 action_respons = getattr(self, action_func_name)(request, *args, **kwargs) if action_respons: return action_respons # #######################2. 处理表头############################## # 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, *args, **kwargs) 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) # ##################3. 获取排序,和, 模糊搜索的条件###################### order_list = self.get_ordered_list() # 排序方式 默认 使用 id 进行正向排序 search_list = self.get_search_list( ) # 搜索的条件 ["name_contains", "email"] ''' 1. 如果 search_list 为空, 则不显示 搜索框 2. 获取用户输入的 关键字 3. 构造搜索条件 ''' search_value = self.request.GET.get( "q", "") # 获取用户发送过来的关键字,如果没有 q 这个参数。 就返回 "" conn = Q() conn.connector = "OR" # 让添加进来的条件, 做 or 判断 if search_value: # 接收到了用户的搜索,才进行模糊查询。 否则啥都不干 for item in search_list: conn.children.append((item, search_value)) # ###############4. 从数据库过滤出想要的数据################## # 计算总数量,和 表格显示内容时,都需要,就提取出来了 search_group_condition = self.get_search_group_condition(request) prev_queryset = self.get_queryset(request, *args, **kwargs) query_set = prev_queryset.filter(conn).filter( **search_group_condition).distinct().order_by(*order_list) # ####################5. 处理分页###################### '''1.根据用户访问页面,计算出索引的位置, 比如 page=3 2. 生成html页码 ''' all_count = query_set.count() # 得到查询到的数据的总数量 query_params = request.GET.copy() # page=1&level=2 query_params._mutable = True # request.get中的值默认是不能被修改的。加上这句代码就可以修改了 pager = Pagination( current_page=request.GET.get("page"), # 用户访问的当前叶 all_count=all_count, # 数据库一共有多少数据 base_url=request.path_info, # 所在的url 就是 ?page=1 之前的URL # 用于保留,用户的请求信息,比如 level=2 被用户先选中。 那么分页后。因为查询的东西少了,分页也应该想要的减少, # 但是level=2这个, 请求的信息!不能因为。分页的原因。而减少。 query_params=query_params, per_page=self.per_page, # 每页显示多少数据。 ) # ##################5. 处理表格###################### data_list = query_set[pager.start:pager.end] # 对得到的内容。 进行切片获取,并展示到页面上 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, *args, **kwargs)) else: row_list.append(getattr(row, key_or_func)) else: row_list.append(row) body_list.append(row_list) # ################6. 处理添加按钮###################### add_btn = self.get_add_btn(request, *args, **kwargs) # request还用不到。加上只是以放万一 # ####################7. 处理组合搜索################### search_group_row_list = [] # 修改之后这里 search_group = self.get_search_group( ) # ["gender", "classes", "depart"] for option in search_group: queryset_or_list = option.get_queryset_or_list( self.model_class, request) search_group_row_list.append(queryset_or_list) return render( request, self.check_list_template or "stark/changelist.html", { "header_list": header_list, "data_list": data_list, "body_list": body_list, "pager": pager, "add_btn": add_btn, "search_list": search_list, "search_value": search_value, "action_dict": action_dict, "search_group_row_list": search_group_row_list })
def changelist_view(self, request, *args, **kwargs): """ 列表页面 :param request: :return: """ # ################# 批量操作 ########### action_list = self.action_list action_dict = {func.__name__: func.text for func in action_list} if request.method == "POST": action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: func = getattr(self, action_func_name) action_response = func(request, *args, **kwargs) if action_response: # 有返回值 return action_response # ########模糊搜索######### search_list = self.get_search_list() search_value = request.GET.get('q', '') # 用Q构造复杂的ORM查询条件 conn = Q() conn.connector = 'OR' if search_value: for item in search_list: conn.children.append((item, search_value)) # #############数据排序方式######### order_list = self.get_order_list() # 获取组合条件 search_group_condition = self.get_search_group_condition(request) queryset = self.model_class.objects.filter(conn).filter( **search_group_condition).order_by(*order_list) # #########处理分页###### all_count = queryset.count() query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] # #########处理表格######### list_display = self.get_list_display() # 1. 处理表格的表头 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、处理表的内容 body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append(key_or_func(self, row, is_header=False)) else: tr_list.append(getattr(row, key_or_func)) else: tr_list.append(row) body_list.append(tr_list) # ########添加按钮######### add_btn = self.get_add_btn() # ############组合搜索################# search_group_list = [] search_group = self.get_search_group() for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) print(str(row), type(row)) search_group_list.append(row) print(search_group_list, "?") return render( request, 'stark/changelist.html', { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group_list': search_group_list, })
def list_view(self, request, *args, **kwargs): """ 视图函数:列表页面 附加功能:组合搜索|关键字搜索|排序|批量操作|数据列表展示|分页器 :param request: :param args: :param kwargs: :return: """ # 1. 组合搜索 search_group_row_list = [] search_group = self.get_search_group() for option_object in search_group: # 可迭代对象,以渲染html标签 row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) # 组合搜索的搜索条件 search_group_condition = self.get_search_group_condition(request) # 2. 关键字搜索 search_list = self.get_search_list() search_value = request.GET.get('q', '') conn = Q() conn.connector = 'OR' if search_value: for item in search_list: # 关键字搜索的搜索条件 conn.children.append((item, search_value)) # 3. 排序 order_list = self.get_order_list() # 4. 最终数据(组合搜索+关键字搜索+排序) prev_queryset = self.get_queryset(request, *args, **kwargs) queryset = prev_queryset.filter(conn).filter( **search_group_condition).order_by(*order_list) # 5. 数据分页 all_count = queryset.count() query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] # 6.1 数据展示:表格头 header_list = [] list_display = self.get_list_display(request, *args, **kwargs) if list_display: for key_or_func in list_display: # 自定义的展示列(包括原生的choice属性) 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) # 6.2 数据展示:表格内容 body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: # 自定义的展示列(包括原生的choice属性) if isinstance(key_or_func, FunctionType): tr_list.append( key_or_func(self, row, False, *args, **kwargs)) # 原生的属性展示列 else: tr_list.append(getattr(row, key_or_func)) else: # 没设置展示列时,表头设置为表的__str__返回值 tr_list.append(row) body_list.append(tr_list) # 7.1 批量操作:展示 action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list} # 7.2 批量操作:执行 if request.method == 'POST': action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: action_response = getattr(self, action_func_name)(request, *args, **kwargs) # 预留的定制执行成功后的返回页面 if action_response: return action_response # 8. 添加按钮 add_btn = self.get_add_btn(request, *args, **kwargs) return render( request, self.list_template or 'stark/list.html', { 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group_row_list': search_group_row_list, })
def url_details(self, request, pk, sd=None): obj = Reptile_reg.objects.filter(pk=pk).first() if sd != 'None': sd = sd[5:] url = base64.b64decode(sd).decode('utf-8') domain = obj.domain + ':' + 'text' body = rehis_zero.hget(domain, url) return HttpResponse(body) web_type = request.GET.get('type') query_params = request.GET.copy() query_params._mutable = True request.GET._mutable = True if not web_type: request.GET['type'] = 'pic' if request.GET.get('type') == 'pic': domain = obj.domain + ':' + 'img' c2 = ChangeList_type(self, request.GET) total_count = rehis_zero_pic.hlen(domain) total_count = int(total_count) page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=3) s = rehis_zero_pic.hscan(domain, cursor=page.start, count=12) return render(request, 'business_func/url_details.html', { 'srcs': s, 'c2': c2, 'page': page }) elif request.GET.get('type') == 'text': domain = obj.domain + ':' + 'text' total_count = rehis_zero_pic.hlen(domain) total_count = int(total_count) page = Pagination(request.GET.get('page'), total_count, request.path_info, query_params, per_page=3) s = rehis_zero.hscan(domain, cursor=page.start, count=12) s_list = [] s_dict = {} for k in s[1].keys(): k = str(k, encoding='utf-8') # url_base = base64.b64decode(k.encode('utf-8')) bm = base64.b64encode(k.encode('utf-8')) base_url = str(bm, encoding='utf-8') s_dict[k] = base_url c2 = ChangeList_type(self, request.GET) return render(request, 'business_func/url_details.html', { 'texts': s_dict, 'c2': c2, 'page': page }) elif request.GET.get('type') == 'video': domain = obj.domain + ':' + 'video' s = rehis_zero.hscan(domain, cursor=0, count=12) c2 = ChangeList_type(self, request.GET) return render(request, 'business_func/url_details.html', { 'video': s, 'c2': c2 }) else: return HttpResponse('输入网址有误')
def changelist_view(self, request, *args, **kwargs): """ 列表页面 """ # ########## 1. 处理Action ########## action_list = self.get_action_list() # func.__name__获取函数名,如果直接给前端传递func函数,在前端会自动调用func(), action_dict = {func.__name__: func.text for func in action_list } # {'multi_delete':'批量删除','multi_init':'批量初始化'} if request.method == 'POST': action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: # 确认是否在action_dict里,防止恶意 action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: # 如果执行的函数有返回值,例如执行后确认或执行后跳转到其他页面 return action_response # 执行函数返回值 # ########## 2. 获取搜索条件 ########## search_list = self.get_search_list() search_value = request.GET.get('q', '') conn = Q() conn.connector = 'OR' # 构造or条件 if search_value: for item in search_list: conn.children.append((item, search_value)) # 构造搜索条件: name__contains="Kris"/depart="IT"。。。。 # ########## 3. 获取排序 ########## order_list = self.get_order_list() # 获取组合的条件 search_group_condition = self.get_search_group_condition(request) # 获取当前model全数据queryset prev_queryset = self.get_queryset(request, *args, **kwargs) # filter(conn) 过滤搜索对象 queryset = prev_queryset.filter(conn).filter( **search_group_condition).order_by(*order_list) # ########## 4. 处理分页 ########## all_count = queryset.count() # 获取总数据 query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) # 实例化分页组件 data_list = queryset[pager.start:pager.end] # ########## 5. 处理表格 ########## list_display = self.get_list_display() # 5.1 处理表格的表头 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: # 如果没有list_display则使用该类的表名称 header_list.append(self.model_class._meta.model_name) # 5.2 处理表的内容 body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append(key_or_func(self, row, is_header=False)) else: tr_list.append(getattr( row, key_or_func)) # obj.gender通过反射获取每个字段的内容 else: # 如果没有则直接打印对象的__str__ tr_list.append(row) body_list.append(tr_list) # ########## 6. 添加按钮 ######### add_btn = self.get_add_btn(request, *args, **kwargs) # ########## 7. 组合搜索 ######### search_group_row_list = [] search_group = self.get_search_group() # ['gender', 'depart'] for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) return render( request, 'stark/changelist.html', { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group_row_list': search_group_row_list })
def changelist_view(self, request, *args, **kwargs): """ 列表页面 :param request: :return: """ # ########## 1. 处理Action ########## action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list } # {'multi_delete':'批量删除','multi_init':'批量初始化'} if request.method == 'POST': action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: return action_response # ########## 2. 获取排序 ########## search_list = self.get_search_list() search_value = request.GET.get('q', '') conn = Q() conn.connector = 'OR' if search_value: for item in search_list: conn.children.append((item, search_value)) # ########## 3. 获取排序 ########## order_list = self.get_order_list() # 获取组合的条件 search_group_condition = self.get_search_group_condition(request) prev_queryset = self.get_queryset(request, *args, **kwargs) queryset = prev_queryset.filter(conn).filter( **search_group_condition).order_by(*order_list) # 时间模糊搜索搜索 fuzzy_time = request.GET.get('time') fuzzy_time_list = str(fuzzy_time).split("-") fuzzy_search_list = self.get_fuzzy_search() if fuzzy_search_list and fuzzy_time: queryset = queryset.filter( registration_time__year=fuzzy_time_list[0], registration_time__month=fuzzy_time_list[1], registration_time__day=fuzzy_time_list[2]).order_by( *order_list) ########### 下载 ########### queryset_dict["download_data"] = queryset # ########## 4. 处理分页 ########## all_count = queryset.count() query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] # ########## 5. 处理表格 ########## list_display = self.get_list_display(request, *args, **kwargs) # 5.1 处理表格的表头 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) # 5.2 处理表的内容 body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append( key_or_func(self, row, False, *args, **kwargs)) else: tr_list.append(getattr(row, key_or_func)) # obj.gender else: tr_list.append(row) body_list.append(tr_list) # ########## 6. 添加按钮 ######### add_btn = self.get_add_btn(request, *args, **kwargs) download_btn = self.get_download_btn(request, *args, **kwargs) # ########## 7. 组合搜索 ######### search_group_row_list = [] search_group = self.get_search_group() # ['gender', 'depart'] for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) # for i in search_group_row_list: # for j in i: # print(j) return render( request, self.change_list_template or 'stark/changelist.html', { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'download_btn': download_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group_row_list': search_group_row_list, "rest_password": request.session.get("rest_password"), "user_edit_href": request.session.get("user_edit_href"), "queryset_count": request.session.get("queryset_count"), "queryset_count_all": request.session.get('queryset_count_all') })
def list_view(self, request, *args, **kwargs): ''' 列表界面 :param request: :return: ''' # 处理批量操作功能 action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list} # 生成批量操作字典,方便前端调用 if request.method == 'POST': action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: # 后续用户批量操作完后可以定义要跳转的地址 return action_response # 构造模糊查询的条件 search_list = self.search_list search_value = request.GET.get('q', '') # 如果用户提交了搜索信息就有,没有提交搜索信息,搜索信息就为空 conn = Q() conn.connector = 'OR' # 规定查询的条件,多个条件是或的关系 for item in search_list: conn.children.append((item, search_value)) # 查询条件要是元组 # 排序规则 order_list = self.get_order_list() search_group_condition = self.get_search_group_condition(request) prev_queryset = self.get_queryset(request, *args, **kwargs) queryset = prev_queryset.filter(conn).filter( **search_group_condition).order_by(*order_list) # 处理分页 all_count = queryset.count() query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] # 处理表头 header_list = [] list_display = self.get_list_display(request, *args, **kwargs) if list_display: # 如果定义了list_display表头就显示list_display里面定义的值对应的名称 for key in list_display: if isinstance(key, FunctionType): verbose_name = key(self, obj=None, is_header=True, *args, **kwargs) else: verbose_name = self.model_class._meta.get_field( key).verbose_name header_list.append(verbose_name) else: # 如果没定义list_display表头就显示表名称 header_list.append(self.model_class._meta.model_name) # 获取表格内容 # data_list = self.model_class.objects.all() body_list = [] for row in data_list: temp_list = [] if list_display: # 如果定义了list_display表格内容就显示定义的内容 for key in list_display: if isinstance(key, FunctionType): temp_list.append( key(self, row, is_header=False, *args, **kwargs)) else: temp_list.append(getattr(row, key)) else: # 如果没定义list_display表格内容就显示对象名称 temp_list.append(row) body_list.append(temp_list) # 组合搜索 search_group = self.get_search_group_list() # 实例化的SearchOption类的对象 search_group_list = [] for option_obj in search_group: # 根据用户配置的筛选条件到数据库中获取对应条件的关联的字段对象 row = option_obj.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_list.append(row) return render( request, self.list_template or 'stark/list.html', { 'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': self.get_add_btn(request, *args, **kwargs), 'search_value': search_value, 'search_list': search_list, 'action_dict': action_dict, 'search_group_list': search_group_list, })
def show_view(self, request, *args, **kwargs): """ 显示页面 需要自定制获取页面显示的列标题及内容信息 根据分页组件实现分页功能 实现根据字段排序 实现页面过滤条件 (OR: ) (OR: ('name__contains', 'alex'), ('email__contains', 'alex')) 实现批量操作显示数据,有数据展示,无数据则隐藏 :param request: :return: """ # 1 获取批量操作需要显示的信息数据并以生成字典形式的数据 {"multi_del":"批量删除","multi_edit":"批量编辑"} multi_list = self.get_multi_list() multi_dict = {func.__name__: func.text for func in multi_list} # 1.1 根据批量操作的数据来对所有数据进行操作--post请求request.POST if request.method == 'POST': multi_action = request.POST.get('multi_data') if hasattr(self, multi_action): response_action = getattr(self, multi_action)(request, *args, **kwargs) if response_action: return response_action # 如果当前反射函数存在返回值,则不继续走下方逻辑 # 2、获取到所有的查询条件数据,可能存在多条件过滤,需要引入Q对象,需要或关系查询条件 filter_list = self.get_filter_list() search_value = request.GET.get("search", '') conn = Q(_connector="OR") # 实例化Q对象 if search_value: for item in filter_list: # conn.children.append(('name__contains', 'wu')) conn.children.append((item, search_value)) # 数据为元组形式 # 3、实现排序功能 order_list = self.get_order_list() # 4、排序查询所有数据集合 # 组合搜索的条件字典信息,并将信息过滤得到结果 search_dict = self.get_search_group_condition(request) print(search_dict) query_set = self.model_class.objects.filter(conn).filter( **search_dict).order_by(*order_list) # 5、通过分页组件实现分页功能 all_count = query_set.count() path_info = request.path_info # '/stark/app01/depart/list/' query_params = request.GET.copy( ) # This QueryDict instance is immutable query_params._mutable = True # 令数据可修改 pager = Pagination(current_page=request.GET.get("page"), all_count=all_count, base_url=path_info, query_params=query_params, per_page=self.per_page) data_lists = query_set[pager.start:pager.end] # 6 自定义显示数据信息 # 6.1 通过定制的方法,获取不同的显示列信息 display_list = self.get_display_list() # 6.2 获取列信息-中文名称 header_list = [] if display_list: for key_or_func in display_list: # 如果元素为函数,则为自定制的表头 if isinstance(key_or_func, FunctionType): header_list.append(key_or_func(self, is_header=True)) else: header_list.append( self.model_class._meta.get_field( key_or_func).verbose_name) # 获取字段对象的中文名称 else: header_list.append( self.model_class._meta.model_name) # 将当前模型类的名称添加进 # 6.3 根据列获取具体信息 ''' 需要生成类似的数据格式,并将其传递至前端页面进行渲染 [ [张三, 16, [email protected]], [李四, 16, [email protected]], ] 或 [ [obj], [obj], ] ''' info_list = [] # 整体数据信息 for obj in data_lists: # obj-->当前的数据对象 temp_row = [] # 一个对象的数据列表 if display_list: for key_or_func in display_list: if isinstance(key_or_func, FunctionType): temp_row.append(key_or_func(self, obj=obj)) elif hasattr(obj, key_or_func): temp_row.append(getattr(obj, key_or_func)) else: temp_row.append(obj) # 默认添加对象,只显示其名称 info_list.append(temp_row) # 7 自定义显示添加按钮标签 add_btn = self.get_add_btn() # 8 自定制显示组合搜索的信息 search_group = self.get_search_group( ) # ['gender_obj', 'classes_obj', 'depart_obj'] # SearchGroupRow对象存储在列表中,每个对象都是可迭代对象 search_group_row_list = [] # 将需要显示的组合搜索对象统一放置在列表中,传递至后台进行数据显示 for option_object in search_group: tuple_or_obj = option_object.get_queryset_or_tuple( self.model_class, request, *args, **kwargs) search_group_row_list.append(tuple_or_obj) return render( request, "stark/show_list.html", { "header_list": header_list, "info_list": info_list, "pager": pager, "add_btn": add_btn, "filter_list": filter_list, "search_value": search_value, "multi_dict": multi_dict, "search_group_row_list": search_group_row_list })
def changelist(self, request, *args, **kwargs): ''' 列表页面 :param request: :return: ''' ############添加搜索条件########## search_list = self.get_search_list() search_value = request.GET.get('q', '') # Q,用于构造负责的ORM查询条件 conn = Q() conn.connector = 'OR' if search_value: for item in search_list: conn.children.append((item, search_value)) #####获取排序####### order_list = self.get_order_list() ####获取组合搜索 search_group_condition = self.get_search_group_condition(request) prev_queryset = self.get_queryset(request, *args, **kwargs) queryset = prev_queryset.filter(conn).filter(**search_group_condition).order_by(*order_list) ''' 根据URL来切片 ?page=3 可能就是30-39这样的 根据page 来决定索引位置 生成HTML页码 ''' #######处理分页 all_count = queryset.count() query_params = request.GET.copy() query_params._mutable = True pager = Pagination( current_page=request.GET.get('page'), all_count=all_count, base_url=request.path_info, query_params=query_params, per_page=self.per_page_count, ) data_list = queryset[pager.start:pager.end] #######处理表格 list_display = self.get_list_display(request) header_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): verbose_name = key_or_func(self, request, 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) body_list = [] for row in data_list: tr_list = [] if list_display: for key_or_func in list_display: if isinstance(key_or_func, FunctionType): tr_list.append(key_or_func(self, request, row, False, *args, **kwargs)) else: tr_list.append(getattr(row, key_or_func)) else: tr_list.append(row) body_list.append(tr_list) #############添加按钮####### add_btn = self.get_add_btn(request, *args, **kwargs) #############处理Action##### action_list = self.get_action_list() action_dict = {func.__name__: func.text for func in action_list} if request.method == 'POST': action_func_name = request.POST.get('action') if action_func_name and action_func_name in action_dict: action_response = getattr(self, action_func_name)(request, *args, **kwargs) if action_response: return action_response ###############处理组合搜索######## search_group_row_list = [] search_group = self.get_search_group() for option_object in search_group: row = option_object.get_queryset_or_tuple(self.model_class, request, *args, **kwargs) search_group_row_list.append(row) return render(request, self.change_list_template or 'stark/changelist.html', {'data_list': data_list, 'header_list': header_list, 'body_list': body_list, 'pager': pager, 'add_btn': add_btn, 'search_list': search_list, 'search_value': search_value, 'action_dict': action_dict, 'search_group_row_list': search_group_row_list})