Я использую Python 2.7, и я искал решение здесь , здесь и здесь , но ни один из них не решил мою проблему, над которой я работаюпростой проект (мой первый) для практики CRUD с использованием фляги и базы данных sqlite с 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: * вот что я получил, когда попытался его отладить: Снимок экрана с отладочными переменными