首页 > 解决方案 > 如何将数据传递到烧瓶中的 wtforms QuerySelectField

问题描述

我正在使用 RBAC 开发一个应用程序,并且我正在尝试使用我的 Role 数据库模型中的数据填充 QuerySelectField 但它不起作用,因为我经常遇到这两个错误之一:

sqlalchemy.exc.OperationalError: <unprintable OperationalError object>

或者

TypeError: 'BaseQuery' object is not callable

模型.py

class Role(db.Model):
  id = db.Column(db.Integer, primary_key=True, autoincrement='auto')
  name = db.Column(db.String(50), unique=True)
  user = db.relationship('User', backref='role', lazy='dynamic')
  not_view = db.Column(db.Text, nullable=False)
  not_edit = db.Column(db.Text, nullable=False)
  not_add = db.Column(db.Text, nullable=False)
  not_delete = db.Column(db.Text, nullable=False)

表格.py

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email, EqualTo, Length
from app.models import Role
from wtforms.ext.sqlalchemy.fields import QuerySelectField


def role_choice():
  return Role.query

class AddUserForm(FlaskForm):
  username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
  email = StringField('Email', validators=[DataRequired(), Email()])
  password = PasswordField('Password', validators=[DataRequired()])
  confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
  role_id = QuerySelectField(query_factory=role_choice)

我尝试了几种不同的数据传递方式,但都没有奏效。有人可以帮忙吗?

标签: flaskflask-sqlalchemyflask-wtforms

解决方案


不要费心回答,我已经用动态选择的 SelectField 解决了这个问题。

class UserDetails(Form):
   group_id = SelectField(u'Group', coerce=int)

def edit_user(request, id):
  user = User.query.get(id)
  form = UserDetails(request.POST, obj=user)
  form.group_id.choices = [(g.id, g.name) for g in Group.query.order_by('name')]

推荐阅读