flask_wtf SelectField (ошибка: неверный выбор) - PullRequest
0 голосов
/ 13 марта 2019

Я использую Python 2.7, и я искал решение здесь , здесь и здесь , но ни один из них не решил мою проблему, над которой я работаюпростой проект (мой первый) для практики CRUD с использованием фляги и базы данных sqlite с 2 таблицами:

  1. Категории
  2. Items

Проблема заключается в:

Когда я загружаю страницу, форма отображается правильно, а когда я выбираю любую категорию и отправляю, форма просто выдает ошибку при звонке

validate_on_submit()

говорит Недопустимый выбор с возвращаемым значением False

Я определил форму следующим образом:

from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SelectField
from wtforms.validators import DataRequired


class EditItemForm(FlaskForm):
    name = StringField(u'name', validators=[DataRequired()])
    description = TextAreaField("Description", validators=[
                                DataRequired()], render_kw={'rows': '7'})
    categories = SelectField(
        u'Categories', coerce=str, choices=[], validators=[DataRequired()])

    def set_choices(self, list_of_tuples=[]):
        self.categories.choices = list_of_tuples

, и это функция для редактирования элемента:

@app.route('/category/<string:category_name>/<string:item_name>/edit/',
        methods=['GET', 'POST'])
def editItem(category_name, item_name):
    # get the category of the Item
    c = getCategory(category_name)

    # get the Item
    target_item = getItem(c, item_name)

    form = EditItemForm()

    # FIXME: Complete The process
    if request.method == 'POST':
        if form.validate_on_submit():
            # get selected category
            cat = dict(form.categories.choices).get(form.categories.data)
            targetCategory = getCategory(cat)

            # get identicals to avoid dublication
            identicals = getItemIdenticalsInCategory(
                targetCategory, form.name.data)

            if len(identicals >= 1):
                # FIXME: flash the Error in the same page
                return "An Item with the same name " + form.name.data + "     already exists in " + targetCategory.name

            else:
                # Edit The Item Data
                target_item.name = form.name.data
                target_item.description = form.description.data
                target_item.category_id = targetCategory.id

                # TODO: Flash the response
                return redirect(url_for('readCategoryItems',
                                        category_name=category_name))

        else:
            # display errors
            output = ""
            for fieldName, errorMessages in form.errors.items():
                for err in errorMessages:
                    # do something with your errorMessages for fieldName
                    output += fieldName + ":\t" + err + "<hr>"
            print(output)
            return output

    if request.method == 'GET':

        # Populate The form with current data
        form.name.data = target_item.name
        form.description.data = target_item.description
        cats = getAllCategories()
        list_of_tupels = []

        for cat in cats:
            session.refresh(cat)
            list_of_tupels.append((cat.name, cat.name))

        form.set_choices(list_of_tuples=list_of_tupels)

        return render_template('updateItem.html', 
            category_name=category_name,
                            item_name=item_name, form=form)

и вывод ошибки:

categories: Not a valid choice<hr>

edit: * вот что я получил, когда попытался его отладить: Снимок экрана с отладочными переменными

...