python - flask 中的多选字段

标签 python flask

我正在尝试使用多选字段通过 flask 将数据从左向右移动。我可以轻松地从左向右显示和移动数据,但是当我提交表单时,我收到错误消息,指出该字段没有有效的选择。

我做得很好吗?还有另一种方法吗?

这是我的代码:

表单.py:

class MigrateUsersForm(FlaskForm):
    multiselect = SelectMultipleField("Utilisateurs des anciennes campagne")
    multiselect_to = SelectMultipleField("Utilisateurs de la campagne en cours")
    submit = SubmitField('Valider')

    def __init__(self, *args, **kwargs):
        super(MigrateUsersForm, self).__init__(*args, **kwargs)
        self.multiselect.choices = [(s.id, s.nom_agent+" "+s.prenoms_agent) for s in (User.query.filter(User.id!=current_user.id, User.id.in_(db.session.query(Users_Campagne.users_id).join(Campagnes).filter(Users_Campagne.campagne_id==Campagnes.campagne_id, Campagnes.isActive==0))).order_by(User.nom_agent).all())]
        self.multiselect_to.choices = [(s.id, s.nom_agent+" "+s.prenoms_agent) for s in (User.query.filter(User.id!=current_user.id, User.id.in_(db.session.query(Users_Campagne.users_id).join(Campagnes).filter(Users_Campagne.campagne_id==Campagnes.campagne_id, Campagnes.isActive==1))).order_by(User.nom_agent).all())]

模板.html:

<form action="" method="post" class="" autocomplete="off">
                    {{ form.csrf_token }}
                        <div class="row">
                            <div class="col-xs-5 col-md-5 col-sm-5">
                                <div class="form-group ">
                                    <label for="multiselect" class="col-form-label">Anciens utilisateurs *</label>
                                    {{ form.multiselect(size=10, class='form-control',  multiple="multiple") }}
                                    <span style="color: #f00"> {% if form.multiselect.errors %}{{ form.multiselect.errors[0] }}{% endif %}</span>
                                </div>
                            </div>
                            <div class="col-xs-2 col-md-2 col-sm-2" style="padding-top: 7%;">
                                <button type="button" id="multiselect_rightAll" class="btn btn-block"><span class="icon-forward3"></span></button>
                                <button type="button" id="multiselect_rightSelected" class="btn btn-block"><span class="icon-cheveron-right"></span></button>
                                <button type="button" id="multiselect_leftSelected" class="btn btn-block"><span class="icon-cheveron-left"></span></button>
                                <button type="button" id="multiselect_leftAll" class="btn btn-block"><span class="icon-backward2"></span></button>
                            </div>
                            <div class="col-xs-5 col-md-5 col-sm-5">
                                <div class="form-group ">
                                    <label for="multiselect_to" class="col-form-label">Nouveau utilisateurs *</label>
                                    {{ form.multiselect_to(size=10, class='form-control',  multiple="multiple") }}
                                    <span style="color: #f00"> {% if form.multiselect_to.errors %}{{ form.multiselect_to.errors[0] }}{% endif %}</span>
                                </div>
                            </div>
                        </div>
                        <div class="text-right">
                           <button type="submit" class="btn btn-primary">Valider</button>
                        </div>
                    </form>

View .py

@login_required
def migrate_users():
    form = MigrateUsersForm()
    if request.method == "POST" and form.validate_on_submit():
        print("Here am i")
        '''multiselect = ', '.join(form.multiselect.data)
        multiselect_to = ', '.join(form.multiselect_to.data)
        print(multiselect)
        print(multiselect_to)'''
    return render_template('admin/migrate_users.html', form=form)

这是模板的显示方式 Template on load

当我从左到右选择元素时,我有这个 When I moves elements from left to right

当我点击验证时,这是我面临的错误 Error I face

最佳答案

我已经替换了self.multiselect.choicesself.multiselect_to.choices具有固定的值列表,可以获取提交的POST中选定的多个值请求。

目录结构:

├── multi_select_app.py
├── multi_select_form.py
└── templates
    └── multi_select.html

multi_select_app.py :

from flask import Flask, request, render_template, jsonify
from multi_select_form import MigrateUsersForm

app = Flask(__name__)
# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/migrate', methods = ["GET", "POST"])
def migrate_users():
    form = MigrateUsersForm()
    if request.method == "POST" and form.validate_on_submit():
        multiselect = ', '.join(form.multiselect.data)
        multiselect_to = ', '.join(form.multiselect_to.data)
        posted_data = {
            "multiselect": multiselect,
            "multiselect_to": multiselect_to
        }
        return jsonify(posted_data)
    return render_template('multi_select.html', form=form)

