为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 HTML Go 模板中执行多个变量?

如何在 HTML Go 模板中执行多个变量?

Go
万千封印 2022-10-31 16:56:24
我已经尝试查看其他问题,但它们似乎对我的情况没有帮助。我基本上需要在我的 HTML 页面上有 2 个 if 语句,但是每当我触发第二个时,tmpl.Execute()我基本上都会在这些 if 语句中嵌入相同的页面。这是我正在尝试使用的功能:func RemoveVehicle(w http.ResponseWriter, r *http.Request) {    conditionsMap := map[string]interface{}{}    username, _ := ExtractTokenUsername(r)    if username != "" {        conditionsMap["Username"] = username    }    t, err := template.ParseFiles("remove.html")    if err != nil {        http.Error(w, err.Error(), 500)        return    }    if r.Method != http.MethodPost {        t.Execute(w, conditionsMap) //Here I am trying to check to see if the user is logged in, and if not to return a false boolean that will trigger the else statement        return    }    db, err := sql.Open("mysql", "root:*******@tcp(127.0.0.1:3306)/my_db")    if err != nil {        fmt.Println("Connection Failed.")        panic(err.Error())    }    defer db.Close()    var car Vehicle    sqlStatement := `SELECT * FROM Vehicle`    rows, err := db.Query(sqlStatement)    if err != nil {        panic(err)    }    defer rows.Close()    var carSlice []Vehicle    for rows.Next() {        rows.Scan(&car.Id, &car.Date, &car.Brand, &car.Model, &car.Mileage, &car.Year, &car.rented, &car.Dayrate)        carSlice = append(carSlice, car)    }    if r.Method != http.MethodPost {        t.Execute(w, carSlice) // Then here I am trying to populate the form select with a few rows from a table        return    }    var id_ = r.FormValue("select")    fmt.Println(id_)    stmt, e := db.Prepare("DELETE FROM vehicle WHERE id=?")    ErrorCheck(e)    stmt.Exec(id_)}我已经注释掉了我试图同时工作的两个部分,但它们是单独工作的。我尝试使用结构,但carSlice它已经是结构并且conditionMap是映射。解决这种情况的最佳解决方案是什么?
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

首先,建议在程序启动期间只初始化一次*template.Template类型和连接池。*sql.DB这两种类型对于并发使用都是安全的,因此可以由多个处理程序同时使用。


var (

    removeTemplate *template.Template

    db             *sql.DB

)


func init() {

    var err error


    removeTemplate, err = template.ParseFiles("remove.html")

    if err != nil {

        panic(err)

    }


    db, err = sql.Open("mysql", "root:*******@tcp(127.0.0.1:3306)/my_db")

    if err != nil {

        panic(err)

    } else if err := db.Ping(); err != nil {

        panic(err)

    }

}

现在您的处理程序可能如下所示:


func RemoveVehicle(w http.ResponseWriter, r *http.Request) {

    // check if the user is logged in

    username, _ := ExtractTokenUsername(r)

    if len(username) == 0 {

        // if not, render the template with no data, this

        // will show the "please login" part of your template

        if err := removeTemplate.Execute(w, nil); err != nil {

            http.Error(w, err.Error(), http.StatusInternalServerError)

        }

        return

    }


    switch r.Method {


    // if the method is GET, show the list of vehicles available

    case http.MethodGet:

        // select vehicles from db

        rows, err := db.Query(`SELECT * FROM Vehicle`)

        if err != nil {

            http.Error(w, err.Error(), http.StatusInternalServerError)

            return

        }

        defer rows.Close()


        // scan rows

        var vehicles []Vehicle

        for rows.Next() {

            var v Vehicle

            err := rows.Scan(&v.Id, &v.Date, &v.Brand, &v.Model, &v.Mileage, &v.Year, &v.rented, &v.Dayrate)

            if err != nil {

                http.Error(w, err.Error(), http.StatusInternalServerError)

                return

            }

            vehicles = append(vehicles, v)

        }

        if err := rows.Err(); err != nil {

            http.Error(w, err.Error(), http.StatusInternalServerError)

            return

        }


        // now render the template with the data

        // that you just retrieved from the database

        data := map[string]interface{}{

            "Username": username,

            "Vehicles": vehicles,

        }

        if err := removeTemplate.Execute(w, data); err != nil {

            http.Error(w, err.Error(), http.StatusInternalServerError)

        }


    // if the method is POST, delete the vehicle

    case http.MethodPost {

        var id = r.FormValue("select")

        if _, err := db.Exec("DELETE FROM vehicle WHERE id=?", id); err != nil {

            http.Error(w, err.Error(), http.StatusInternalServerError)

        }

    }

}

在您的模板中,由于处理程序传入的数据是带有Username和Vehicles键的映射,因此您需要range覆盖.Vehicles而不仅仅是..


{{if .Username}}

<div><img src="images/kogdpilnmzhz9rhzceo2.png" alt="" width="65" height="65" class="addV_label"/></div>

<hr style="height:5px">

<form action="/remove" method="POST" source="custom" name="form">

    <input type="hidden" name="xss-token" value=""/>

    <div class="form-group">

        <div>

            <label class="addV_label">Select Vehicle&nbsp;</label>

            <select name="select" class="form-control loginInput2" required="required">

                {{range .Vehicles}}

                <option value="{{.Id}}">{{.Brand}} {{.Model}} ({{.Year}}), {{.Mileage}} miles | £{{.Dayrate}}/pd</option>

                {{end}}

            </select>

        </div>

    </div>

    <div>

        <button class="btn-block frgt_1 btn addV_btn" type="submit" value="remove">REMOVE</button>

    </div>

</form>

{{else}}

<p> Access Denied, please login.<a href="/login">Login</a></p>

{{end}}


查看完整回答
反对 回复 2022-10-31
  • 1 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信