render的几个应用
1.render可以通过模版语法来渲染字符串,例如变量,标签,for循环,这里就不赘述,我就举个自己印象很深刻灵活应用,看看render到底做了什么,关心什么
注意! 在rander眼里,没有html和js,只有普通的字符串.当碰到特定的语法,例如load,extends,include,{{ }}, { % %}他就会去执行对应的操作,把他们翻译成浏览器能识别的字符串
views视图
def index(request): if request.is_ajax(): return HttpResponse('ok') else: fruit='sweet' return render(request,'index.html',{'fruit':fruit})
html模版
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> </head> <body> <div> 首页 {{ fruit }} </div> <button id="btn">发送ajax</button> <span fruit="{{ fruit }}"></span> </body> {#方式一#} <script> $(function () { $('btn').click(function () { $.ajax({ url:'', type:'get', #重点一 data: '{{ fruit }}', #render渲染到这的时候,可以把{{fruit}}渲染成sweet,
但是此时,如果不加 '' ,把{{}}括起来,在浏览器翻译js的过程中,他会把sweet当成变量,就会报错,因为sweet未被定义
success:function (res) { console.log(res) } }) }) }) </script> {#方式二#} <script src="index.js"></script> #重点二 render不认得什么引入不引入,至把她当成字符串,这个时候js文件中的{{ fruit }}根本不会被渲染,只是原样输出'{{ fruit }}'
js文件
$(function () { $('btn').click(function () { $.ajax({ url:'', type:'get', data: '{{ fruit }}', #改进方法
data : $('span').attr('fruit') 灵活获取变量,因为render碰到span标签会渲染,此时可以利用dom操作,获得变量
success:function (res) { console.log(res) } }) }) });
2.利用render遇到自定义过滤器执行特定的方法,来达到优化代码,提炼相同的函数功能的目的
目的,动态菜单且当前路径的菜单加个 active 标签
view的login视图
def login_promission(request): # 查看当前登录人对应的 url 权限,存在session表里,统一提取出来,然后在中间键统一交验 ******** promissions = Role.objects.filter(userinfos=request.user).values('promissions__url', 'promissions__title', 'promissions__is_menu').distinct() promission_list = [] promission_menu_list = [] for i in promissions: promission_list.append(i['promissions__url']) if i['promissions__is_menu']: promission_menu_list.append({ 'url': i['promissions__url'], 'title': i['promissions__title'] }) # 将当前登录人的url注入到session表里 request.session['promission_list'] = promission_list # 将菜单权限注入的session
中间键校验权限
class PermissionMiddleWare(MiddlewareMixin): def process_request(self,request): # 1.白名单 path=request.path print(path) white_list=['/login/','/admin/*','/reg/','/get_valid_img/','/index/'] for i in white_list: ret=re.search(i,path) if ret: return None # 2 校验身份 if not request.user.id: return redirect('/login/') # 3.校验权限 permission_list=request.session.get('promission_list') print(permission_list) for i in permission_list: new_promission='^%s$' % i res=re.search(new_promission,path) if res: return None return HttpResponse('无权限')
templatetags下的自定义过滤器
import re from django.template import Library register=Library() @register.inclusion_tag('menu.html') def menu_list_style(request): promission_menu_list = request.session.get('promission_menu_list') #避免了视图函数重复写相似功能的函数,都留给render,碰到load再统一加载 for i in promission_menu_list: tmp='^{}$'.format(i['url']) if re.search(tmp, request.path): i['class'] = 'active' return {'promission_menu_list': promission_menu_list}
过滤器渲染的menu网页
{% for menu in promission_menu_list %} <li class="{{ menu.class }}"> <a href="{{ menu.url }}"><span>{{ menu.title }}</span></a> </li> {% endfor %}
base母版
{% load active %}
{% menu_list_style request %}