Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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
Flask 烧瓶/WTForms中的动态表格(表格集)?_Flask_Wtforms_Flask Wtforms - Fatal编程技术网

Flask 烧瓶/WTForms中的动态表格(表格集)?

Flask 烧瓶/WTForms中的动态表格(表格集)?,flask,wtforms,flask-wtforms,Flask,Wtforms,Flask Wtforms,在Django中,您有一个名为formset的多表单功能,可以使用它在同一模板中创建多个表单。我试图在Flask/WTforms中实现类似的功能 <form action="{{ url_for('request-accept') }}" method='post'> <table> <tbody> {% for request in requests %}

在Django中,您有一个名为formset的多表单功能,可以使用它在同一模板中创建多个表单。我试图在Flask/WTforms中实现类似的功能

<form action="{{ url_for('request-accept') }}" method='post'>           
   <table>
        <tbody>
            {% for request in requests %}
                    <tr>                    
                        <td>                        
                           <div class="person-header">
                              <img src="{{request.profile_pic_url}}" class="img-circle profile-image"/>
                              <p class="person-header-text">{{request.fullname()}}</p>    
                           </div>
                       </td>                
                       <td>
                           <input type="checkbox" id="{{request.key.urlsafe()}}" name="checkbox{{loop.index}}">
                       </td>                    
                   </tr>
           {% endfor %}
    </tbody>            
  </table>

  <input class='submit btn btn-primary' type=submit value="Connect">            
</form>

{请求%中的请求为%}

{{request.fullname()}}

{%endfor%}
其想法是使用一个表单包装所有复选框,用户喜欢勾选这些复选框以与之成为朋友。目前,我并没有在Flask中生成任何表单类,因为我不知道如何创建动态表单集,因此我在html中动态创建表单

但需要注意的是,我不知道如何通过复选框检索所选的
用户id
。(我已将其存储在
id
中,因为我不太清楚)

但是我无法访问
request.values['checkbox1']
中的id。我只能看到它的
是打开的
还是关闭的


有什么建议可以解决这个问题吗

我个人会在每个复选框下的字段集中添加一个
隐藏的
输入字段,其名称如“friend_nametag1”和一个对应于朋友ID的值。每个“friend”都会增加1。因此,您可以在flask视图中使用

friend_list = []
list_of_checkboxes = ... (fetch from request.form... ?)
dict_of_friend_nametags = ... (build from request.form... ?)
if 'checkbox1' in list_of_checkboxes:
    friend_list.append(dict_of_friend_nametags.get('friend_nametag1')
显然,您可以使用某种逻辑来创建增量索引(本例中的“checkbox1”中的“1”)

我对WTForms不太熟悉,所以可能有更好的方法来实现这一点,但是这个解决方案非常简单,可以用您当前的代码实现

如果您需要字段集或表单集,我建议您将FormField与字段列表以及相关文档结合使用:

p、 美国:我不建议在模板或代码中使用
request
作为变量名,因为它可能会影响flask的全局
请求
?XD

问题 您的问题是
id
没有发送回服务器-只有
value
是。。。由于您的复选框没有
属性,因此使用了默认值,该值恰好是
on

既然你给这个贴上了标签,我就给你举个例子,说明你是如何做到这一点的

再也没有这个问题了 WTForms的文档具有以下功能:

您可以通过以下方式在自定义表单中使用此字段:

class FriendsForm(Form):
    potential_friends = MultiCheckboxField("Friends", coerce=int)

# ... later ...

@app.route("/add-friends", methods=["GET", "POST"])
def add_friends():
    form = FriendsForm(request.form)
    # lookup friends, for now we'll use a static list
    form.potential_friends.choices = [(1, "Sam"), (2, "Joe")]

    # We'll also need a mapping of IDs to Person instances
    # (Made up for this example - use your own ;-) )
    mapping = {
        1: Person("Sam", profile_pic="sam.jpg"),
        2: Person("Joe", profile_pic="joe.png")
    }

    if request.method == "POST":
        # Mark new friends

    return render_template("friends.html", form=form, persons=mapping)
然后,在
friends.html
中,您可以迭代
表单.potential\u friends
字段:

{% for person in form.potential_friends %}
    persons[person.data].profile_pic :: {{person.label}} :: {{person}}<br>
{% endfor %}

选择需要进入multicheckbox字段:将
form.choices=…
更改为
form.potential\u friends.choices=…
@stefanjunker-是的,这确实是一个输入错误-现在已修复!谢谢你帮我把问题做得更好!
{% for person in form.potential_friends %}
    persons[person.data].profile_pic :: {{person.label}} :: {{person}}<br>
{% endfor %}
sam.jpg :: <label>Sam</label> :: <input type="checkbox" value="1">
joe.png :: <label>Joe</label> :: <input type="checkbox" value="2">