gpt4 book ai didi

python - Flask-WTF SelectMultipleField 使用数据库 ID 而不是名称填充

转载 作者:行者123 更新时间:2023-12-01 01:46:50 24 4
gpt4 key购买 nike

我想以此作为序言,英语不是我的母语,如果我的任何解释含糊或没有意义,请告诉我,我会尽力使它们更清晰。

我在使用 Flask-WTF 中的正确数据填充 SelectMultipleField 时遇到问题。正如下面的代码所示,我将用户对象传递给表单。这可以完美地工作,因为它在渲染页面时填充了所有字段。我遇到的问题是 SelectMultipleField 填充的是角色 ID,而不是角色名称。

在表单部分中,我生成一个列表,选项,其中包含应显示的所有可用选项。我可以将其反转为 choices.append((role.id, role.name)),它将用名称而不是 ID 填充字段。但是,如果我这样做,分配给用户对象(从数据库)的角色将不会显示为预选。

如何才能使该字段预填充名称而不是 ID,并保持预先选择分配的角色?

任何正确方向的指导或插入都将不胜感激。如果缺少任何我不想添加的信息,请告诉我,我会添加。

# Models
class Role(db.Document, RoleMixin):
meta = {'collection': 'role'}
name = db.StringField(max_length=80, unique=True)
description = db.StringField(max_length=255)

def __repr__(self):
return '<Role {}>'.format(self.name)

def __str__(self):
return self.name

class User(db.Document, UserMixin):
meta = {'collection': 'User'}
first_name = db.StringField(max_length=30)
last_name = db.StringField(max_length=30)
email = db.StringField(max_length=120)
password_hash = db.StringField(max_length=255)
active = db.BooleanField(default=True)
roles = db.ListField(db.ReferenceField(Role), default=[])

def __repr__(self):
return '<User {}>'.format(self.email)

def __str__(self):
return self.email

# Forms
class EditUserForm(FlaskForm):
choices = []
for role in Role.objects:
choices.append((role.name, role.id))

first_name = StringField('First name', validators=[DataRequired()])
last_name = StringField('Last name', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password')
password2 = PasswordField('Repeat password', validators=[EqualTo('password')])
roles = SelectMultipleField('User roles', choices=choices)
submit = SubmitField('Save')

# Routes
@app.route('/users/edit/<id>', methods=['GET', 'POST'])
@roles_required('admin')
def edit_user(id):
user = User.objects(id=id).first()
form = EditUserForm(obj=user)

if form.validate_on_submit() and request.method == 'POST':
user.first_name=form.first_name.data
user.last_name=form.last_name.data
user.email=form.email.data
user.roles = []

for role in form.roles.data:
r = Role.objects(name=role).first()
user.set_role(r.id)

if form.password.data:
user.set_password(form.password.data)

user.save()
return redirect(url_for('users'))

return render_template('edit_user.html', title='Edit user', user=user, form=form)

模板:

{% extends "layout.html" %}
{% set active_page = "edit_user" %}
{% block jumbotron %}

<h1>{{ title }}</h1>
<form action="" method="post">
{{ form.hidden_tag() }}
<p>
{{ form.first_name.label }}<br>
{{ form.first_name(size=32) }}<br>
{% for error in form.first_name.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>
{{ form.last_name.label }}<br>
{{ form.last_name(size=32) }}<br>
{% for error in form.last_name.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>
{{ form.email.label }}<br>
{{ form.email(size=32) }}<br>
{% for error in form.email.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>
{{ form.password.label }}<br>
{{ form.password(size=32) }}<br>
{% for error in form.password.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>
{{ form.password2.label }}<br>
{{ form.password2(size=32) }}<br>
{% for error in form.password2.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>
{{ form.roles.label }}<br>
{{ form.roles(size=32) }}<br>
{% for error in form.roles.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</p>
<p>{{ form.submit() }}</p>
</form>

{% endblock %}

我尝试使用下面的代码创建自己的对象以传递给表单,但是我没有成功。将该对象传递到表单时,没有填充任何字段。

user = User.objects(id=id).first()
temps = []

u = user.to_mongo()
u['_id'] = {'$oid': str(u['_id'])}
temp_roles = []
for role in user.roles:
r = role.to_mongo()
r['_id'] = {'$oid': str(r['_id'])}
temp_roles.append(r)

u['roles'] = temp_roles

最佳答案

我认为 PRMoureu 是对的。

你可以choices.append((role.name, role.name))

仅供引用。

SelectField的选择是一个元组(value, label)对的列表,请看这个link了解更多详情。

Select fields keep a choices property which is a sequence of (value, label) pairs. The value portion can be any type in theory, but as form data is sent by the browser as strings, you will need to provide a function which can coerce the string representation back to a comparable object.

如果您使用 (id, name),则默认强制unicodeint

关于python - Flask-WTF SelectMultipleField 使用数据库 ID 而不是名称填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51231808/

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