gpt4 book ai didi

python - Flask/WTForms/QuerySelectField - 使用基于现有数据库值选择的选项呈现 QuerySelectField

转载 作者:太空狗 更新时间:2023-10-29 23:57:55 25 4
gpt4 key购买 nike

我正在构建一个包含配置文件管理页面的简单 CMS。在此配置文件页面上,连同其他字段,存在一个下拉列表,我使用 wtforms 扩展的 QuerySelectField 从表“parks”生成:

from wtforms.ext.sqlalchemy.fields import QuerySelectField

个人资料页面上的其余字段由“用户”表填充。

假设用户已经登录,并且他们在“用户”表中的记录已经填充。 “user”表中的字段是“parks”表中值的外键:“park_id”。

当登录用户导航到他们的个人资料页面时,我想在下拉列表中显示与该用户的 park_id 外键值相对应的选择。

请注意,Flask/Python 等对我来说非常是新的。此外,我正在使用 Flask-Security,下面的用户模型基于他们的示例。也许我需要与用户/公园建立另一种关系?

显示用户保存的个人资料信息,包括可能出现在下拉列表中以供编辑的信息对我来说似乎非常基础。我担心我错过了一些基本的东西。到目前为止,关于 SO 和其他地方的其他类似问题/答案似乎让我非常困惑。

我的用户模型:

# 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))

我的个人资料表格(带有 query_factory 的东西)

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')])

我的 profile_page View :

@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 %}

感谢您对所有这一切的帮助。

最佳答案

在喝了几杯啤酒并在这篇文章中担任主角后:SQLAlchemy/WTForms: set default selected value for QuerySelectField直到我的眼睛交叉,我发现我需要将一个结果对象从查询传递到我的 parks 表,该表由当前用户的 id 过滤。

一个特殊的细节是,我必须从当前用户的查询结果中手动分配每个字段值(除了 QuerySelectField、parks)。这是因为,在我的例子中,简单地将 current_user 结果传递给“obj=”arg 会覆盖我的 QuerySelectField 关键字(在我的例子中是“park_id”),因为“obj=current_user”赋值已经包含它自己的 park_id 参数实例,尽管无法在我的下拉列表中显示默认选择。

所以...解决方法是按如下方式更新我的 profile_page View 函数:

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com