beego模板處理

2023-11-21 10:45 更新

beego 的模板處理引擎采用的是 Go 內(nèi)置的 html/template 包進(jìn)行處理,而且 beego 的模板處理邏輯是采用了緩存編譯方式,也就是所有的模板會(huì)在 beego 應(yīng)用啟動(dòng)的時(shí)候全部編譯然后緩存在 map 里面。

模板目錄

beego 中默認(rèn)的模板目錄是 views,用戶可以把模板文件放到該目錄下,beego 會(huì)自動(dòng)在該目錄下的所有模板文件進(jìn)行解析并緩存,開發(fā)模式下每次都會(huì)重新解析,不做緩存。當(dāng)然,用戶也可以通過如下的方式改變模板的目錄(只能指定一個(gè)目錄為模板目錄):

beego.ViewsPath = "myviewpath"

自動(dòng)渲染

用戶無需手動(dòng)的調(diào)用渲染輸出模板,beego 會(huì)自動(dòng)的在調(diào)用完相應(yīng)的 method 方法之后調(diào)用 Render 函數(shù),當(dāng)然如果您的應(yīng)用是不需要模板輸出的,那么可以在配置文件或者在 main.go 中設(shè)置關(guān)閉自動(dòng)渲染。

配置文件配置如下:

autorender = false

main.go 文件中設(shè)置如下:

beego.AutoRender = false

模板標(biāo)簽

Go 語言的默認(rèn)模板采用了 {{ 和 }} 作為左右標(biāo)簽,但是我們有時(shí)候在開發(fā)中可能界面是采用了 AngularJS 開發(fā),他的模板也是這個(gè)標(biāo)簽,故而引起了沖突。在 beego 中你可以通過配置文件或者直接設(shè)置配置變量修改:

beego.TemplateLeft = "<<<"
beego.TemplateRight = ">>>"

模板數(shù)據(jù)

模板中的數(shù)據(jù)是通過在 Controller 中 this.Data 獲取的,所以如果你想在模板中獲取內(nèi)容 {{.Content}} ,那么你需要在 Controller 中如下設(shè)置:

this.Data["Content"] = "value"

如何使用各種類型的數(shù)據(jù)渲染:

  • 結(jié)構(gòu)體結(jié)構(gòu)體結(jié)構(gòu) type A struct{ Name string Age int } 控制器數(shù)據(jù)賦值 this.Data["a"]=&A{Name:"astaxie",Age:25} 模板渲染數(shù)據(jù)如下: the username is {{.a.Name}} the age is {{.a.Age}}
  • map控制器數(shù)據(jù)賦值 mp["name"]="astaxie" mp["nickname"] = "haha" this.Data["m"]=mp 模板渲染數(shù)據(jù)如下: the username is {{.m.name}} the username is {{.m.nickname}}
  • slice控制器數(shù)據(jù)賦值 ss :=[]string{"a","b","c"} this.Data["s"]=ss 模板渲染數(shù)據(jù)如下: {{range $key, $val := .s}} {{$key}} {{$val}} {{end}}

模板名稱

beego 采用了 Go 語言內(nèi)置的模板引擎,所有模板的語法和 Go 的一模一樣,至于如何寫模板文件,詳細(xì)的請(qǐng)參考 模板教程。

用戶通過在 Controller 的對(duì)應(yīng)方法中設(shè)置相應(yīng)的模板名稱,beego 會(huì)自動(dòng)的在 viewpath 目錄下查詢?cè)撐募秩?,例如下面的設(shè)置,beego 會(huì)在 admin 下面找 add.tpl 文件進(jìn)行渲染:

this.TplName = "admin/add.tpl"

我們看到上面的模板后綴名是 tpl,beego 默認(rèn)情況下支持 tpl 和 html 后綴名的模板文件,如果你的后綴名不是這兩種,請(qǐng)進(jìn)行如下設(shè)置:

beego.AddTemplateExt("你文件的后綴名")

當(dāng)你設(shè)置了自動(dòng)渲染,然后在你的 Controller 中沒有設(shè)置任何的 TplName,那么 beego 會(huì)自動(dòng)設(shè)置你的模板文件如下:

c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt

也就是你對(duì)應(yīng)的 Controller 名字+請(qǐng)求方法名.模板后綴,也就是如果你的 Controller 名是 AddController,請(qǐng)求方法是 POST,默認(rèn)的文件后綴是 tpl,那么就會(huì)默認(rèn)請(qǐng)求 /viewpath/AddController/post.tpl 文件。

Layout 設(shè)計(jì)

beego 支持 layout 設(shè)計(jì),例如你在管理系統(tǒng)中,整個(gè)管理界面是固定的,只會(huì)變化中間的部分,那么你可以通過如下的設(shè)置:

this.Layout = "admin/layout.html"
this.TplName = "admin/add.tpl"

在 layout.html 中你必須設(shè)置如下的變量:

{{.LayoutContent}}

beego 就會(huì)首先解析 TplName 指定的文件,獲取內(nèi)容賦值給 LayoutContent,然后最后渲染 layout.html 文件。

目前采用首先把目錄下所有的文件進(jìn)行緩存,所以用戶還可以通過類似這樣的方式實(shí)現(xiàn) layout:

{{template "header.html" .}}
Logic code
{{template "footer.html" .}}
特別注意后面的.,這是傳遞當(dāng)前參數(shù)到子模板

LayoutSection

對(duì)于一個(gè)復(fù)雜的 LayoutContent,其中可能包括有javascript腳本、CSS 引用等,根據(jù)慣例,通常 css 會(huì)放到 Head 元素中,javascript 腳本需要放到 body 元素的末尾,而其它內(nèi)容則根據(jù)需要放在合適的位置。在 Layout 頁中僅有一個(gè) LayoutContent 是不夠的。所以在 Controller 中增加了一個(gè) LayoutSections屬性,可以允許 Layout 頁中設(shè)置多個(gè) section,然后每個(gè) 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"  rel="external nofollow" target="_blank" >
    <link rel="stylesheet"  rel="external nofollow" target="_blank" >
    {{.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" rel="external nofollow" ></script>
    <script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js" rel="external nofollow" ></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 的定義用的標(biāo)簽用為 form,和 ParseForm 方法 共用一個(gè)標(biāo)簽,標(biāo)簽后面有三個(gè)可選參數(shù),用 , 分割。第一個(gè)參數(shù)為表單中類型的 name 的值,如果為空,則以 struct field name 為值。第二個(gè)參數(shù)為表單組件的類型,如果為空,則為 text。表單組件的標(biāo)簽?zāi)J(rèn)為 struct field name 的值,否則為第三個(gè)值。
  • 如果 form 標(biāo)簽只有一個(gè)值,則為表單中類型 name 的值,除了最后一個(gè)值可以忽略外,其他位置的必須要有 , 號(hào)分割,如:form:",,姓名:"
  • 如果要忽略一個(gè)字段,有兩種辦法,一是:字段名小寫開頭,二是:form 標(biāo)簽的值設(shè)置為 -
  • 現(xiàn)在的代碼版本只能實(shí)現(xiàn)固定的格式,用 br 標(biāo)簽實(shí)現(xiàn)換行,無法實(shí)現(xiàn) css 和 class 等代碼的插入。所以,要實(shí)現(xiàn) form 的高級(jí)排版,不能使用 renderform 的方法,而需要手動(dòng)處理每一個(gè)字段。

controller:

func (this *AddController) Get() {
    this.Data["Form"] = &User{}
    this.TplName = "index.tpl"
}

Form 的參數(shù)必須是一個(gè) 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="">
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)