使用gorilla / schema </select>解压缩<select>字段

时间:2013-10-21 04:06:39

标签: html go gorilla

我正在使用gorilla/schemar.PostForm解压缩到结构中。

我的问题是,我正试图找出一种“明智”的方式来获取<select>元素的选定值,以便我可以轻松地使用html/template重新选择字段(即从会话重新填充表单时),注意到只是通过将结构的实例传递给RenderTemplate,没有一种简单的方法来测试等式

说明我的所作所为:

type Listing struct {
    Id           string        `schema:"-"`
    Title        string        `schema:"title"`
    Company      string        `schema:"company"`
    Location     string        `schema:"location"`
        ...
    Term         string        `schema:"term"`
}

if r.Method == "POST" {

// error handling code removed for brevity, but trust me, it exists!

    err = r.ParseForm()
    err = decoder.Decode(listing, r.PostForm)
    err = listing.Validate() // checks field lengths as I'm using a schema-less datastore

<label for="term">Term</label>
      <select data-placeholder="Term...?" id="term" name="term" required>
        <option name="term" value="full-time">Full Time</option>
        <option name="term" value="part-time">Part Time</option>
        <option name="term" value="contract">Contract</option>
        <option name="term" value="freelance">Freelance</option>
      </select>

...当我将列表实例传递给模板时,我希望能够做什么:

renderTemplate(w, "create_listing.tmpl", M{
        "listing":              listing,
    })

 <label for="term">Term</label>
          <select data-placeholder="Term...?" id="term" name="term" required>
            <option name="term" value="full-time" {{ if .term == "full-time" }}selected{{end}}>Full Time</option>
            <option name="term" value="part-time"{{ if .term == "part-time" }}selected{{end}}>Part Time</option>
            <option name="term" value="contract" {{ if .term == "contract" }}selected{{end}}>Contract</option>
            <option name="term" value="freelance" {{ if .term == "freelance" }}selected{{end}}>Freelance</option>
          </select>

显然这不起作用。我已经将template.FuncMap视为一种可能的解决方案,但是当我想将整个列表实例传递给模板时(即代替逐个字段),我不确定如何使用它。如果可能的话,我也希望最小化我的struct中不必要的字段。我可以为每个值设置布尔字段(即Fulltime bool,但是如果用户返回并编辑内容,我需要使用代码将其他字段更改为“false”。

有没有办法以与template/html的限制相吻合的方式实现这一目标?

2 个答案:

答案 0 :(得分:5)

您可以编写一个视图来构建和表示select元素:

{{define "select"}}
    <select name="{{.Name}}>
        {{range $a, $b := .Options}}
             <option value="{{print $a}}" {{if $a == .Selected}}>{{print $b}}</option>
        {{end}}
    </select>
{{end}}

以及相应的数据结构:

type SelectBlock struct {
    Name     string
    Selected string
    Options  map[string]string
}

然后实例化它:

termSelect := SelectBlock{
    Name:     "term",
    Selected: "",
    Options:  map[string]string{
        "full-time": "Full Time",
        "part-time": "Part Time",
        "contract":  "Contract",
        "freelance": "Freelance",
    },
}

并设置Selected字段:

termSelect.Selected = "full-time"

并在表单视图中输出视图片段:

{{template "select" $termSelect}}

$termSelect将成为SelectBlock的实例。

答案 1 :(得分:2)

对于将来关注此事的其他人,使用Go v1.2或更高版本的人:text/templatehtml/template现在提供了一个相等运算符(以及其他新运算符):http://golang.org/doc/go1.2#text_template

{{if eq .Term "full-time" }}selected{{end}}
...
{{if eq .Term "freelance" }}selected{{end}}