Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶中的多个选择字段_Python_Flask - Fatal编程技术网

Python 烧瓶中的多个选择字段

Python 烧瓶中的多个选择字段,python,flask,Python,Flask,我尝试使用multiselectfield使用flask从左向右移动数据。我可以很容易地从左到右显示和移动数据,但当我提交表单时,我会错误地说字段没有有效的选项 我是否做得很好?还有别的办法吗 这是我的代码: forms.py: class MigrateUsersForm(烧瓶形式): multiselect=选择多个字段(“利用旧营地”) multiselect_to=选择多个场地(“利用坎帕涅公园”) submit=SubmitField('Valider') 定义初始化(self,*ar

我尝试使用multiselectfield使用flask从左向右移动数据。我可以很容易地从左到右显示和移动数据,但当我提交表单时,我会错误地说字段没有有效的选项

我是否做得很好?还有别的办法吗

这是我的代码:

forms.py:

class MigrateUsersForm(烧瓶形式):
multiselect=选择多个字段(“利用旧营地”)
multiselect_to=选择多个场地(“利用坎帕涅公园”)
submit=SubmitField('Valider')
定义初始化(self,*args,**kwargs):
super(MigrateUsersForm,self)。\uuuuuu初始化(*args,**kwargs)
self.multiselect.choices=[(s.id,s.nom_agent+“”+s.prenoms_agent)for s in(User.query.filter(User.id!=当前用户id,User.id.in_u(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\u to.choices=[(s.id,s.nom\u agent+“”+s.prenoms\u agent)for s in(User.query.filter(User.id!=当前用户id,User.id.in(db.session.query(Users\u Campagne.Users\u id).join(Campagnes.filter(Users\u Campagne.Campagne\u id==Campagnes.isActive==1))).order\u by(User.nom\u agent.all())]
template.html:


{{form.csrf_token}
古人*
{form.multiselect(size=10,class='form-control',multiple=“multiple”)}
{%if-form.multiselect.errors%}{{form.multiselect.errors[0]}{%endif%}
暴发户*
{{form.multiselect_to(size=10,class='form-control',multiple=“multiple”)}
{%if form.multiselect_to.errors%}{{form.multiselect_to.errors[0]}{%endif%}
瓦利德
views.py

@需要登录\u
def migrate_users():
form=MigrateUsersForm()
如果request.method==“POST”和form.validate\u on\u submit():
打印(“我在这里”)
''multiselect=','.join(form.multiselect.data)
multiselect_to=','.join(form.multiselect_to.data)
打印(多选)
打印(多选)“”
返回呈现模板('admin/migrate\u users.html',form=form)
这是模板的显示方式

当我从左到右选择元素时,我有

当我点击validate时,这就是我面临的错误

我已经用固定的值列表替换了
self.multiselect.choices
self.multiselect\u to.choices
,并且可以在提交的
POST
请求中获取所选的多个值

目录结构:

├── multi_select_app.py
├── multi_select_form.py
└── templates
    └── multi_select.html
multi\u select\u 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)
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")]
multi\u select\u form.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)
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")]
模板\multi\u 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>
运行应用程序:

export FLASK_ENV=development
export FLASK_APP=multi_select_app.py
flask run
输出:

多选输入表单(缺少CSS文件,因此样式不正确):

单击“提交”按钮后提交的值:

如您所见,我们在表单提交后获得了正确的多个选定值。 请检查
MigrateUsersForm
表单的
\uuuuuuuuu
方法中的
self.multiselect.choices
self.multiselect.to.choices

更新:
我认为
s.id
是一个整数字段。提交表单时,它将被视为字符串字段。在
选择MultipleField
中设置
强制=int
。 替换两个:

  • multiselect=SelectMultipleField(“Usiliateurs des Ancienes campagne”)
    with
    multiselect=SelectMultipleField(“Usiliateurs des Ancienes campagne”,强制=int)
  • multiselect\u to=SelectMultipleField(“课程利用率”)
    with
    multiselect\u to=SelectMultipleField(“课程利用率”),强制=int)
参考资料:
-

包括您提交表单的路线的必要代码。我添加了路线代码@arshoMaybe,因为我没有正确解释我的问题。左选择字段有值,右选择字段为空。我想使用按钮从左到右或从右到左获取元素。当一个元素移动到另一侧时,它将从它所在的列表中删除。您可以使用JavaScript/jQuery将值从一个列表移动到另一个列表。使用
SelectMultipleField
时,需要先选择值,然后再单击
Valider
按钮。我使用jQuery将值从列表移动到另一个列表。看看我第一篇帖子上的图片。也许你会更明白我想做什么。我认为
s.id
是一个整数字段。查看答案中的更新。最后,我使用
jquerymultiselect插件解决了我的问题