導航:VS2019開發Django系列css
緊接上篇,繼續介紹Django中的模板,考慮可能篇幅過長,因此分爲兩部分來說,今天的主要內容:html
注意着色部分,{% load staticfiles %} 加載靜態文件,靜態文件按照項目默認配置,在App文件夾裏邊的static文件夾下邊jquery
注意着色部分,{% block content %}{% endblock %},block定義能夠被子模板覆蓋的塊,通俗一點就是用來給子模板佔位用的django
從引用的靜態文件咱們能夠看出來,使用了BootStrap前端框架,這個是VS在新建Django項目的時候默認添加的,那麼就直接用這個前端框架來佈局了layout.cshtml母版頁bootstrap
另外要提一下的是還引入了一個bootstrap-table.min.js,官方介紹:與一些最普遍使用的CSS框架集成的擴展表。(支持Bootstrap,語義UI,Bulma,Material Design,Foundation)數組
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> {% load staticfiles %} <link rel="stylesheet" type="text/css" href="{% static 'app/content/bootstrap.min.css' %}" /> <link rel="stylesheet" type="text/css" href="{% static 'app/content/bootstrap-table.min.css' %}" /> <script src="{% static 'hello/scripts/jquery-1.10.2.min.js' %}"></script> <script src="{% static 'hello/scripts/bootstrap.min.js' %}"></script> <script src="{% static 'hello/scripts/bootstrap-table.min.js' %}"></script> <script src="{% static 'hello/scripts/bootstrap-table-zh-CN.min.js' %}"></script> </head> <body> <div id="myModal" class="modal fade" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title"></h4> </div> <div class="modal-body"> <p></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">關閉</button> </div> </div> </div> </div> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a href="/" class="navbar-brand">DjangoLazyOrders</a> </div> <div class="navbar-collapse collapse"></div> </div> </div> <div class="container body-content"> {% block content %}{% endblock %} <hr /> <footer> <p>© {{ year }} - My DjangoLazyOrders Application</p> </footer> </div> {% block scripts %}{% endblock %} </body> </html>
母版頁有了,那麼,在子模板中怎麼繼承這個母版頁呢?新建一個模板LazyOrders.cshtml,複製下面的代碼貼進去,而後當前子模板的內容寫在 block之間便可。注意extends標記聲明瞭須要繼承哪一個母版頁前端框架
{% extends "hello/layout.cshtml" %} {% block content %} ...... {% endblock %}
for:循環數組中的每一個項,使該項在上下文變量中可用。服務器
if:{% if %}標籤計算一個變量,若是該變量爲「true」(即存在,不爲空,也不是一個假布爾值),則輸出塊的內容。categorys爲視圖中調用render()函數傳遞的參數,上一篇中提到過。app
到這一步,若是直接運行,並訪問的話http://localhost:8090/hello/lazy_orders_index/,已經能夠看到一個類別(categorys)的table展現出來了
<div class="panel panel-info"> <div class="panel-heading"> <h3 class="panel-title">類別</h3> </div> <div class="panel-body"> <div class="list-op" id="list_op"> <button type="button" class="btn btn-default btn-sm" id="dgbtn_category_add"> <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增 </button> <button type="button" class="btn btn-default btn-sm" id="dgbtn_category_edit"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>修改 </button> <button type="button" class="btn btn-default btn-sm" data-message="[刪除]未選中任何行" id="dgbtn_category_delete"> <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>刪除 </button> </div> <table class="table table-hover table-bordered" id="dgtable_category"> <thead> <tr> <th></th> <th>ID</th> <th>類別名</th> </tr> </thead> <tbody> {% if categorys %} {% for category in categorys %} <tr> <td><input data-id="{{ category.category_id}}" type="checkbox" /></td> <td>{{category.category_id}}</td> <td>{{category.category_name}}</td> </tr> {% endfor %} {% else %} <tr> <td></td> </tr> {% endif %} </tbody> </table> </div> </div>
運行以後展現的效果以下:
圖中展現的效果,每次單擊某一行,這一行所在checkbox就被選中了,須要單獨寫JS腳原本操做dom,核心代碼以下:每一行都有註釋,就不作解釋了。
$dgtable_category.on('click', 'tr', singleSelect); function singleSelect(e) { let inputChild = $(this).find('input');//獲取該行input元素 let checkBoxs = $(this).parents('.table').find('input');//獲取table中全部的input元素 if (inputChild[0].checked) {//若是該行原本爲選中狀態 則置爲非選中狀態 checkBoxs.prop('checked', false); } else {//若是該行爲非選中狀態 checkBoxs.prop('checked', false);//先將table中全部的checkbox置爲非選中狀態 inputChild.prop('checked', true);//而後將該行置爲選中狀態 } var target = e.target;//若是點擊的是checkbox而不是tr 那麼須要單獨處理 if (target.type == "checkbox") { inputChild.prop('checked', !inputChild[0].checked); } }
對JS操做DOM不熟練的話,寫這些代碼仍是須要花必定的時間的,雖然最終也能整出來,可是效率過低,若是有現成的框架有這些效果,那麼,用起來就輕鬆不少,因此引入了Bootstrap Table這個組件,那麼使用第三方組件的好處是什麼呢?
1.花更短的時間,卻能達到相同的效果,站在偉人的肩膀上更容易成功,不重複造輪子
2.服務器渲染html文本花費更少的時間,返回的html代碼也更少,減小帶寬
2)使用第三方組件Bootstrap Table渲染綁定數據
目前,呈現的效果以下圖:前兩個table中的效果是使用Django 標記渲染html呈現的效果,後兩個table是使用BootStrap Table渲染數據的效果,涉及到Django的數據與JavaScript數據交互。