render的几个应用

1.render能够经过模版语法来渲染字符串,例如变量,标签,for循环,这里就不赘述,我就举个本身印象很深入灵活应用,看看render到底作了什么,关心什么css

    注意! 在rander眼里,没有html和js,只有普通的字符串.当碰到特定的语法,例如load,extends,include,{{  }}, { % %}他就会去执行对应的操做,把他们翻译成浏览器能识别的字符串html

views视图jquery

def index(request): if request.is_ajax(): return HttpResponse('ok') else: fruit='sweet'
        return render(request,'index.html',{'fruit':fruit})

html模版ajax

<!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文件django

$(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 标签session

view的login视图app

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

中间键校验权限dom

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 %}
相关文章
相关标签/搜索