问题: 我创建了一个简单的表单,其中有一个输入字段" num"。提交后我想在同一个输入字段中显示num的值,换句话说想要保留该字段中的输入。如果该值设置为0,那么我想忽略它。
我可以用几种语言来做,但我不确定如何在Golang中做到这一点。我当前的模板文件有,
<input type="text" placeholder="foo" name="bar" value="{{if gt .N 0 }} {{.N}} {{end}} "/>
服务器文件包含:
data := &listOfReport {
R: r,
I: i,
N: n
}
listTmpl := template.Must(template.New("list_tmpl").Parse(string(report.Template["xxx.tmpl"])))
if err := listTmpl.Execute(w, data); err != nil {
http.Error(w, fmt.Sprintf("Error rendering template %v", err), 500)
}
另一个想法是让N成为一个字符串,以便使它成为&#39;&#39;或服务器文件中的值。但这实际上破坏了变量的名称/目的。
有没有更好的方法呢?有没有更好的方法直接从模板访问GET参数?请注意,N的值最初来自GET变量。
*此代码未经过测试
答案 0 :(得分:2)
没有标准/内置方式从模板中获取任何请求参数,您必须将其放入数据中。 (您可以编写一个为您执行此操作的函数,但这将导致丑陋的黑客攻击。)
我不明白你的解决方案有什么问题。
答案 1 :(得分:1)
我采取类似的方法,但使用结构。
type SignupForm struct {
Name string
Email string
Etcera bool
}
// Type alias
type M map[string]interface{}
...
// In the handler that accepts your form
err := r.ParseForm()
if err != nil {
// handle error
}
signup := SignupForm{}
err := decoder.Decode(signup, r.PostForm)
if err != nil {
// handle error
}
// Store the 'saved' form contents somewhere temporary -
// e.g.
// - cookies (keep in mind the 4K browser limit)
// - server side sessions (Redis; how I do it)
// - db
// In the handler that renders your form
err := template.ExecuteTemplate(w, "form.html", M{
"form": signup,
"csrfToken": csrfToken,
// and so on...
})
请注意,无论您在何处存储表单数据,请确保它是临时的。服务器端会话是理想的,因为您可以使它们过期(如果您不想手动删除它们)。