天我們來看點基礎知識,看看JavaScript中的那些循環遍歷方法:
forEach 方法用于調用數組的每個元素,并將元素傳遞給回調函數。數組中的每個值都會調用回調函數。其語法如下:
array.forEach(function(currentValue, index, arr), thisValue)
該方法的第一個參數為回調函數,是必傳的,它有三個參數:
let arr=[1,2,3,4,5]
arr.forEach((item, index, arr)=> {
console.log(index+":"+item)
})
該方法還可以有第二個參數,用來綁定回調函數內部this變量(前提是回調函數不能是箭頭函數,因為箭頭函數沒有this):
let arr=[1,2,3,4,5]
let arr1=[9,8,7,6,5]
arr.forEach(function(item, index, arr){
console.log(this[index]) // 9 8 7 6 5
}, arr1)
注意:
map() 方法會返回一個新數組,數組中的元素為原始數組元素調用函數處理后的值。該方法按照原始數組元素順序依次處理元素。其語法如下:
array.map(function(currentValue,index,arr), thisValue)
該方法的第一個參數為回調函數,是必傳的,它有三個參數:
let arr=[1, 2, 3];
arr.map(item=> {
return item + 1;
})
// 輸出結果: [2, 3, 4]
該方法的第二個參數用來綁定參數函數內部的this變量,是可選的:
let arr=['a', 'b', 'c'];
[1, 2].map(function (e) {
return this[e];
}, arr)
// 輸出結果: ['b', 'c']
該方法還可以進行鏈式調用:
let arr=[1, 2, 3];
arr.map(item=> item + 1).map(item=> item + 1)
// 輸出結果: [3, 4, 5]
注意:
for...of 語句創建一個循環來迭代可迭代的對象。在 ES6 中引入的 for...of 循環,以替代 for...in 和 forEach() ,并支持新的迭代協議。其語法如下:
for (variable of iterable) {
statement
}
該方法有兩個參數:
該方法可以獲取數組的每一項:
let arr=[
{id:1, value:'hello'},
{id:2, value:'world'},
{id:3, value:'JavaScript'}
]
for (let item of arr) {
console.log(item);
}
// 輸出結果:{id:1, value:'hello'} {id:2, value:'world'} {id:3, value:'JavaScript'}
注意:
filter()方法用于過濾數組,滿足條件的元素會被返回。它的參數是一個回調函數,所有數組元素依次執行該函數,返回結果為true的元素會被返回,如果沒有符合條件的元素,則返回空數組。其語法如下:
array.filter(function(currentValue,index,arr), thisValue)
該方法的第一個參數為回調函數,是必傳的,它有三個參數:
const arr=[1, 2, 3, 4, 5]
arr.filter(item=> item > 2)
// 輸出結果:[3, 4, 5]
同樣,它也有第二個參數,用來綁定參數函數內部的this變量。
可以使用filter()方法來移除數組中的undefined、null、NAN等值:
let arr=[1, undefined, 2, null, 3, false, '', 4, 0]
arr.filter(Boolean)
// 輸出結果:[1, 2, 3, 4]
注意:
some() 方法會對數組中的每一項進行遍歷,只要有一個元素符合條件,就返回true,且剩余的元素不會再進行檢測,否則就返回false。
every() 方法會對數組中的每一項進行遍歷,只有所有元素都符合條件時,才返回true,如果數組中檢測到有一個元素不滿足,則整個表達式返回 false ,且剩余的元素不會再進行檢測。其語法如下:
兩者的語法如下:
array.some(function(currentValue,index,arr),thisValue)
array.every(function(currentValue,index,arr), thisValue)
兩個方法的第一個參數為回調函數,是必傳的,它有三個參數:
let arr=[1, 2, 3, 4, 5]
arr.some(item=> item > 4)
// 輸出結果:true
let arr=[1, 2, 3, 4, 5]
arr.every(item=> item > 0)
// 輸出結果:true
注意:
reduce() 方法接收一個函數作為累加器,數組中的每個值(從左到右)開始縮減,最終計算為一個值。reduce() 可以作為一個高階函數,用于函數的 compose。其語法如下:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
reduce 方法會為數組中的每一個元素依次執行回調函數,不包括數組中被刪除或從未被賦值的元素,回調函數接受四個參數:
該方法的第二個參數是 initialValue,表示傳遞給函數的初始值 (作為第一次調用 callback 的第一個參數):
let arr=[1, 2, 3, 4]
let sum=arr.reduce((prev, cur, index, arr)=> {
console.log(prev, cur, index);
return prev + cur;
})
console.log(arr, sum);
輸出結果:
大家好,我是小雨!
今天我們要介紹的知識點是 Django 中的 Templates,它也是 MVT 結構中的 T,Templates 可以叫它模板。Templates 究竟用來做什么,通過這一節的介紹,希望大家有一個基本的了解。
在上一節當中,我們在瀏覽器中看到的是 HTTPResponse 返回的字符串,而這一節我們講的 templates 最直接的功能是把前端的 html 頁面顯示出來,這樣用戶就能看到清晰美觀的界面。那么 Django 是如何加載 html 網頁的呢?下面介紹兩種方式:
我們提前準備好一個 html 頁面index.html,然后為了方便 views 中能成功訪問到這個index.html,需要在settings.py中將templates文件夾的路徑聲明清楚。在 TEMPLATES 列表字典的DIRS屬性下添加一下內容:
os.path.join(BASE_DIR, 'templates') # 如果缺少os模塊記得導入
render_to_string 的使用方法: 先使用from django.templates.loader import render_to_string導入模塊,然后給 render_to_string 傳入 html 文件后,最后將其以 HttpResponse 的方式返回出去即可。
from django.http import HttpResponse
from django.templates.loader import render_to_string
def index(request):
html = render_to_string("index.html")
return HttpResponse(html)
這里我們需要從django.shortcut導入 render 模塊,一般情況下 Django 會默認導入這個模塊,views 中如果沒有的話就手動導入一下:
from django.shortcut import render
接著 render 中傳入 html 文件,記得添加 request 參數,然后使用 return 返回 render 即可:
def index(request):
return render(request,'index.html')
最后記得在 urls.py 中將路徑對應的 views.index 添加進來就可以了。
我們要知道 templates 作為 MVT 架構中的 T,不僅僅是加載前端中的頁面,它還包含一種模板語言,能夠在 htmlL 語言中實現邏輯控制(條件選擇、循環),相對于 JavaScript 會更加的靈活。
常用的python模板語言引擎
接下來,我們就以一個簡單的例子來介紹 Django 模板語言的使用。
我們有一個存儲學生信息的Students.csv文件,包含了學號、姓名、性別、手機號碼、出生日期、電子郵箱等信息。
319001,趙一,男,1998/12/27,18706012232,532211428@qq.com,北京市海淀區頤和園路5號,342622199801144314,2019/9/1,計算機,趙一,13655512212
319002,錢二,女,1995/10/25,13459732456,572501101@qq.com,北京市海淀區雙清路30號,342622199709066819,2019/9/1,物聯網,王二,13856909992
這里數據其實有很多條,為了減少篇幅我們就羅列出兩條。
現在需要將這些數據加載到前端的 html 頁面中,通過 tabel 標簽顯示出來。
(1)準備
首先用 pycharm 新建一個 Django 項目,為了方便使用直接把 application 和 templates 文件夾都建好。
pycharm新建Django項目
在 templates 中新建一個 index.html 文件,寫好用于顯示學生信息的標題以及表格框架。
<div id="title">學生信息列表</div>
<div id="table_main">
<table border="1">
<thead>
<tr>
<th>學號</th>
<th>姓名</th>
<th>性別</th>
<th>出生日期</th>
<th>手機號碼</th>
<th>電子郵箱</th>
<th>家庭地址</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
(2)views 設置
為了讀取 csv 文件,寫一個read_form_file方法,將文件中的信息存儲在 Students 列表中。
def read_from_file(path:str):
students = []
try:
with open(path, mode="r", encoding="UTF-8") as fd:
# 讀取當前行
current_line = fd.readline()
# 判斷當前行是否為空
while current_line:
temp_line = current_line.split(",")
students.append(temp_line)
current_line = fd.readline()
return students
except Exception as e:
raise e
接下來,我們定義一個 student 方法,用來顯示 html 內容給前端,這里面我們還是使用 render 將獲取的數據傳遞給前端頁面index.html。
注意使用 context 參數,它的值我們設置為一個字典,鍵設置為 DTL 模板語言中要引用的變量,值設置為本地獲取的數據
def student(request):
students = read_from_file(r"D:\Python\Project\Demo\Student.csv")
return render(request, "index.html", context={"all_student":students})
(3)DTL 模板語言
在index.html中,表格內容的填充,我們通過 DTL 模板語言來完成。在 HTML 代碼中要插入 DTL 模板語言,需要使用{%語句%},for 語句還要使用{% endfor %}來結尾,在語句內部調用變量列表中的元素也是直接使用變量名.數字并且需要包裹兩層大括號。這里我們以循環輸出 student 列表中的各個元素為例,其 DTL 模板語言的寫法如下:
{% for student in all_student %}
<tr>
<td>{{ student.0 }}</td>
<td>{{ student.1 }}</td>
<td>{{ student.2 }}</td>
<td>{{ student.3 }}</td>
<td>{{ student.4 }}</td>
<td>{{ student.5 }}</td>
<td>{{ student.6 }}</td>
</tr>
{% endfor %}
(4)urls 配置
接下來配置路由,添加 student 路徑
path('student/',app01_views.student),
(5)運行效果
一切準備就緒后,執行python manage.py runserver,在瀏覽器中打開127.0.0.1:8000/student效果如下:
數據被成功加載
不能與服務器做動態交互的文件叫靜態文件; 對于 HTML 中的圖片、視頻、css、js 這些都屬于靜態文件。Django 對于這些文件有一套明確的管理機制。 如果我們只遵循 HTML 的規范去加載靜態文件,在 Django 中是顯示不出來的。
Django無法加載靜態文件
為了解決這個問題,我們首先要確保配置文件 settings.py 中 INSTALLED_APP 下靜態文件模塊有被加載到:
'django.contrib.staticfiles', # 必須確保安裝靜態模塊
然后使用STATICFILES_DIRS這個全局變量來存儲靜態文件的路徑。
STATICFILES_DIRS = [
os.path.join(BASE.DIR, 'static'),
]
然后在 html 中開始加上模板語言,如果讓 html 引用靜態文件,那就需要先導入靜態模塊。在 html 語句第一行寫上
{% load static %}
對于要引用靜態圖片的標簽路徑使用{% static "路徑文件名 "%},如:
<img src="{% static "logo.png"%}">
這樣 Django 就能顯示靜態文件圖片了。
靜態圖片被正確顯示了
一般情況下,static 文件夾我們會放在app目錄下。這時候訪問靜態文件,則需要在STATICFILES_DIRS的 os.path.join 參數中再多添加一個子文件夾名,可以寫成:
STATICFILES_DIRS = [
os.path.join(BASE.DIR, 'app01','static'),
]
在 Django 配置的文件 settings.py 中有一個全局變量STATIC_URL,它定義了一個給外界用戶直接訪問靜態文件的路徑。 上面我們添加在標題中的 logo.png,我們可以在瀏覽器中直接通過127.0.0.1:8000/student/static/logo.png來訪問。
直接訪問靜態文件
為了更好地鞏固 Django 加載靜態文件的知識,我們做一個小案例。學生信息管理系統的登錄頁面。有顯示圖片 logo,有用戶名和密碼的輸入框,并且有提交按鈕。當點擊按鈕時,會彈出提示表示登錄成功。
這里簡單說明一下:
界面采用了 Bootstrap 框架,登錄按鈕的功能函數用了 jQuery 腳本。關于前端的知識我們這里就不做過多介紹了。
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<!--加載外部的CSS文件-->
<link type="text/css" rel="stylesheet" href="{% static "css/bootstrap.min.css" %}">
<link type="text/css" rel="stylesheet" href="{% static "css/basic.css" %}">
<!--加載外部的js文件-->
<script src="{% static "js/jquery.min.js" %}"></script>
<script src="{% static "js/login.js" %}"></script>
</head>
<body>
<div class="container">
<div id = "login">
<form class="form">
<h2><img src="{% static "imags/mainlogo.png" %}"></h2>
<h2>學生信息管理系統登錄</h2>
<hr>
<hr>
<div class="form-group">
<label for="user">用戶名:</label>
<input type="text" class="form-control" placeholder="請輸入用戶名" id="user">
</div>
<div class="form-group">
<label for="password">密碼</label>
<input type="password" class="form-control" placeholder="請輸入密碼" id="password">
</div>
<div class="form-group">
<div class="checkbox">
<label>
<input type="checkbox">請記住我
</label>
</div>
</div>
<button id="submit01" class="form-control">提交</button>
</form>
</div>
</div>
</body>
</html>
將以上 html 文件保存在 templates 中,在 views 中配置好方法,urls 中配置好路由,最后在 settings 中配置好靜態文件路徑,最后啟動 Django 服務器,頁面顯示效果如下:
登錄頁面案例演示
本節,我們介紹了 Django 中 templates 的知識,Django 加載 HTML 方法、模板的語言的使用,以及加載靜態文件的方法。希望大家多多練習,才能鞏固所學的知識。下一節我們將繼續介紹 Django 中 URL 跳轉的知識!
感謝大家的閱讀!
發送郵件的過程中我們經常會將表格放在郵件的正文中,那么怎么用UiPath來實現這個功能呢?表格與文字的格式不同,用文字的格式自然無法識別表格,UiPath給出的解決方案是:將郵件正文的內容html(超文本標記語言)化,html顯然比一般的文本要高級,具體的實現步驟如下:
1.新建一個序列流程并取名,在“活動”欄搜索“excel”;
2.選擇“Excel應用程序范圍”;
3.拖入到序列中輸入需要發送的excel文件路徑及名稱,置于英文引號下,或者通過文件夾找到相應的文件選擇即可。如果該文件打開或編輯時需要密碼通過,則在“屬性”>“文件”選項內填入并置于英文引號內即可;
4.選擇“Excel應用程序范圍”中的“讀取范圍”并拖入到序列中;
5.確認需要讀取的excel頁面及范圍;
6.在“屬性”欄輸出數據表中,右鍵新建變量,并取名DT;
7.在“屬性”欄選項中選中“添加標頭”;
8~13.在“活動”欄搜索“創建文件”,拖入到序列,確認存儲的路徑,在“屬性”欄名稱行,右鍵新建變量,并取名bodypath;點擊“變量”,填入默認值“body.txt”;
14~17.在“活動”欄搜索“序列”,拖入到流程中,再搜索“附加行”,拖入到序列中,文本行編輯:"<html><body><table border=1>",在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇);
18~20.在“活動”欄搜索“序列”,拖入到流程中,再搜索“附加行”,拖入到序列中,在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇),文本輸入"<tr>";
21~24.在“活動”欄搜索“遍歷循環”,拖入到流程中,分別輸入col/DT.Columns(“屬性”雜項中TypeArgument選擇:System.Data.DataColumn);然后在“活動”欄搜索“附加行”,拖入到正文中,文本欄編輯:String.Format("<th>{0}</th>",col.ColumnName);在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇);
25~28.在“活動”欄搜索“附加行”,拖入到流程中在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇),文本輸入"</tr>";
29~34.在“活動”欄搜索“序列”,拖入到流程中,再搜索“每一行”,拖入到序列中,分別輸入:CurrentRow/DT(先前數據輸出變量,輸入D,從下拉菜單選擇DT);再搜索“附加行”,拖入到正文中,在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇),文本輸入"</tr>";
35~39.在“活動”欄搜索“遍歷循環”,拖入到流程中,分別輸入col/DT.Columns(“屬性”雜項中TypeArgument選擇:System.Data.DataColumn);然后在“活動”欄搜索“附加行”,拖入到正文中,文本欄編輯:String.Format("<td>{0}</td>",CurrentRow(col.ColumnName).ToString);在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇);
40~43.在“活動”欄搜索“附加行”,拖入到流程中在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇),文本輸入"</tr>";
44~47.在“活動”欄搜索“附加行”,拖入到流程中在屬性欄編輯:選擇False,文件名行bodypath(輸入body在下拉菜單選擇),文本輸入"</table></body></html>";
48~51.在“活動”欄搜索“讀取”,選擇“讀取文本文件”,拖入到流程中在屬性欄編輯:文件名行bodypath(輸入body在下拉菜單選擇),輸出位置欄右鍵新建變量取名body;
52~56.在“活動”欄搜索“outlook”,選擇“發送Outlook郵件消息”,拖入到流程中;目標輸入接收人郵箱,放置在英文引號間;標題輸入郵件標題,放置在英文引號間;正文編輯:"Hi,All,<br/>"+body+"<br/>BR<br/>姓名";再在屬性欄勾選“正文是Html”即可。
備注:Html正文中"<br/>"代表換行,需要其他信息直接在正文編輯即可。
調試運行后,即可以將表格在郵件正文中展示了,試試吧。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。