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 %}
相關文章
相關標籤/搜索