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