WTForms create variable number of fields

Viewed 6951

How I would dynamically create a few form fields with different questions, but the same answers?

from wtforms import Form, RadioField
from wtforms.validators import Required

class VariableForm(Form):

    def __init__(formdata=None, obj=None, prefix='', **kwargs):
        super(VariableForm, self).__init__(formdata, obj, prefix, **kwargs)
        questions = kwargs['questions']
        // How to to dynamically create three questions formatted as below?

    question = RadioField(
            # question ?,
            [Required()],
            choices = [('yes', 'Yes'), ('no', 'No')],
            )

questions = ("Do you like peas?", "Do you like tea?", "Are you nice?")  
form = VariableForm(questions = questions)
3 Answers

In my case, I used a csv and imported it using pandas.

So, this solution allows you to even use different answers if required.

data=pd.read_csv("./temp.csv")
class UserForm(Form):
    for i in data:
        if data[i][0] == 'textbox':
            formElement='TextField("%s",validators=[validators.required()], default="please add content")' %(i)

        elif data[i][0] == 'radio':
            choice = list(data[i][1:].dropna().unique().tolist())
            choiceStr=''
            for k in choice:
               choiceStr +="('"+k+"','"+k+"'),"
            
            formElement = 'RadioField("%s",validators=[validators.required()],choices=[%s], default="%s")' %(i,choiceStr, choice[0])

        elif data[i][0] == 'dropdown':
            choice = list(data[i][1:].dropna().unique().tolist())
            # choice.remove('X')
            choiceStr=''
            for k in choice:
               choiceStr +="('"+k+"','"+k+"'),"
            
            formElement = 'SelectField("%s",validators=[validators.required()],choices=[%s])' %(i,choiceStr)


        exec("%s=%s" % (i,formElement))

Related