Stellar Sword
Stellar Sword

Reputation: 6216

flask-wtf selectField choices not valid

I made a SelectField like this:

# constants.py
QUESTION_LIST = {}
QUESTION_LIST['QuestionOne'] = { 'disagree-strong': "Strongly Disagree", 'agree-strong': "Strongly Agree" }

#forms.py
from constants import *
typeone = SelectField('QuestionOne', 
      choices=QUESTION_LIST['QuestionOne'].iteritems(), 
      description='Answer the question')

So when you load the page, it shows the choices. I pick the choice, press submit and it says "this is not a valid choice" and it blanks out the select field.

Then when you refresh the page, it's as if the code is broken and it doesn't show choices anymore... It's an empty dropdown/select field.

What am I doing wrong?

EDIT: For some reason, when you put the iteritems in the view instead of the form ,everything works. Some sort of quirk with Flask-WTF where if you don't use their format it seems to delete the choices after you submit form.

Upvotes: 2

Views: 10788

Answers (3)

Ignas Butėnas
Ignas Butėnas

Reputation: 6317

Maybe the problem is that your keys in dict are a strings. I had this issue before, so maybe something like this would help:

typeone = SelectField("Question1", coerce=str, choices=QUESTION_LIST['QuestionOne'])

This coerce thingie helped. What happens I think that all POST data is unicode and by default coerce is also equals to unicode (at least in WTF forms, need to check Flask-WTF extension if you do use one). And your choices keys are strings.

Upvotes: 10

Stellar Sword
Stellar Sword

Reputation: 6216

For some reason, when you put the iteritems in the view instead of the form ,everything works. Some sort of quirk with Flask-WTF where if you don't use their format it seems to delete the choices after you submit form.

So just moving the .iteritems() code into the VIEW, by typing form.question_field.choices = QUESTION_LIST['QuestionOne'].iteritems(); Works better than using iteriterms inside the form file.

Upvotes: 1

ThiefMaster
ThiefMaster

Reputation: 318718

You are passing a set instead of a dict. Replace the commas in your QUESTION_LIST definition with colons. Actually the call to .iteritems() should already fail...

QUESTION_LIST['QuestionOne'] = { 'disagree-strong': "Strongly Disagree",
                                 'agree-strong': "Strongly Agree" }

Upvotes: 1

Related Questions