模板處理
beego 的模板處理引擎採用的是 Go 內建的 html/template 包進行處理,而且 beego 的模板處理邏輯是採用了快取編譯方式,也就是所有的模板會在 beego 應用啟動的時候全部編譯然後快取在 map 裡面。
#模板目錄
beego 中預設的模板目錄是 views,使用者可以把模板檔案放到該目錄下,beego 會自動在該目錄下的所有模板檔案進行解析並快取,開發模式下每次都會重新解析,不做快取。當然,使用者也可以通過如下的方式改變模板的目錄(只能指定一個目錄為模板目錄):
beego.ViewsPath = "myviewpath"
#自動渲染
使用者無需手動的呼叫渲染輸出模板,beego 會自動的在呼叫完相應的 method 方法之後呼叫 Render 函式,當然如果您的應用是不需要模板輸出的,那麼可以在配置檔案或者在 main.go 中設定關閉自動渲染。
配置檔案配置如下:
autorender = false
main.go 檔案中設定如下:
beego.AutoRender = false
#模板標籤
Go 語言的預設模板採用了 {{ 和 }} 作為左右標籤,但是我們有時候在開發中可能介面是採用了 AngularJS 開發,他的模板也是這個標籤,故而引起了衝突。在 beego 中你可以通過配置檔案或者直接設定配置變數修改:
beego.TemplateLeft = "<<<"
beego.TemplateRight = ">>>"
#模板資料
模板中的資料是通過在 Controller 中 this.Data 獲取的,所以如果你想在模板中獲取內容 {{.Content}} ,那麼你需要在 Controller 中如下設定:
this.Data["Content"] = "value"
如何使用各種型別的資料渲染:
##結構體
結構體結構
type A struct{
Name string
Age int
}
控制器資料賦值
this.Data["a"]=&A{Name:"astaxie",Age:25}
模板渲染資料如下:
the username is {{.a.Name}}
the age is {{.a.Age}}
##map
控制器資料賦值
mp["name"]="astaxie"
mp["nickname"] = "haha"
this.Data["m"]=mp
模板渲染資料如下:
the username is {{.m.name}}
the username is {{.m.nickname}}
##slice
控制器資料賦值
ss :=[]string{"a","b","c"}
this.Data["s"]=ss
模板渲染資料如下:
{{range $key, $val := .s}}
{{$key}}
{{$val}}
{{end}}
##模板名稱
beego 採用了 Go 語言內建的模板引擎,所有模板的語法和 Go 的一模一樣,至於如何寫模板檔案,詳細的請參考 模板教程。
使用者通過在 Controller 的對應方法中設定相應的模板名稱,beego 會自動的在 viewpath 目錄下查詢該檔案並渲染,例如下面的設定,beego 會在 admin 下面找 add.tpl 檔案進行渲染:
this.TplName = "admin/add.tpl"
我們看到上面的模板字尾名是 tpl,beego 預設情況下支援 tpl 和 html 字尾名的模板檔案,如果你的字尾名不是這兩種,請進行如下設定:
beego.AddTemplateExt("你檔案的字尾名")
當你設定了自動渲染,然後在你的 Controller 中沒有設定任何的 TplName,那麼 beego 會自動設定你的模板檔案如下:
c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt
也就是你對應的 Controller 名字+請求方法名.模板字尾,也就是如果你的 Controller 名是 AddController,請求方法是 POST,預設的檔案字尾是 tpl,那麼就會預設請求 /viewpath/AddController/post.tpl 檔案。
#Layout 設計
beego 支援 layout 設計,例如你在管理系統中,整個管理介面是固定的,只會變化中間的部分,那麼你可以通過如下的設定:
this.Layout = "admin/layout.html"
this.TplName = "admin/add.tpl"
在 layout.html 中你必須設定如下的變數:
{{.LayoutContent}}
beego 就會首先解析 TplName 指定的檔案,獲取內容賦值給 LayoutContent,然後最後渲染 layout.html 檔案。
目前採用首先把目錄下所有的檔案進行快取,所以使用者還可以通過類似這樣的方式實現 layout:
{{template "header.html" .}}
Logic code
{{template "footer.html" .}}
特別注意後面的.,這是傳遞當前引數到子模板
#LayoutSection
對於一個複雜的 LayoutContent,其中可能包括有javascript指令碼、CSS 引用等,根據慣例,通常 css 會放到 Head 元素中,javascript 指令碼需要放到 body 元素的末尾,而其它內容則根據需要放在合適的位置。在 Layout 頁中僅有一個 LayoutContent 是不夠的。所以在 Controller 中增加了一個 LayoutSections屬性,可以允許 Layout 頁中設定多個 section,然後每個 section 可以分別包含各自的子模板頁。
layout_blog.tpl:
<!DOCTYPE html>
<html>
<head>
<title>Lin Li</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap-theme.min.css">
{{.HtmlHead}}
</head>
<body>
<div class="container">
{{.LayoutContent}}
</div>
<div>
{{.SideBar}}
</div>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
{{.Scripts}}
</body>
</html>
html_head.tpl:
<style>
h1 {
color: red;
}
</style>
scripts.tpl:
<script type="text/javascript">
$(document).ready(function() {
// bla bla bla
});
</script>
邏輯處理如下所示:
type BlogsController struct {
beego.Controller
}
func (this *BlogsController) Get() {
this.Layout = "layout_blog.tpl"
this.TplName = "blogs/index.tpl"
this.LayoutSections = make(map[string]string)
this.LayoutSections["HtmlHead"] = "blogs/html_head.tpl"
this.LayoutSections["Scripts"] = "blogs/scripts.tpl"
this.LayoutSections["Sidebar"] = ""
}
#renderform 使用
定義 struct:
type User struct {
Id int `form:"-"`
Name interface{} `form:"username"`
Age int `form:"age,text,年齡:"`
Sex string
Intro string `form:",textarea"`
}
StructTag 的定義用的標籤用為 form,和 ParseForm 方法 共用一個標籤,標籤後面有三個可選引數,用 , 分割。第一個引數為表單中型別的 name 的值,如果為空,則以 struct field name 為值。第二個引數為表單元件的型別,如果為空,則為 text。表單元件的標籤預設為 struct field name 的值,否則為第三個值。
如果 form 標籤只有一個值,則為表單中型別 name 的值,除了最後一個值可以忽略外,其他位置的必須要有 , 號分割,如:form:",姓名:"
如果要忽略一個欄位,有兩種辦法,一是:欄位名小寫開頭,二是:form 標籤的值設定為 -
現在的程式碼版本只能實現固定的格式,用 br 標籤實現換行,無法實現 css 和 class 等程式碼的插入。所以,要實現 form 的高階排版,不能使用 renderform 的方法,而需要手動處理每一個欄位。
controller:
func (this *AddController) Get() {
this.Data["Form"] = &User{}
this.TplName = "index.tpl"
}
Form 的引數必須是一個 struct 的指標。
template:
<form action="" method="post">
{{.Form | renderform}}
</form>
上面的程式碼生成的表單為:
Name: <input name="username" type="text" value="test"></br>
年齡:<input name="age" type="text" value="0"></br>
Sex: <input name="Sex" type="text" value=""></br>
Intro: <input name="Intro" type="textarea" value="">
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980
相關文章
- Freemarket模板處理
- Nuxt Kit 中的模板處理UX
- 怎樣處理包含的動態模板
- HTML歷理 HTML模板HTML
- 多對一處理 和一對多處理的處理
- SpringBoot2 整合FreeMarker模板,完成頁面靜態化處理Spring Boot
- 下次想在Golang中寫個併發處理,就用這個模板,準沒錯!Golang
- JSP 異常處理如何處理?JS
- windows批處理之一:字串處理Windows字串
- 影像處理或其他多媒體處理中的值溢位處理
- PHP錯誤處理和異常處理PHP
- 處理百萬級以上的資料處理
- 事件處理事件
- 待處理
- Cookie處理Cookie
- gson 處理
- Office處理
- 處理交接
- clob處理
- 平滑處理
- 字串處理字串
- webgl 影像處理2---影像畫素處理Web
- APM RUEI processor處理程式hang死處理方法
- Apache Beam,批處理和流式處理的融合!Apache
- Python錯誤處理和異常處理(二)Python
- Python資料處理(二):處理 Excel 資料PythonExcel
- Python影像處理丨5種影像處理特效Python特效
- 【故障處理】一次RAC故障處理過程
- 【故障處理】CRS-1153錯誤處理
- Python自然語言處理 3 處理原始文字Python自然語言處理
- 【故障處理】ORA-19809錯誤處理
- Windows批處理學習(二)——批處理(3)薦Windows
- rust學習十、異常處理(錯誤處理)Rust
- C#基礎之前處理器,異常處理C#
- PHP歷理 列表模板和標籤庫PHP
- PHP歷理 新增模板和標籤庫PHP
- PHP歷理 修改模板和標籤庫PHP
- Oracle SQL處理OracleSQL