diff --git a/templatefunc.go b/templatefunc.go index 8558733f..0f9af481 100644 --- a/templatefunc.go +++ b/templatefunc.go @@ -422,17 +422,18 @@ func RenderForm(obj interface{}) template.HTML { fieldT := objT.Field(i) label, name, fType, id, class, ignored := parseFormTag(fieldT) + required := parseMetaTag(fieldT) if ignored { continue } - raw = append(raw, renderFormField(label, name, fType, fieldV.Interface(), id, class)) + raw = append(raw, renderFormField(label, name, fType, fieldV.Interface(), id, class, required)) } return template.HTML(strings.Join(raw, "
")) } // renderFormField returns a string containing HTML of a single form field. -func renderFormField(label, name, fType string, value interface{}, id string, class string) string { +func renderFormField(label, name, fType string, value interface{}, id string, class string, required bool) string { if id != "" { id = " id=\"" + id + "\"" } @@ -441,8 +442,13 @@ func renderFormField(label, name, fType string, value interface{}, id string, cl class = " class=\"" + class + "\"" } + requiredString := "" + if required { + requiredString = " required" + } + if isValidForInput(fType) { - return fmt.Sprintf(`%v`, label, id, class, name, fType, value) + return fmt.Sprintf(`%v`, label, id, class, name, fType, value, requiredString) } return fmt.Sprintf(`%v<%v%v%v name="%v">%v`, label, fType, id, class, name, value, fType) @@ -496,6 +502,21 @@ func parseFormTag(fieldT reflect.StructField) (label, name, fType string, id str label = tags[2] } } + + return +} + +// parseMetaTag takes the stuct-tag of a StructField and parses the `meta` value. +// returned is the boolean of whether the field is required +func parseMetaTag(fieldT reflect.StructField) (required bool) { + meta := strings.Split(fieldT.Tag.Get("meta"), ",") + required = false + switch len(meta) { + case 1: + if len(meta[0]) > 0 && meta[0] != "-" { + required = true + } + } return }