Installation:
go get github.com/vmihailenco/gforms
Example:
package blog
import (
"net/http"
"github.com/vmihailenco/gforms"
)
type ArticleForm struct {
gforms.BaseForm
Title *gforms.StringField `gforms:",req"`
Text *gforms.StringField `gforms:",req"`
IsPublic *gforms.BoolField
}
func NewArticleForm(article *Article) *ArticleForm {
f := &ArticleForm{}
gforms.InitForm(f)
f.Title.MaxLen = 500
f.IsPublic.Label = "Is public?"
if article != nil {
f.Title.SetInitial(article.Title)
f.Text.SetInitial(article.Text())
f.IsPublic.SetInitial(article.IsPublic)
}
return f
}
func (f *ArticleForm) Populate(article *Article) {
article.Title = f.Title.Value()
article.Text = f.Text.Value()
article.IsPublic = f.IsPublic.Value()
}
func CreateArticleHandler(w http.ResponseWriter, r *http.Request) {
form := NewArticleForm(nil)
if r.Method == "POST" {
_ = r.ParseForm()
if gforms.IsFormValid(form, r.Form) {
article := &Article{}
form.PopulateArticle(article)
if err := SaveArticle(article); err != nil {
HandleError(w, err)
return
}
http.Redirect(w, r, "/articles", http.StatusFound)
return
}
}
data := struct {
Form *ArticleForm
} {
Form: form,
}
RenderTemplate(w, data)
}
Template:
<form method="post" class="well article">
{{render .Form.Title "class" "span6"}}
{{render .Form.Text "class" "span6"}}
{{render .Form.IsPublic}}
<div class="form-actions">
<button type="submit" class="btn btn-primary">Create New Article</button>
</div>
</form>