
    difficulty = RadioField('Difficulty:', \
    choices=[('0', 'Beginner'), ('1', 'Easy'), ('2', 'Medium'), ('3', 'Challenging'), ('4', 'Hard'), ('5', 'Virtuoso')], \
    validators = [DataRequired('Select one.')])
    mtype = StringField('Musical Type[s]:', \
    validators=[DataRequired('Comma-separated list of types.  Must be in types list.'), type_val])
    section = StringField('Section Name:', \
    validators=[Optional('Optional. If present must start with a number, a period, and a space.'),section_val])
    source = StringField('Source (name or library):', \
    validators=[DataRequired('If a name, must be last name + 1st character of first name. If a library, must start with library siglum'), source_val])
    document = StringField('Book or manuscript:', \
            validators=[DataRequired('Should start with a call number, if any, then ":" then human readable name of document.'), Length(5, 40)])
    volume = IntegerField('Volume # (if any):', \
    validators = [Optional('1-99'), NumberRange(min=1, max=99)])
    page = StringField('Page:', \
    validators = [DataRequired('Where the piece starts, like p. 35, 35v, 35va, f. d3, d3v, d3vb'), page_val])
    editor = StringField('Editor:', \
    validators=[DataRequired(), Length(10, 40)])
    encoder = StringField('Encoder:', \
    validators=[DataRequired(), Length(10, 40)])
    arranger = StringField('Arranger:', \
    validators=[Optional(), Length(10, 40)])
    contributor = StringField('Contributor:', \
    validators=[Optional(), Length(10, 40)])
    remarks = TextAreaField('Remarks:', \
    validators=[Optional()]
