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 %}

 

posted @ 2018-11-14 22:22  amberLIU  阅读(529)  评论(0编辑  收藏  举报