简体   繁体   English

烧瓶UnboundField QuerySelectField

[英]Flask UnboundField QuerySelectField

I have problems with QuerySelectFileds in Flask: 我在Flask中使用QuerySelectFileds遇到问题:

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. 我的确看到了我的用户(“ Admin”和“ test1”),但未在选择字段中看到。 All I get is: 我得到的是:

<UnboundField(QuerySelectField, (u'hello',), {'query_factory': [(u'Admin',), (u'test1',)]})> 

How do I create a QuerySelectField properly? 如何正确创建QuerySelectField?

Can anyone help? 有人可以帮忙吗?

Thanks! 谢谢!

Edit 2014-08-18: The View contains: 编辑2014-08-18:该视图包含:

   return render_template('login.html', 
        title = 'Sign In',
        form = form)

Edit 2014-08-18: 编辑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): 同时,我获得了一些成功-这是代码(基于Flask Mega-Tutorial):

run.py: run.py:

#!env/bin/python
from app import app
app.run(debug = True)

app/ init .py: 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: 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: 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: 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: 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: 现在QuerySelectField出现与__repr__我的类用户的:

 ----------------
| <User 'test1'> |
| <User 'Admin'> |
 ----------------
select id="user" name="user"><option value="1">&lt;User 'test1'&gt;</option><option value="2">&lt;User 'Admin'&gt;</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__ ? 但是,我该怎么办查询像select * from username ,并有在selectField用户名TEST1和管理员在不改变__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? 例如,也许可以select * from role另一个查询select * from role而我想拥有诸如get_User(),get_Roles()之class User函数。将此类函数放入class User本身是个好主意吗?

just leave the () off the last line from get_user 只需将()保留在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. 在您的案例书中,query_factory回调应返回完整的实体,而不是书的ID。 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. 我相信QuerySelectField必须尝试使用​​查询结果,就好像它们是映射对象一样,而id(返回为KeyedTuple实例)不是。

I think this is the correct way to code the callback function: 我认为这是编写回调函数的正确方法:

def get_User():
    return User.query

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM