html - 如何执行html模板
问题描述
在这段代码中,我试图执行函数tmpl.ExecuteTemplate(res, "about.html", d)
中存在的那个showAbout()
。
在handler.go
文件中,我有两个功能。第一个是showAbout()
,第二个是about()
。about()
功能检查授权,并在成功授权后,它转到showAbout()
它有 if 语句的功能。
如果数据库中的 about 字段为空,则它应该执行aboutform.html
,获取数据并将其插入数据库。
如果数据插入成功,则显示消息并返回以about.html
在此处显示数据。
只有about.html
不执行。虽然给出了成功消息。
about.html
<section>
<h1>About</h1>
<hr>
<p>{{.Aboutdata}}</p>
</section>
aboutform.html
<form action="/about" method="POST">
<section>
<label>Content</label>
<textarea name="content"></textarea>
<div>
<input type="submit" value="Submit">
</div>
</section>
</form>
db.go
func Insertdata(key, value string) bool {
collection := Connect.Database("webApp3").Collection("data")
filter := bson.M{"email": Account.Email, "password": Account.Password}
update := bson.M{
"$set": bson.M{
key: value,
},
}
_, err := collection.UpdateOne(context.TODO(), filter, update)
return err == nil
}
处理程序.go
func showAbout(res http.ResponseWriter, req *http.Request) {
d := struct{ Aboutdata string }{Aboutdata: database.Account.About}
if d.Aboutdata == "" {
tmpl.ExecuteTemplate(res, "aboutform.html", nil)
content := req.FormValue("content")
inserted := database.Insertdata("about", content)
if inserted == true {
fmt.Println("About is successfully inserted")
tmpl.ExecuteTemplate(res, "about.html", d) // It is not executing the about.html file
} else {
fmt.Println("About is not inserted")
}
} else {
tmpl.ExecuteTemplate(res, "about.html", d) // Although this same file is executing here.
}
}
func about(res http.ResponseWriter, req *http.Request) {
session, _ := store.Get(req, "session-name")
var authenticated interface{} = session.Values["authenticated"]
if authenticated != nil {
isAuthenticated := session.Values["authenticated"].(bool)
if !isAuthenticated {
tmpl.ExecuteTemplate(res, "login.html", nil)
return
}
showAbout(res, req)
} else {
tmpl.ExecuteTemplate(res, "login.html", nil)
return
}
}
解决方案
这是您的 about 处理程序的外观示例。请记住,该示例只是说明使用单个处理程序处理 GET 和 POST 请求的通用结构。据我所知,您问题中的代码包含许多其他逻辑错误,您仍需解决这些错误。
请注意,呈现模板和处理数据输入的逻辑在 GET 和 POST HTTP 方法之间进行了拆分。一些路由器允许基于方法的处理程序注册,在这种情况下,您可以有两个单独的处理程序,一个用于showAbout
,另一个用于createAbout
或其他。
考虑到块的结构,在此示例中使用return
语句是不必要的if-else
,但是,无论如何我确实包含了它们以明确说明,一般来说,在您写入响应之后,您不应该有任何其他响应编写代码:否http.Redirect
,没有更多的ExecuteTemplate
电话等。
func handleAbout(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
if data_is_present {
if err := t.ExecuteTemplate(w, "about.html", nil); err != nil {
fmt.Println(err)
}
return
} else if data_is_NOT_present {
if err := t.ExecuteTemplate(w, "aboutform.html", nil); err != nil {
fmt.Println(err)
}
return
}
} else if r.Method == "POST" {
content := r.FormValue("content")
inserted := database.Insertdata("about", content)
if inserted == true {
d := struct{ Aboutdata string }{Aboutdata: content}
if err := t.ExecuteTemplate(w, "about.html", d); err != nil {
fmt.Println(err)
}
return
} else {
fmt.Println("About is not inserted")
return
}
}
}
推荐阅读
- python - 读取多个excel文件并将数据存储在字典win32中
- azure-media-services - (ResourceGroupNotFound) 资源组 '????' 创建 Azure 媒体服务帐户时找不到
- delphi - 如何更改语音语言
- python - Python "in" 和 "==" 混淆
- python - 如何通过使用数据框在某一列上使用随机数
- c - 在 C 中对齐使用多少内存?
- html - 如何保持图标在 div 内严格对齐?
- html - 角度5:表格行内的模板绑定
- python - Flask-Rebar 规则验证
- node.js - Alexa 技能学习:TypeError:无法读取未定义的属性“值”