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