一、分页代码如下
from django.utils.safestring import mark_safeclass Page: def __init__(self, current_page, data_count, per_page_count=10, pager_num=7): self.current_page = current_page self.data_count = data_count self.per_page_count = per_page_count self.pager_num = pager_num @property def start(self): return (self.current_page - 1) * self.per_page_count @property def end(self): return self.current_page * self.per_page_count @property def total_count(self): v, y = divmod(self.data_count, self.per_page_count) if y: v += 1 return v def page_str(self, base_url): page_list = [] if self.total_count < self.pager_num: start_index = 1 end_index = self.total_count + 1 else: if self.current_page <= (self.pager_num + 1) / 2: start_index = 1 end_index = self.pager_num + 1 else: start_index = self.current_page - (self.pager_num - 1) / 2 end_index = self.current_page + (self.pager_num + 1) / 2 if (self.current_page + (self.pager_num - 1) / 2) > self.total_count: end_index = self.total_count + 1 start_index = self.total_count - self.pager_num + 1 if self.current_page == 1: prev = '上一页' else: prev = '上一页' % (base_url, self.current_page - 1,) page_list.append(prev) for i in range(int(start_index), int(end_index)): if i == self.current_page: temp = '%s' % (base_url, i, i) else: temp = '%s' % (base_url, i, i) page_list.append(temp) if self.current_page == self.total_count: nex = '下一页' else: nex = '下一页' % (base_url, self.current_page + 1,) page_list.append(nex) jump = """ GO """ % (base_url,) page_list.append(jump) page_str = mark_safe("".join(page_list)) return page_str
- {% for item in li %} {% include 'li.html' %} {% endfor %}
{ { page_str }}
/* li.html */
views.py文件
from utils import paginationLIST = []for i in range(500): LIST.append(i)def user_list(request): current_page = request.GET.get('p', 1) current_page = int(current_page) val = request.COOKIES.get('per_page_count',10) val = int(val) page_obj = pagination.Page(current_page,len(LIST),val) data = LIST[page_obj.start:page_obj.end] page_str = page_obj.page_str("/user_list/") return render(request, 'user_list.html', { 'li': data,'page_str': page_str})
二、cookie使用
Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息;cookie的内容主要包括:名字,值,过期时间,路径和域。
1、获取Cookie:
1 2 3 4 5 6 | request.COOKIES[ 'key' ] request.get_signed_cookie(key, default = RAISE_ERROR, salt = '', max_age = None ) 参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间 |
2、设置Cookie:
1 2 3 4 5 6 7 8 9 10 11 12 13 | rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt = '加密盐' ,...) 参数: key, 键 value = '', 值 max_age = None , 超时时间 expires = None , 超时时间(IE requires expires, so set it if hasn't been already.) path = '/' , Cookie生效的路径, / 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问 domain = None , Cookie生效的域名 secure = False , https传输 httponly = False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) |
由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
1 2 | <script src = '/static/js/jquery.cookie.js' >< / script> $.cookie( "list_pager_num" , 30 ,{ path: '/' }); |
实例:
def auth(func): ''' 装饰登录判断是否存在cookie ''' def inner(request, *args, **kwargs): try: #获取加盐cookie v = request.get_signed_cookie('NID', salt='dwadwadwa') if not v: return redirect('/login/') except Exception as e: return redirect('/login/') return func(request, *args, **kwargs) return innerfrom django.utils.decorators import method_decoratorfrom django import viewsclass Order1(views.View): """ 方法一 CBV --> class Base view """ @method_decorator(auth) def get(self,request): redirect_to = settings.LOGIN_REDIRECT_URL res = redirect(redirect_to) res.set_signed_cookie('NID', 'user', salt="dwadwadwa") return res @method_decorator(auth) def post(self,request): redirect_to = settings.LOGIN_REDIRECT_URL res = redirect(redirect_to) res.set_signed_cookie('NID', 'user', salt="dwadwadwa") return resclass Order2(views.View): """ 方法二 CBV --> class Base view """ @method_decorator(auth) def dispatch(self, request, *args, **kwargs): return super(Order2,self).dispatch(request,*args,**kwargs) def get(self,request): redirect_to = settings.LOGIN_REDIRECT_URL res = redirect(redirect_to) res.set_signed_cookie('NID', 'user', salt="dwadwadwa") return res def post(self,request): redirect_to = settings.LOGIN_REDIRECT_URL res = redirect(redirect_to) res.set_signed_cookie('NID', 'user', salt="dwadwadwa") return res@method_decorator(auth,name='dispatch')class Order3(views.View): """ 推荐使用:方法三 CBV --> class Base view """ def get(self,request): redirect_to = settings.LOGIN_REDIRECT_URL res = redirect(redirect_to) res.set_signed_cookie('NID', 'user', salt="dwadwadwa") return res def post(self,request): redirect_to = settings.LOGIN_REDIRECT_URL res = redirect(redirect_to) res.set_signed_cookie('NID', 'user', salt="dwadwadwa") return resdef login(request): """ FBV --> func Base view """ redirect_to = settings.LOGIN_REDIRECT_URL if request.method == "GET": return render(request, 'login.html') if request.method == "POST": user = request.POST.get('username') passwd = request.POST.get('password') obj = models.Usertype.objects.filter(username=user,password=passwd).first() if obj: res = redirect(redirect_to) """ 登录成功设置cookie """ res.set_signed_cookie('NID', user, salt="dwadwadwa") return res else: return render(request, 'login.html', { 'password_is_wrong': True})
三、模块继承
模板中也有自己的语言,该语言可以实现数据展示
-
- { { item }}
- {% for item in item_list %} <a>{ { item }}</a> {% endfor %} forloop.counter forloop.first forloop.last
- {% if ordered_warranty %} {% else %} {% endif %}
- 母板:{% block title %}{% endblock %}子板:{% extends "base.html" %} {% block title %}{% endblock %}
实例:
master.html
{% extends 'master.html' %}{% block title %}用户管理{% endblock %}{% block content %}用户管理
- {% for i in u %}
- { { i }} {% endfor %}