如何在WTForms中输入列表?

时间:2019-02-15 19:15:35

标签: flask flask-wtforms

我要做什么

我正在尝试在flask中输入应作为列表传递的标签列表,但是我无法弄清楚如何在flask中进行操作,也无法在{中找到添加字符串列表的文档{1}}。有人有经验吗?

理想情况下,输入标签后,我希望标签可以选择性地删除。这样您就可以输入。

问题

到目前为止,我的表格是静态的。您输入内容,点击提交,它将被处理为flask_wtf。标签列表是我不知道的最后一个元素。我什至不知道烧瓶能否做到这一点。

关于我如何设想进入过程的一些演示:

我如何设想进入过程:

  1. 显示当前标签,并在输入字段中添加新标签。
.json
  1. 点击(添加)
    [Tag1](x) | [Tag2](x)

    Enter new Tag: [______] (add)
  1. 已添加新标签
    [Tag1](x) | [Tag2](x)

    Enter new Tag: [Tag3__]  (add)

我如何设想删除过程:

  1. 在标签侧面点击(x)应该会杀死它。
    [Tag1](x) | [Tag2](x) | [Tag3](x) 

    Enter new Tag: [______]
  1. 在Tag2上点击(x)。结果:
    [Tag1](x) | [Tag2](x) | [Tag3](x) 

删除操作可谓锦上添花,一旦我有了可以编辑的列表,就可以完成删除操作,但是到达那里似乎很困难。 我在这里茫然。

我基本上想知道一般是否可以输入列表,因为似乎没有关于该主题的文档。

2 个答案:

答案 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中呈现它们。