04

添加分页器

需求:

跳转页面如何保留条件

思路:找到要跳转的额地方在修改

 

 

          form    action=http://127.0.0.1:8000/stark/app01/book/?a=1&b=2   method="get"
          
          
          
          GET请求:
               request.GET    {"a":1,"b":2}
               request.POST   {}
               
               
               
          form    action=http://127.0.0.1:8000/stark/app01/book/?a=1&b=2   method="post"
          
                <input type="text" name="user" value="123">               
               
          POST请求:
               request.GET    {"a":1,"b":2}
               request.POST   {"user":"123"}

 

问题:但用户挂的东西与前面冲突

思路:将过滤条件放到一个键里

渲染编辑标签 带有过滤条件并解决过滤条件有可能冲突的问题
    # url保留搜索信息 渲染编辑标签
    def get_link_tag(self,obj,val):
        params = self.request.GET
        import copy
        params = copy.deepcopy(params)  # 深拷贝
        params._mutable=True            # 修改成可修改状态

        # 给条件放到一个键里
        from django.http import QueryDict

        qb=QueryDict(mutable=True)
        qb["list_filter"] = params.urlencode()  # qb:{"list_filter":"a=1&b=2"}---->字典(下面不能直接放)
        # href=?list_filter
        s=mark_safe("<a href='%s?%s'>%s</a>"%(self.get_edit_url(obj),qb.urlencode(),val))
        return s

提交后返回的url也需要保存搜索条件

    # 编辑视图
    def change_view(self,request,id):
        edit_book = self.model.objects.filter(pk=id).first()  # 取到要修改的数据对象
        ModelFormClass = self.model_form_class
        if request.method=="GET":
            form=ModelFormClass(instance=edit_book)     # 需要编辑的内容
            return render(request,"stark/change_view.html",{"form":form})
        else:                                           # 提交数据走的流程
            form=ModelFormClass(data=request.POST,instance=edit_book)
            if form.is_valid():
                form.save()
                params = request.GET.get("list_filter")     # 取后缀http://127.0.0.1:8000/stark/app01/book/1/change/?list_filter=page%3D1%26a%3D2
                print("--------------",params)
                url="%s?%s"%(self.get_list_url(),params)
                return redirect(url)
                # return redirect(self.get_list_url())
            else:
                return render(request,"stark/change_view.html",{"form":form})

 

优化代码:将展示数据部分代码封转到一个类里面

 

 当前的self.config都是之前self