multi_select_form.py :

from flask_wtf import FlaskForm
from wtforms import SelectMultipleField, SubmitField

class MigrateUsersForm(FlaskForm):
    multiselect = SelectMultipleField("Utilisateurs des anciennes campagne")
    multiselect_to = SelectMultipleField("Utilisateurs de la campagne en cours")
    submit = SubmitField('Valider')


    def __init__(self, *args, **kwargs):
        super(MigrateUsersForm, self).__init__(*args, **kwargs)
        self.multiselect.choices = [("py", "python"), ("rb", "ruby"), ("js", "javascript")]
        self.multiselect_to.choices = [("py", "python"), ("rb", "ruby"), ("js", "javascript")]

templates\multi_select.html :

<form action="" method="post" class="" autocomplete="off">
  {{ form.csrf_token }}
  <div class="row">
    <div class="col-xs-5 col-md-5 col-sm-5">
      <div class="form-group ">
        <label for="multiselect" class="col-form-label">Anciens utilisateurs *</label>
        {{ form.multiselect(size=10, class='form-control',  multiple="multiple") }}
        <span style="color: #f00"> {% if form.multiselect.errors %}{{ form.multiselect.errors[0] }}{% endif %}</span>
      </div>
    </div>
    <div class="col-xs-2 col-md-2 col-sm-2" style="padding-top: 7%;">
      <button type="button" id="multiselect_rightAll" class="btn btn-block"><span class="icon-forward3"></span></button>
      <button type="button" id="multiselect_rightSelected" class="btn btn-block"><span class="icon-cheveron-right"></span></button>
      <button type="button" id="multiselect_leftSelected" class="btn btn-block"><span class="icon-cheveron-left"></span></button>
      <button type="button" id="multiselect_leftAll" class="btn btn-block"><span class="icon-backward2"></span></button>
    </div>
    <div class="col-xs-5 col-md-5 col-sm-5">
      <div class="form-group ">
        <label for="multiselect_to" class="col-form-label">Nouveau utilisateurs *</label>
        {{ form.multiselect_to(size=10, class='form-control',  multiple="multiple") }}
        <span style="color: #f00"> {% if form.multiselect_to.errors %}{{ form.multiselect_to.errors[0] }}{% endif %}</span>
      </div>
    </div>
  </div>
  <div class="text-right">
    <button type="submit" class="btn btn-primary">Valider</button>
  </div>
</form>

requirements.txt (已安装的软件包):

aniso8601==6.0.0
Click==7.0
Flask==1.0.2
Flask-Cors==3.0.7
Flask-REST-JSONAPI==0.26.0
Flask-RESTful==0.3.7
Flask-WTF==0.14.2
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.1
marshmallow==2.18.0
marshmallow-jsonapi==0.21.0
pytz==2018.9
six==1.12.0
SQLAlchemy==1.3.2
Werkzeug==0.15.0
WTForms==2.2.1

运行应用程序:

export FLASK_ENV=development
export FLASK_APP=multi_select_app.py
flask run

输出:

多选输入表单(缺少 CSS 文件,因此样式损坏):

input form

点击提交按钮后提交的值:

submitted values

正如您所看到的,我们在表单提交后获得了正确的多个选定值。 请查看self.multiselect.choicesself.multiselect_to.choices __init__ 中的值方法MigrateUsersForm表格。

更新: 我认为s.id是一个整数字段。当您提交表单时,它将被视为字符串字段。设置coerce=intSelectMultipleField 。 替换两者:

  • multiselect = SelectMultipleField("Utilisateurs des anciennes campagne")multiselect = SelectMultipleField("Utilisateurs des anciennes campagne", coerce=int)
  • multiselect_to = SelectMultipleField("Utilisateurs de la campagne en cours")multiselect_to = SelectMultipleField("Utilisateurs de la campagne en cours", coerce=int)

引用: -SelectMultipleField Documentation

关于python - flask 中的多选字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56573472/

相关文章:

python - 如何让 Pylance 理解 Pydantic 的 `allow_population_by_field_name` 初始化器?

python - 在 SciPy 中多核上运行 SVM 代码?

python - 如何避免 Pandas.Merge 上出现多列

python - 在根路径中获取最新目录

python - 从 fastapi 响应中删除默认的 `application/json` header

sql - 定义 backref 参数

javascript - Flask - 使用 javascript 在等待任务完成时显示加载页面

python Flask部分更新网页

python - jinja2蓝图路线错误

python - 如何在配置文件中设置 FLASK_ENV?