我正在建立一个简单的CMS,其中包括一个配置文件管理页面。在这个配置文件页上,与其他字段一起,存在一个下拉列表,我从WestFrofes扩展的QuerySelectField中从表“PACK”中生成:

from wtforms.ext.sqlalchemy.fields import QuerySelectField

profile页面上的其余字段由“user”表填充。
假设用户已经登录,并且他们在“user”表中的记录已经填充。“user”表中的字段中有一个外键,用于“parks”表中的值:“park\u id”。
当登录用户导航到其配置文件页时,我想在下拉列表中显示与此用户的park_id外键值相对应的选择。
注意flask/python等人对我来说是非常新的。另外,我正在使用flask security,下面的用户模型是基于他们的示例的。或许我需要与用户/公园建立另一种关系?
显示用户保存的配置文件信息,包括可能出现在下拉列表中以供编辑的信息,这对我来说是非常基本的。我担心我错过了一些基本的东西。到目前为止,其他类似的问题/答案对我来说似乎非常混乱。
我的用户模型:
# Define models
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)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))
    park_id = db.Column(db.Integer)
    weather_zip = db.Column(db.String(255))
    flickr_api_key = db.Column(db.String(255))
    flickr_api_secret = db.Column(db.String(255))
    flickr_user_id = db.Column(db.String(255))
    flickr_photo_set_id = db.Column(db.String(255))

我的公园模型:
class Parks(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    park = db.Column(db.String(255))

我的个人资料表(带查询工厂的东西)
def get_parks():
    return Parks.query

class ProfileForm(Form):
    id = HiddenField()
    email = HiddenField()
    park_id = QuerySelectField('Park',[validators.InputRequired(u'Please select a park')], default=19, query_factory=get_parks, get_label='park', allow_blank=True)
    weather_zip = StringField('Zip Code',[validators.Length(min=5, max=5, message=u'Zip must contain 5 numbers'), validators.InputRequired(u'please enter a 5-digit zip code')])
    flickr_api_key = StringField('Flickr API Key', [validators.InputRequired(u'Please supply a Flickr API key')])
    flickr_api_secret = StringField('Flickr API Secret', [validators.InputRequired(u'Please supply a Flickr API secret')])
    flickr_user_id = StringField('Flickr User ID', [validators.InputRequired(u'Please supply a Flickr user id')])
    flickr_set_id = StringField('Flickr Set ID', [validators.InputRequired(u'Please supply a Flickr set id')])

我的个人资料页面视图:
@app.route('/profile/<id>', methods=["GET","POST"])
@login_required
def profile_page(id):

    id = id
    current_user = User.query.filter_by(id=id).first()

    form = ProfileForm(obj=current_user)

    return render_template("profile.html", form=form)

我的模板表单:
    {% from "_formhelpers.html" import render_field %}
    <form method=post action="/profile">
      <dl>
        {{ form.id(value=current_user.id) }}
        {{ form.email(value=current_user.email) }}
        {{ render_field(form.park_id) }}
        {{ render_field(form.weather_zip) }}
        {{ render_field(form.flickr_api_key) }}
        {{ render_field(form.flickr_api_secret) }}
        {{ render_field(form.flickr_user_id) }}
        {{ render_field(form.flickr_set_id) }}
      </dl>
      <p><input type=submit value=Register>
    </form>

一个宏来渲染字段(可能是相关的?):
{% macro render_field(field) %}
    <dt>{{ field.label }}
    <dd>{{ field(**kwargs) |safe }}
    {% if field.errors %}
        <ul class=errors>
        {% for error in field.errors %}
            <li>{{ error }}</li>
        {% endfor %}
        </ul>
    {% endif %}
    </dd>
{% endmacro %}

谢谢你的帮助。

最佳答案

在喝了一杯啤酒之后,在这篇文章中主演:“AA>直到我的眼睛交叉,我发现我需要把一个结果对象从一个查询传递到我的PACK表,这个表是由当前用户的ID过滤的。
一个特殊的细节是,我必须从当前用户的查询结果中手动分配每个字段值(除了queryselectfield,parks)。这是因为,在我的例子中,简单地将CurrnSube用户结果传递给“Obj=”ARG将重写我的QueRelieltFieldEngy(在我的例子中是“PARKSID”),因为“Obj= CurrnGueAuthor”赋值已经包含了它自己的PARKYID参数的实例,尽管在我的下拉中显示缺省选择不起作用。
所以…修复方法是更新我的配置文件页面查看功能,如下所示:

@app.route('/profile/<id>', methods=["GET","POST"])
@login_required
def profile_page(id):

    id = id
    current_user = User.query.filter_by(id=id).first()
    park = Parks.query.filter_by(id=current_user.park_id).first()
    form = ProfileForm(park_id=park, # this is the main thing
                       weather_zip=current_user.weather_zip,
                       flickr_api_key=current_user.flickr_api_key,
                       flickr_api_secret=current_user.flickr_api_secret,
                       flickr_user_id=current_user.flickr_user_id,
                       flickr_photo_set_id=current_user.flickr_photo_set_id)

    return render_template("profile.html", form=form)

关于python - Flask/WTForms/QuerySelectField-使用基于现有数据库值选择的选项来呈现QuerySelectField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36851172/

10-12 20:27