If I have the following form setup:
{{ range $key, $value := .Scores }}
<input id="{{$value.Id}}_rating__1" type="radio" name="rating[{{$value.Id}}]" value="-1">
<input id="{{$value.Id}}_rating__0" type="radio" name="rating[{{$value.Id}}]" value="0">
<input id="{{$value.Id}}_rating__2" type="radio" name="rating[{{$value.Id}}]" value="+1">
{{ end }}
How can I then extract that data correctly? Knowing that there .Scores
can contain multiple structs
func categoryViewSubmit(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm()
if err != nil {
log.Fatal(err)
}
fmt.Println("POST")
fmt.Printf("%+v
", r.Form()) // annot call non-function r.Form (type url.Values)
fmt.Printf("%+v
", r.FormValue("rating")) // Returns nothing
}
The form keys look like rating[id]
where id
is a value identifier. To get one of the values, call r.FormValue("rating[id]")
after substituting id
for an actual id value.
I suggest printing the form to see what's going on:
fmt.Printf("%+v
", r.Form) // No () following Form, Form is not a function
The form is an url.Values. An url.Values is a map[string][]string. You can iterate through the form as follows:
for key, values := range r.Form { // range over map
for _, value := range values { // range over []string
fmt.Println(key, value)
}
}
For others that are looking answers for this I found Gorilla's schema really helpful. It allows you to parse forms to structs and has support for arrays and nested structs. When you combine that with guregu's null package you can easily parse sructs with optional fields.
Example Go:
package models
import (
"github.com/gorilla/schema"
"gopkg.in/guregu/null.v3"
)
type User struct {
Id null.Int `db:"id" json:"id"`
// Custom mapping for form input "user_name"
Name string `db:"user_name" json:"user_name" schema:"user_name"`
EmailAddress string `db:"email_address" json:"email_address"`
OptionalField null.String `db:"optional_field" json:"optional_field"`
}
Example html
<form>
<input type="text" name="user_name">
<input type="text" name="EmailAddress">
<input type="text" name="OptionalField">
</form>