# ShowList服务与show_list_view
class ShowList(object):
    def __init__(self,config,request):
        self.request=request    # 封装成自己的实例变量
        self.config=config

        from stark.utils.page import Pagination  # 导入分页器组件
        base_url = request.path_info  # 去除当url
        params = request.GET  # 取得所有参数{"page":77,"title":"python","nid":1}
        current_page = request.GET.get("page", 1)  # 取不到就放1
        all_count = self.config.model.objects.all().count()  # 计算所有数据
        pagination = Pagination(current_page, all_count, base_url, params, per_page_num=2, pager_count=11)
        self.pagination = pagination    # 封装成自己的实例变量
        data_list = self.config.model.objects.all()[pagination.start:pagination.end]  # 切片,开始值和结束值
        self.date_list=data_list        # 封装成自己的实例变量


    def get_header(self):
        # 生成表表头
        header_list=[]
        for field in self.config.get_list_display():                     # ["id","title","price","edit"]
            if callable(field):
                # header_list.append(field.__name__)
                val = field(self,is_header=True)            # 定义了一个is_header=True变量
                header_list.append(val)
            else:
                if field=="__str__":                        # 默认样式
                    header_list.append(self.config.model._meta.model_name.upper())
                else:
                    field_obj=self.config.model._meta.get_field(field)
                    header_list.append(field_obj.verbose_name)   # verbose_name 显示描述字段
        return header_list

    def get_body(self):
        header_list = []
        for field in self.config.get_list_display():  # ["id","title","price","edit"]
            if callable(field):
                # header_list.append(field.__name__)
                val = field(self, is_header=True)  # 定义了一个is_header=True变量
                header_list.append(val)
            else:
                if field == "__str__":  # 默认样式
                    header_list.append(self.config.model._meta.model_name.upper())
                else:
                    field_obj = self.config.model._meta.get_field(field)
                    header_list.append(field_obj.verbose_name)  # verbose_name 显示描述字段

        # 生成表单部分   # header_list:["ID","标题","价格","操作"]
        # data_list = self.model.objects.all()            # 去数据库取来的所有数据 对象
        print("self.list_display", self.config.list_display)  # 用户定义了self.list_display ['id', 'title', 'price']
        # 用户没有定义self.list_display[]
        # 做成下面我们想要的数据格式
        new_data_list = []  # 渲染页面的数据
        for obj in self.date_list:  # obj:当前每本书的对象
            temp = []
            # 当用户定义了list_display的情况  利用反射求值
            for field in self.config.get_list_display():  # ['id', 'title', 'price',delete,edit] ,
                if callable(field):  # 当遇到delete,edit函数
                    val = field(self.config, obj)  # 执行函数返回的返回值
                else:  # 'id', 'title', 'price'
                    val = getattr(obj, field)  # 利用反射getattr取值  当用户没定义list_display用“__str__”
                    #  选择指定字段添加a标签跳转到edit页面
                    if field in self.config.list_display_links:
                        val = self.config.get_link_tag(obj, val)

                temp.append(val)  # 当走默认的话,也会把__str__传到val
            new_data_list.append(temp)
        print(new_data_list)  # [[1, '《看见》---柴静', Decimal('12.00')], [2, '《围城》---钱钟书', Decimal('12.00')]]

        return new_data_list

 

    # 展示数据
    def show_list_view(self,request):
        # print("self.model",self.model)  # 打印当前表
        self.request=request            # 生成request属性给get_link_tag调用
        # 生成分页栏
        # from stark.utils.page import Pagination   # 导入分页器组件
        # base_url = request.path_info            # 去除当url
        # params=request.GET                          # 取得所有参数{"page":77,"title":"python","nid":1}
        # current_page=request.GET.get("page",1)     # 取不到就放1
        # all_count=self.model.objects.all().count()   # 计算所有数据
        # pagination=Pagination(current_page,all_count,base_url,params,per_page_num=2,pager_count=11)
        #
        # data_list = self.model.objects.all()[pagination.start:pagination.end]       # 切片,开始值和结束值

        # # 生成表表头
        # header_list=[]
        # for field in self.get_list_display():                     # ["id","title","price","edit"]
        #     if callable(field):
        #         # header_list.append(field.__name__)
        #         val = field(self,is_header=True)            # 定义了一个is_header=True变量
        #         header_list.append(val)
        #     else:
        #         if field=="__str__":                        # 默认样式
        #             header_list.append(self.model._meta.model_name.upper())
        #         else:
        #             field_obj=self.model._meta.get_field(field)
        #             header_list.append(field_obj.verbose_name)   # verbose_name 显示描述字段
        #
        # #  生成表单部分   # header_list:["ID","标题","价格","操作"]
        # # data_list = self.model.objects.all()            # 去数据库取来的所有数据 对象
        # print("self.list_display",self.list_display)    # 用户定义了self.list_display ['id', 'title', 'price']
        #                                                 # 用户没有定义self.list_display[]
        # # 做成下面我们想要的数据格式
        # new_data_list=[]  # 渲染页面的数据
        # for obj in data_list:                   #  obj:当前每本书的对象
        #     temp=[]
        #     # 当用户定义了list_display的情况  利用反射求值
        #     for field in self.get_list_display():     # ['id', 'title', 'price',delete,edit] ,
        #         if callable(field):             #  当遇到delete,edit函数
        #             val=field(self,obj)         # 执行函数返回的返回值
        #         else:                           # 'id', 'title', 'price'
        #             val=getattr(obj,field)      # 利用反射getattr取值  当用户没定义list_display用“__str__”
        #             #  选择指定字段添加a标签跳转到edit页面
        #             if field in self.list_display_links:
        #                 val=self.get_link_tag(obj,val)
        #
        #         temp.append(val)                # 当走默认的话,也会把__str__传到val
        #     new_data_list.append(temp)
        # print(new_data_list)                    # [[1, '《看见》---柴静', Decimal('12.00')], [2, '《围城》---钱钟书', Decimal('12.00')]]

    # 添加新的标签:
        # [
        #   [1, '《看见》---柴静', Decimal('12.00'), "<a href='/stark/app01/book/3/change/'>编辑</a>", "<a href='/stark/app01/book/3/delete/'>删除</a>"],
        #  [2, '《围城》---钱钟书', Decimal('12.00'), "<a href='/stark/app01/book/3/change/'>编辑</a>", "<a href='/stark/app01/book/3/delete/'>删除</a>"]
        # ]
    # '''
    #     [
    #             [1,"xxx"],
    #             [2,"xxxxx"],
    #             [3,"xxxxxxx'],
    #       ]
    #     '''

        add_url=self.get_add_url()
        sl = ShowList(self,request)      #  把当前的self和request传给类ShowList
        return render(request,"stark/show_list.html",locals())
原来的展示数据

 

 search模糊查询

知识点:关于Q查询

from .models import *
# Q用来描述且 或的情况
from django.db.models import Q

# 取反,名字为lishi且邮箱不能为123@qq.com
# 当前的name只能为字段名称,才能这样写
UserInfo.objects.filter(Q(name="lishi")&~Q(email="123@qq.com"))



# 当我们需要处理字符串时,如下就可以为字符串,q,默认为且关系
q=Q()
q.connector="or"     # 修改默认的且为或
q.children.append("name","lishi")
q.children.append("email","123@qq.com")
UserInfo.objects.filter(q)

 

    # 获取search的查询条件Q对象
    def get_search_condition(self):
        #  搞模糊查询
        from django.db.models import Q
        search_condition=Q()                # 要搜索的条件--->Q对象
        search_condition.connector="or"     # 将条件改为或
        if self.search_fields:              # 用户配置了搜索字段 ["title",""price}
            key_word = self.request.GET.get("q")
            if key_word:                    # 配置了走这里,没有直接显示查询页面(正常查询)
                for search_field in self.search_fields:
                    search_condition.children.append((search_field+"__contains",key_word))  # append这里需要放元组,添加到搜索条件
        #       __contains 为模糊查询

        return search_condition

 

 

posted @ 2018-03-16 20:34  小杜要加油  阅读(175)  评论(0)    收藏  举报