我正在尝试实现jQuery自动完成,并且无法传递对象,因此他们拥有我的html中提供的所有信息。我正在尝试关注Carl Ekerot's Post,但无法正确序列化。在我的模板中,当我输入要搜索的条目时,我在下拉列表中没有任何建议。数据库正在正确地返回几个条目,因此问题必须在于它如何序列化数据。
以下是我正在尝试实施的jQuery Autocomplete Documentation的链接。
models.py
class Serializer(object):
def serialize(self):
return {c: getattr(self, c) for c in inspect(self).attrs.keys()}
@staticmethod
def serialize_list(l):
return [m.serialize() for m in l]
class User(db.Model, Serializer):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32), index=True, unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
#active=db.Column(db.Boolean, default=True)
admin = db.Column(db.Boolean, default=False)
last_seen = db.Column(db.DateTime)
roles=db.relationship('Role', backref='user')
replies_sent=db.relationship('Message_Reply', backref='from_user')
group_admins=db.relationship('Group',
secondary='admined',
primaryjoin=(admined.c.user_id==id),
backref='admins')
messages=db.relationship('Message_User', backref='user')
groups=db.relationship('Group',
secondary='grouped',
primaryjoin=(grouped.c.user_id==id),
backref='users')
permissions = db.relationship('Permission',
secondary=permissioned,
primaryjoin=(permissioned.c.user_id==id),
backref='users')
def serialize(self):
d = Serializer.serialize(self)
del d['password_hash']
del d['admin']
del d['roles']
del d['replies_sent']
del d['group_admins']
del d['messages']
del d['groups']
del d['permissions']
del d['last_seen']
return d
views.py
@app.route("/search", methods=['GET', 'POST'])
def search():
print request.args
try:
term=request.args['term']
data=User.query.filter(User.username.like('%'+term+'%')).all()
'''
q=[]
for i in data:
q.append(i.username)
'''
except:
return jsonify('fail')
print User.serialize_list(data)
return json.dumps(User.serialize_list(data))
#return json.dumps(data.serialize())
#return jsonify('a')
'''
def get_user(id):
user = User.query.get(id)
return json.dumps(user.serialize())
def get_users():
users = User.query.all()
return json.dumps(User.serialize_list(users))
'''
scripts.js中
$( function() {
function log( message ) {
$( "<div>" ).text( message ).prependTo( "#log" );
$( "#log" ).scrollTop( 0 );
}
$("#birds").autocomplete({
source: "/search",
minLength: 1,
select: function( event, ui ) {
log("Selected: " + ui.item.value + " aka " + ui.item.id);
}
});
});
template.html
<div class="ui-widget">
<input id="birds" class="form-control" placeholder="Users">
</div>
<div class="ui-widget" style="margin-top:2em; font-family:Arial">
Result:
<div id="log" style="height: 200px; width: 300px; overflow: auto;" class="ui-widget-content"></div>
</div>