如何将数据库中的特定值显示为第一个下拉列表选择选项
Posted
技术标签:
【中文标题】如何将数据库中的特定值显示为第一个下拉列表选择选项【英文标题】:How to display a specific value from a database as the first drop-down list selection option 【发布时间】:2022-01-23 23:22:55 【问题描述】:我有一个应用程序,它接收用户数据,将其保存到数据库中,然后允许用户编辑该数据。我有一个使用下拉列表填充的变量。当用户去编辑数据时,我希望他们从数据库中的选择显示在下拉列表的顶部。例如,如果他们为公司“CoolCompany”创建了一个新用户(Jane Smith)并且现在正在编辑 Jane Smith,我希望它显示“CoolCompany”作为第一个下拉列表选择。目前它按字母顺序显示列表(“AwesomeCompany”)。我怀疑这是因为我的 AddUserForm 的设置方式。我可以在我看来调整它吗?我们列出了足够多的公司,因此在用户添加数据时需要保持字母顺序。
型号:
from location import db
from location.folders.models import Company
class ProductUsers(db.Model):
__table__ = db.Model.metadata.tables['product_users']
company = db.relationship('Company', foreign_keys='ProductUsers.prod_id')
def __init__(self, first_nm, last_nm, prod_id):
self.first_nm = first_nm
self.last_nm = last_nm
self.prod_id = prod_id
def get_id(self):
return int(self.prod_user_key)
表格:
from location.otherfolders.models import ProductUsers
from location.folders.models import Company
class AddUsersForm(FlaskForm):
company = SelectField(
'Company*',
validators=[DataRequired()],
choices=[(comp.prod_id, comp.comp_display_name) for comp in Company.query.filter(Company.member_status!=500).order_by('comp_display_name').all()])
first_nm = StringField('First Name*', validators=[DataRequired()])
last_nm = StringField('Last Name*', validators=[DataRequired()])
submit = SubmitField('Submit User')
class UpdateProductUserForm(AddUsersForm):
first_nm = StringField('First Name*', validators=[DataRequired()])
last_nm = StringField('Last Name*', validators=[DataRequired()])
disable = SubmitField('Deactivate')
更新用户的视图:
from location.otherfolders.models import ProductUsers
from location.folders.models import Company
from location.otherfolders.forms import AddUsersForm, UpdateProductUserForm
approvals = Blueprint('approvals', __name__)
@approvals.route('/productapproval/addproductUser/<int:prod_user_key>', methods=['GET', 'POST'])
def edit_product_users(prod_user_key):
productUser = ProductUsers.query.get_or_404(prod_user_key)
form = UpdateProductUserForm()
if form.validate_on_submit():
productUser = ProductUsers.query.filter_by(prod_user_key=prod_user_key).first()
productUser.org_id = form.company.data
productUser.first_nm = form.first_nm.data
productUser.last_nm = form.last_nm.data
db.session.commit()
flash('User Account Updated', 'success')
return redirect(url_for('approvals.users', prod_user_key=prod_user_key))
form.company.data = productUser.prod_id
form.first_nm.data = productUser.first_nm
form.last_nm.data = productUser.last_nm
return render_template('/productapproval/addusers.html', form=form)
模板:
% extends "base.html" %
% block form_content %
<form class="form form-horizontal" method="POST">
form.hidden_tag()
<div class="form-group row">
form.company.label(class="col-sm-3 col-form-label font-weight-bold")
<div class="col-sm-9">
form.company(class="listStyleComp")
</div>
</div>
<div class="form-group row">
form.first_nm.label(class="col-sm-3 col-form-label font-weight-bold")
<div class="col-sm-9">
form.first_nm(class="form-control sm-text listStyleComp", placeholder="First Name")
</div>
</div>
<div class="form-group row">
form.last_nm.label(class="col-sm-3 col-form-label font-weight-bold")
<div class="col-sm-9">
form.last_nm(class="form-control sm-text listStyleComp", placeholder="Last Name")
</div>
</div>
<!-- BUTTONS -->
<div class="form-group row">
<div class="col-sm-10">
form.submit(class="btn btn-success")
</div>
</div>
</form>
% endblock %
【问题讨论】:
【参考方案1】:首先,我认为您缺少 UpdateProductUserForm
中的 company
字段。
在其中添加:
class UpdateProductUserForm(AddUsersForm):
first_nm = StringField('First Name*', validators=[DataRequired()])
last_nm = StringField('Last Name*', validators=[DataRequired()])
company = SelectField('Company*', validators=[DataRequired()], choices=[])
disable = SubmitField('Deactivate')
请注意,我们将其定义为一个空列表。然后我们在视图中随心所欲地更新它:
@approvals.route('/productapproval/addproductUser/<int:prod_user_key>', methods=['GET', 'POST'])
def edit_product_users(prod_user_key):
productUser = ProductUsers.query.get_or_404(prod_user_key)
# get all the companies
companies = [comp.prod_id for comp in Company.query.filter(Company.member_status!=500).all()]
# move current company item to start of list
current_company_index = companies.index(productUser.prod_id)
companies.insert(0, companies.pop(current_company_index))
form = UpdateProductUserForm()
form.company.choices = companies
form.first_nm.data = productUser.first_nm
form.last_nm.data = productUser.last_nm
if form.validate_on_submit():
productUser.org_id = form.company.data
productUser.first_nm = form.first_nm.data
productUser.last_nm = form.last_nm.data
db.session.add(productUser)
db.session.commit()
flash('User Account Updated', 'success')
return redirect(url_for('approvals.users', prod_user_key=prod_user_key))
return render_template('/productapproval/addusers.html', form=form)
我注意到您两次获取用户。你不需要这样做。此外,您没有正确地将更新的用户添加到数据库会话中。我已经在上面的代码中修复了这些东西。
【讨论】:
以上是关于如何将数据库中的特定值显示为第一个下拉列表选择选项的主要内容,如果未能解决你的问题,请参考以下文章
如果在下拉列表中选择了特定值,则 Django 管理员显示/隐藏字段