I have problems with QuerySelectFileds in Flask:
class User(db.Model):
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(64), unique = True)
clearname = db.Column(db.String(254))
password = db.Column(db.String(254))
role = db.Column(db.Integer)
def __init__(self, username, clearname, password, role):
self.username = username
self.clearname = clearname
self.password = password
self.role = role
def __repr__(self):
return 'Benutzer %r' % self.username
def get_User():
return db.session.query(User.username).all()
class f1(Form):
us = QuerySelectField(u'hello', query_factory = get_User())
I do see my Users ('Admin' and 'test1'), but not in a select field. All I get is:
<UnboundField(QuerySelectField, (u'hello',), {'query_factory': [(u'Admin',), (u'test1',)]})>
How do I create a QuerySelectField properly?
Can anyone help?
Thanks!
Edit 2014-08-18: The View contains:
return render_template('login.html',
title = 'Sign In',
form = form)
Edit 2014-08-18:
First of all: Thanks for your replys!
Meanwhile I had a little bit Success - here is the code (It's based on the Flask Mega-Tutorial):
run.py:
#!env/bin/python
from app import app
app.run(debug = True)
app/ init .py:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
from app import views, models
app/models.py:
from app import db
ROLE_USER = 100
ROLE_ADMIN = 0
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(64), index = True, unique = True)
clearname = db.Column(db.String(64))
password = db.Column(db.String(256))
role = db.Column(db.SmallInteger, default = ROLE_USER)
def __repr__(self):
return '<User %r>' % (self.username)
def get_User():
return User.query
app/forms.py:
from flask.ext.wtf import Form
from wtforms import TextField, BooleanField
from wtforms.validators import Required
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from .models import get_User
class LoginForm(Form):
openid = TextField('openid', validators = [Required()])
remember_me = BooleanField('remember_me', default = False)
user = QuerySelectField(u'User', query_factory=get_User)
app/views.py:
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm
@app.route('/')
@app.route('/index')
def index():
return "Hello, World!"
@app.route('/login')
def login():
form = LoginForm()
return render_template('login.html', title='Eingloggen!', form=form)
app/templates/login.html:
<!-- extend from base layout -->
{% extends "base.html" %}
{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">
{{form.hidden_tag()}}
<p>
Please enter your OpenID:<br>
{{form.openid(size=80)}}<br>
</p>
<p>{{form.remember_me}} Remember Me</p>
<p>{{form.user}} The QuerySelectField :-)</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}
Now the QuerySelectField appears with the __repr__
of my class User:
----------------
| <User 'test1'> |
| <User 'Admin'> |
----------------
select id="user" name="user"><option value="1"><User 'test1'></option><option value="2"><User 'Admin'></option></select>
But how can I do a query like select * from username
and have the usernames test1 and Admin in the selectField without changing the __repr__
?
For maybe another query may be select * from role
and I'd like to have functions like get_User(), get_Roles()... Is it a good idea to put such functions in the class User
itself?
just leave the () off the last line from get_user
def get_User():
return db.session.query(User.username).all # <----
The query_factory callback should return complete entities, in your case books, not book ids. I believe the QuerySelectField must be trying to use the results of the query as if they are mapped objects but the ids (returned as KeyedTuple instances) are not.
I think this is the correct way to code the callback function:
def get_User():
return User.query
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.