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

    转载于:https://www.cnblogs.com/amber-liu/p/9960801.html

  • 相关阅读:
    VS编译错误:#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version
    C++ STL std::copy 详解
    JavaScript:{}、new Object和Object.create的区别
    函数声明和函数表达式的区别
    Java基础重写override
    Java基础多态数组
    Java基础编译类型和运行类型(多态)
    Java基础继承的内存分析
    Java基础访问修饰符
    Java基础继承的使用
  • 原文地址:https://www.cnblogs.com/twodog/p/12135619.html
Copyright © 2020-2023  润新知