1

I want to build the selectable drop button to select the users in the database according to users' role id.

The classes are defined below.

roles_users = db.Table(
   'roles_users',
   db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
   db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)


class Role(db.Model, RoleMixin):
     id = db.Column(db.Integer(), primary_key=True)
     name = db.Column(db.String(80), unique=True)

     def __str__(self):
        return self.name

class User(db.Model, UserMixin):
     id = db.Column(db.Integer, primary_key=True)
     roles = db.relationship('Role', secondary=roles_users,
                         backref=db.backref('users', lazy='dynamic'))
     email = db.Column(db.String(255), unique=True)

     def __str__(self):
         return self.email
 
class Project(db.Model):

     id = db.Column(db.Integer, primary_key=True)
     reviewer = db.Column(db.Unicode(128))

     def __unicode__(self):
        return self.name

Since I want to list the users with Role.id==4 as reviewer in project class, I tried both methods below but in vain:

1. QuerySelectField

It returns nothing in the list:

def reviewer_choices():
    return User.query.join(User.roles).filter(Role.id == 4).all().query

class Project(db.Model):
     reviewer = QuerySelectField(query_factory = reviewer_choices)

2. form_args

It returns error: TypeError: __init__() got an unexpected keyword argument 'query_factory'

def reviewer_choices():
    return User.query.join(User.roles).filter(Role.id == 4).all().query

class Project(db.Model):
    form_args = dict(
              reviewer=dict(query_factory =reviewer_choices),
   )

1 Answer 1

3

query_factory callback should return a query, you could change your reviewer_choices like this:

def reviewer_choices():
    return User.query.join(User.roles).filter(Role.id == 4)

Update:

Add below code with two selected required fields to your class SWProjectView(sqla.ModelView):

form_extra_fields = {
    'reviewer1': sqla.fields.QuerySelectField(
        label='Reviewer1',
        query_factory=reviewer1_choices,
        validators=[DataRequired()]
    ),
    'reviewer2': sqla.fields.QuerySelectField(
        label='Reviewer2',
        query_factory=reviewer2_choices,
        validators=[DataRequired()]
    )
}

This will make the field Reviewer1 and Reviewer2 to be selected and required fields, show in the image: enter image description here

Sign up to request clarification or add additional context in comments.

14 Comments

Hi, thanks I tried but still not work for both QuerySelectField and form_args.
@ Tiny.D, still return nothing for QuerySelectField and TypeError: __init__() got an unexpected keyword argument 'query_factory' for form_args.
@Samoth can you please change to return User.query to see what will return you?
@ Tiny.D : Thanks but I've tried return User.query and the results are the same.
@Samoth User.query will query all users from db, it seems the query cannot get any data, are you sure the data are stored in your db?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.