zoukankan      html  css  js  c++  java
  • crm 数据展示 和分页思想(一)

    1. 数据的展示
    数据通过ORM查询出来 对象列表 QuerySet

    1. 普通的字段
    对象.字段名 ——》 数据库中的值

    <td>{{ customer.phone }}</td>

    2. choices
    ((1,'男'))
    对象.字段名 ——》 数据库中的值 1
    对象.get_字段名_display() ——》 数据库中的值对应的显示值 男

     <td>{{ customer.get_source_display }}</td>

    3. 外键
    对象.外键 ——》 关联的对象 定义 __str__ __repr__
    对象.外键.字段名


    4. 自定义方法
    多对多:

    #显示自定义已报班级
    在models.py中
       def show_class(self):
            return ' | '.join([str(i) for i in self.class_list.all()])
    <td>{{ customer.show_class }}</td>

    自定义显示HTML代码:

    from django.utils.safestring import mark_safe
    
    def show_status(self):
    
    status_color = {
    
    'signed': 'green',
    'unregistered': '#208c72',
    'studying': 'yellow',
    'paid_in_full': 'blue',
    }
    
    return mark_safe('<span style="background-color: {};color: white;padding: 2px">{}</span>'.format(
    status_color.get(self.status), self.get_status_display()))

    前端应用

    <td>{{ customer.show_status }}</td>

    2. 分页

    总的是思想 就是 拿到总页面数除分页数 得到做大页面数,对最大页面数 进行判断规定显示几个页面

    具体算法 如最大页面数是11 除余2 得到5  如我当前页数是7 就用7-5得到开头 7+5等于结尾

                                                                                                       2                    12    =10    因为开头2也算就11

    users = [{'name': 'alex{}'.format(i), 'pwd': '123'} for i in range(1, 302)]
    
    
    def fycustomer_list(request):
        # Customer_all=models.Customer.objects.all()
        '''
        第一页 0 20
        第2页 20 40
        n (n-1)*20 开始  20*n结尾
            >>> divmod(9,2)
            (4, 1)
            >>> divmod(9,2)[0]
            4
            >>> divmod(9,2)[1]
            1
        '''
        try:
            page_num = int(request.GET.get('page', '1'))
            if page_num <= 0:
                page_num = 1
        except Exception as e:  # 输入字符串也等于一
            page_num = 1
        per_num = 10
        # 总数量
        all_count = len(users)
        # 总页码数   除分页数
        page_count, more = divmod(all_count, per_num)
        if more:  # 如果有余数就+1页
            page_count += 1
        # 最大页码数 获取的页面除二减去 用于开头
        max_show = 11
        half_show = max_show // 2
        # #7-5
        # page_start=page_num-half_show
        # page_end=page_num+half_show #7+5
        # 总页码数 < 最大显示页码数
        if page_count < max_show:
            page_start = 1
            page_end = page_count
        else:
            # 处理左边极值
            # 当前页小于等于一半
            if page_num <= half_show:
                page_start = 1
                page_end = max_show
                # 当前的数 +页码的一半 大于页码数
            elif page_num + half_show >= page_count:
                page_start = page_count - max_show + 1
                page_end = page_count
            else:
                page_start = page_num - half_show  # 7-5 11的一半
                page_end = page_num + half_show  # 7 + 5  12
    
        page_list = []
        if page_num == 1:  # 第一页选的页码page_num
            page_list.append('<li class="disabled"><a>上一页</a></li>')
        else:
            page_list.append('<li><a href="?page={}">上一页</a></li>'.format(page_num - 1, ))  # 点击上一页-1
        # print('aaaaa', page_start)
    
        for i in range(page_start, page_end + 1):
            if i == page_num:
                page_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))  # 等于就激活当前页面 其他继续显示
            else:
                page_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))
    
        if page_num == page_count:
            page_list.append('<li class="disabled"><a>下一页</a></li>')
        else:
            page_list.append('<li><a href="?page={}">下一页</a></li>'.format(page_num + 1, ))  # 点击下一页+1
    
        page_html = ''.join(page_list)
    
        return render(request, 'user_list.html', {'users': users[(page_num - 1) * per_num:per_num * page_num],
                                                  'page_html': page_html})

    html

        <table class="table table-hover table-bordered">
            {% for user in users %}
                <tr>
                    <td>{{ user.name }}</td>
                    <td>{{ user.pwd }}</td>
                </tr>
            {% endfor %}
        </table>
    
        <nav aria-label="Page navigation">
            <ul class="pagination">
                        {{ page_html|safe }}
            </ul>
        </nav>

    封装成类

    创建文件 utils  创建python文件pagination.py

    class Pagination:
                            #当前页面数 总页码数    显示页码数    最大分页数
        def __init__(self, page_num, all_count, per_num=10, max_show=11):
            # 获取页码
            try:
                self.page_num = int(page_num)
                if self.page_num <= 0:
                    self.page_num = 1
            except Exception as e:
                self.page_num = 1
    
            # 每页显示的数据量
            self.per_num = per_num
    
            # 总数据量
            all_count = all_count
    
            # 总页码数
            self.page_count, more = divmod(all_count, per_num)
            if more:
                self.page_count += 1
    
            # 最大显示页码数
            self.max_show = max_show
            self.half_show = max_show // 2
    
        @property
        def page_html(self):
            # 总页码数 < 最大显示页码数
            if self.page_count < self.max_show:
                page_start = 1
                page_end = self.page_count
            else:
                # 处理左边极值
                if self.page_num <= self.half_show:
                    page_start = 1
                    page_end = self.max_show
                elif self.page_num + self.half_show >= self.page_count:
                    page_start = self.page_count - self.max_show + 1
                    page_end = self.page_count
                else:
                    page_start = self.page_num - self.half_show  # 2
                    page_end = self.page_num + self.half_show  # 7 + 5  12
    
            page_list = []
            if self.page_num == 1:
                page_list.append('<li class="disabled"><a>上一页</a></li>')
            else:
                page_list.append('<li><a href="?page={}">上一页</a></li>'.format(self.page_num - 1, ))
    
            for i in range(page_start, page_end + 1):
                if i == self.page_num:
                    page_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))
                else:
                    page_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))
    
            if self.page_num == self.page_count:
                page_list.append('<li class="disabled"><a>下一页</a></li>')
            else:
                page_list.append('<li><a href="?page={}">下一页</a></li>'.format(self.page_num + 1, ))
    
            return ''.join(page_list)
    
        @property
        def start(self):
            """
            切片的起始值
            :return:
            """
            return (self.page_num - 1) * self.per_num
    
        @property#封装成属性
        def end(self):
            """
            切片的终止值
            :return:
            """
            return self.page_num * self.per_num

    关于 用户登陆 需要 session 认证  可以写个中间件 进行全局变量

    创建middlewares  添加 auth.py

    from django.utils.deprecation import MiddlewareMixin
    from crm import models
    from django.shortcuts import redirect, reverse
    class AuthMiddleware(MiddlewareMixin):
        def process_request(self, request):
            if request.path_info in [reverse('login'), reverse('reg')]:#白名单
                return
            if request.path_info.startswith('/crm/admin/'):
                return
            pk = request.session.get('pk')
            user = models.UserProfile.objects.filter(pk=pk).first()
            # 没有登录 跳转至登录页面
            if not user:
                return redirect(reverse('login'))
            request.user_obj = user
  • 相关阅读:
    014
    013
    012
    011
    009
    009
    008
    适用于可迭代对象的通用函数
    ubuntu中将py3设置为默认的python
    linux系统下安装gtk
  • 原文地址:https://www.cnblogs.com/zaizai1573/p/10539208.html
Copyright © 2011-2022 走看看