我有一个元组列表,我从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
关于如何解决这个问题的任何建议都会令人惊讶。感谢
答案 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 %}