Flask 烧瓶/WTForms中的动态表格(表格集)?
在Django中,您有一个名为formset的多表单功能,可以使用它在同一模板中创建多个表单。我试图在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 %}
<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">