django 模板扩展
在些之前 用django的模板是使用母板和子板 的方式使用,子板继承母板用 {% extends '母板.html' %} 子板再将自己的需要使用母板的部分 使用{% block name %} 与{% endblock %} 一起使用。现在还有另一种方式,现在不是使用框架,而是例如有一个取数据库的数据语句在多个模板中使用或者这个小组件在多个页面中使用,这个时候就需要用自定义自己的模板了。
操作步骤:
一、在创建完项目、app 后,在app的目录下创建一个叫 . templatetags目录,命名组件名字的.py文件,这里取名叫zdy.py
代码:
from django import template register=template.Library() #必须叫register @register.filter def my_upper(value,arg1): # filter 只能传入两个参数 ,多了的参数 只能自己用 splite 自己做处理 return value+arg1 @register.simple_tag #可以传入多个参数 def my_lower(value,args1,args2,args3): return value+args1+args2+args3 @register.filter def my_bool(value): return False
二、templates 下的 test.html 文件加载自定制模板
{% load zdy %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>打印字典所有的key</title> </head> <body> <h1>打印</h1> {% for k,v in userinfo.items %} <!--可以将值在页面取出 .items--> <a>{{ item }}</a> <!--还可以用函数 如upper转换成大写 母板中叫 simple_filter,还可以自定义 simple_tag --> <a>{{ k|upper }}</a> <a>{{ v }}</a> <h3> <!--使用自己定义的函数 --> <a>使用自己定义的函数 </a> {{ v | my_upper:"32" }} <!--有两个参数第二个参数 不能加空格,一加空格就会报错,--> <!--可以在if条件后加上,而simple_tag 则不能加在if 条件后--> {% if k|my_bool %} <h5>真</h5> {% else %} <h5>假</h5> {% endif %} <h5>tag</h5> </h3> <h3> 执行simple_tag 函数 {% my_lower "ABC" "WWW" "PPPPP" "VVV" %} <!--参数传值与 simple_filter 不一样,并且参数无限制,函数名+参数 --> </h3> {% endfor %} {% include 'pub.html' %} </body> </html>
三、{% include 'pub.html' %} pub.html 是一个经常被调用的组件 所以用include
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> {% for row,row1 in userinfo.items %} <div class="title">标题:{{ row1 }} </div> <div class="content">内容:{{ row1 }} </div> {% endfor %} </div> </body> </html>
四、views.py

from django.shortcuts import render,HttpResponse,redirect from practice1 import models # Create your views here. def test(request): # v=models.UserInfo.objects.create(username='root',mail='423142@qq.com') return render(request,'test.html',{ 'userinfo':{'k1':'v1','k2':'v2','name':'tony'}}) # response=HttpResponse('comntent') # response.set_cookie('k1','v2') # response.set_cookie('k2','v3') # response.set_cookie('k3','v4') # return HttpResponse('abc') def login(request): if request.method=='GET': return render(request,'login.html') else: #1、生成随机字符串 #2、通过cookie 发送给客户端 #3、服务端 保存{随机字符 串1:{‘XXXXX’:df}} request.session['username']='tony' # 对于随机字符串现在变成{'username':tony,'email':'xxxx'....} request.session['email']='tony@qq.com' u=request.POST.get('user') p=request.POST.get('pwd') if u=='tony' and p=='123': return redirect('/index/') else: return render(request,'login.html',{'msg':'hel'}) def index(request): # 1、获取客户端 COOKIE中的随机字符串 # 2、去SEESION 中查找有没有随机字符串 # 3、去SESSION中查看对应的KEY 中查看是否有 username v=request.session.get('username') request.session['k1']=123 if v: print(v) return HttpResponse('login success:%s'%v) else: return redirect('/login/')
∆∆如果修改了自定制模板.py的名字,需要再次 python manage.py migrate ,重新迁移一次