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
原文地址:https://www.cnblogs.com/zaizai1573/p/10539208.html