如何将数据库中的特定值显示为第一个下拉列表选择选项

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 管理员显示/隐藏字段

如何将下拉选择框列表中用户选择的选项的值存储到 mysql 数据库中?

在下拉列表中选择特定值时如何在联系表单 7 中启用字段