格式化单选按钮表单的描述

时间:2013-02-06 14:32:31

标签: python python-2.7 flask jinja2 flask-wtforms

我有一个元组列表,我从sqlite3数据库获得。我试图以不同的方式获得数据库而没有任何运气,这不是这个问题的人,但最终如果它有助于格式化我的单选按钮形式的描述,我会欣喜若狂。

我看起来像这样的清单:

images = [(1, u'True', u'file_Name.img', u'img', u'train', u'2013-02-0509:59:46.442660file.ext',
   u' file2.ext', u'ABC', u"[u'prod_one-prod_two']", u'name@email.com',
   u'nothing happens', u'2013-02-0509:59:46.442660', u"[u'ftp://link/file_Name.img', 
   u'ftp://link/file3.ext', u'ftp://link/file_Name.log']"),(2, u'True',u'file_Name.img', 
   u'img', u'train', u'2013-02-0509:59:46.442660file.ext', u' file2.ext', u'ABC', 
   u"[u'prod_one-prod_two']", u'name@email.com', u'nothing happens', 
   u'2013-02-0509:59:46.442660', u"[u'ftp://link/file_Name.img', 'ftp://link/file3.ext', 
   u'ftp://link/file_Name.log']")]

我想要做的是将选择的值作为每个元组的第一个元素

rows = [(str(x[0]), x) for x in images]
form.images.choices = rows

然而,看起来我只是用unicode角色和所有东西打印出来。

所以我试图在一个漂亮的表格中将其格式化,以便很容易看出每个元组包含的内容

descriptionList = []
description = ''
for i in images:
    for j in i:
        description = description + '\t|' + str(j)
    descriptionList.append(description)


rows = [(str(x[0]), y) for x, y in zip(images, descriptionList)]
form.images.choices = rows

但是,当我显示表单时,它在输出中没有制表符。

所以现在我正在考虑将descriptionList传递到模板中,并将其显示在每个单选框旁边,作为表单中的描述。

return render_template('database.html', form=form, descriptions = descriptionList)
{% for subfield, desc in zip(form.images, descriptions) %}
        <tr>
            <td>{{ subfield }}</td>
            {# {{ subfield.label }} (this is a comment)#}
            desc <br>
        </tr>
    {% endfor %}

但是我收到错误“UndefinedError:'zip'未定义”

没有它我得到:

{% for subfield, desc in (form.images, descriptions) %}
ValueError: too many values to unpack

关于如何解决这个问题的任何建议都会令人惊讶。感谢

2 个答案:

答案 0 :(得分:1)

让我先从一个更简单的图像列表开始,作为一个更清晰的例子:

images = [
            (1, u'True', u'file_one.jpg', u'2013'),
            (2, u'False', u'file_two.jpg', u'2012'),
]

然后,您将元组列表优化为要用于表单值的选项,实质上目标是为wtforms提供两个值元组的列表:

[
    (1,'file_one.jpg'), 
    (2,'file_two.jpg')
]

但你使用这个列表理解:

rows = [(str(x[0]), x) for x in images]
form.images.choices = rows

将生成:

[
    (1, (1, u'True', u'file_one.jpg', u'2013')), 
    (2, (2, u'False', u'file_two.jpg', u'2012'))
]

这对wtforms没用,它不知道如何处理元组中的元组。因此,您需要选择标签的值,或者更好地格式化该数据。

因此,要么改变你的列表理解以选择更好的描述,这将使你达到目标:

rows = [(x[0],x[2]) for x in images]

或者将所有数据加在一起以提供更详细的信息,但对您的描述可能有用:

rows = [(x[0], "\t|".join([str(y) for y in x])) for x in images]

这将导致:

[
    (1, '1\t|True\t|file_one.jpg\t|2013'), 
    (2, '2\t|False\t|file_two.jpg\t|2012')
]

list comprehensions上阅读更多内容。

答案 1 :(得分:0)

尝试不在html模板中准备zip(form.images,description),但是在python代码中然后将其发送到模板:

   imgs_with_descriptions = zip(form.images, descriptionList)
模板中的

   {% for subfield, desc in imgs_with_descriptions %}
       <tr>
            <td>{{ subfield }}</td>
            {# {{ subfield.label }} (this is a comment)#}
            desc <br>
        </tr>
   {% endfor %}