我正在尝试在flask中输入应作为列表传递的标签列表,但是我无法弄清楚如何在flask中进行操作,也无法在{中找到添加字符串列表的文档{1}}。有人有经验吗?
理想情况下,输入标签后,我希望标签可以选择性地删除。这样您就可以输入。
到目前为止,我的表格是静态的。您输入内容,点击提交,它将被处理为flask_wtf
。标签列表是我不知道的最后一个元素。我什至不知道烧瓶能否做到这一点。
关于我如何设想进入过程的一些演示:
.json
[Tag1](x) | [Tag2](x)
Enter new Tag: [______] (add)
[Tag1](x) | [Tag2](x)
Enter new Tag: [Tag3__] (add)
[Tag1](x) | [Tag2](x) | [Tag3](x)
Enter new Tag: [______]
[Tag1](x) | [Tag2](x) | [Tag3](x)
删除操作可谓锦上添花,一旦我有了可以编辑的列表,就可以完成删除操作,但是到达那里似乎很困难。 我在这里茫然。
我基本上想知道一般是否可以输入列表,因为似乎没有关于该主题的文档。
答案 0 :(得分:1)
您的描述不是很清楚(Tag1
是JSON中的密钥还是Tag
是密钥,而1是索引?)
但是最近我遇到了类似的问题,我想用JSON提交基本的list
并让WTForms正确处理。
例如,这个:
{
"name": "John",
"tags": ["code", "python", "flask", "wtforms"]
}
因此,我不得不重写FieldList的工作方式,因为WTForms由于某种原因希望将list
用作"tags-1=XXX,tags-2=xxx"
。
from wtforms import FieldList
class JSONFieldList(FieldList):
def process(self, formdata, data=None):
self.entries = []
if data is None or not data:
try:
data = self.default()
except TypeError:
data = self.default
self.object_data = data
if formdata:
for (index, obj_data) in enumerate(formdata.getlist(self.name)):
self._add_entry(formdata, obj_data, index=index)
else:
for obj_data in data:
self._add_entry(formdata, obj_data)
while len(self.entries) < self.min_entries:
self._add_entry(formdata)
def _add_entry(self, formdata=None, data=None, index=None):
assert not self.max_entries or len(self.entries) < self.max_entries, \
'You cannot have more than max_entries entries in this FieldList'
if index is None:
index = self.last_index + 1
self.last_index = index
name = '%s-%d' % (self.short_name, index)
id = '%s-%d' % (self.id, index)
field = self.unbound_field.bind(form=None, name=name, id=id, prefix=self._prefix, _meta=self.meta,
translations=self._translations)
field.process(formdata, data)
self.entries.append(field)
return field
在Flask的一端处理表格:
from flask import request
from werkzeug.datastructures import ImmutableMultiDict
@app.route('/add', methods=['POST'])
def add():
form = MyForm(ImmutableMultiDict(request.get_json())
# process the form, form.tags.data is a list
和表格(注意使用JSONFieldList
):
class MonitorForm(BaseForm):
name = StringField(validators=[validators.DataRequired(), validators.Length(min=3, max=5)], filters=[lambda x: x or None])
tags = JSONFieldList(StringField(validators=[validators.DataRequired(), validators.Length(min=1, max=250)], filters=[lambda x: x or None]), validators=[Optional()])
答案 1 :(得分:0)
我发现了一个viable solution in this 2015 book,其中在博客构建活动中正在为烧瓶构建标签系统。
它基于Flask_SQLAlchemy。
因此,通过WTForms / Flask,可以通过以下方式将项目提交到数据库中,从而输入列表: FieldList,并在标记系统的用例中,从数据库中读取它们,以在UI中呈现它们。