from wtforms import Form, FormField, FieldList
from wtforms.validators import InputRequired, Optional, DataRequired
class KeyOptional(Optional):
def __call__(self, form, field):
if not field.raw_data:
field.errors[:] = []
raise StopValidation()
class BaseForm(Form):
class Meta(object):
locales = ['zh_CN']
def bind_field(self, form, unbound_field, options):
filters = unbound_field.kwargs.get('filters', [])
filters.append(_strip_filter)
return unbound_field.bind(form=form, filters=filters, **options)
@property
def errors(self):
# f.label.text 获得汉字
return {label: f.errors[0] for label, f in self._fields.items() if f.errors}
class CommitAnswerForm(BaseForm):
qid = IntegerField(u'id', [KeyOptional()])
name = StringField(u'', [DataRequired()])
type = StringField(u'', [DataRequired()])
result = RadioField(u'')
leaf_id = StringField(u'', [DataRequired()])
questionnaire_id = IntegerField(u'', [DataRequired()])
class SuperCommitForm(Form):
answers = FieldList(FormField(CommitAnswerForm, label='sub_answer'))
def commit_answer():
form = SuperCommitForm.from_json(request.json)
if not form.validate():
return bad_request(form.errors)
for answer in form.answers:
if answer.qid.data: # update answer
question_item = QuestionnaireItem.query.get_or_404(answer.qid.data)
question_item.result = answer.result.data
else: # insert answer
form_data = answer.data
form_data.pop('qid')
question_item = QuestionnaireItem(**form_data)
db.session.add(question_item)
db.session.commit()
return success(message='success')
flask wtforms传递一个字典的列表
最新推荐文章于 2022-08-10 16:29:13 发布