【问题标题】:Formatting the descriptions of a Radio Button Form格式化单选按钮表单的描述
【发布时间】:2013-02-06 14:32:31
【问题描述】:

我有一个从 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' is undefined”

没有它我得到:

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

任何有关如何解决此问题的建议都令人惊叹。谢谢

【问题讨论】:

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


    【解决方案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 |True |file_one.jpg |2013 2 |False |file_two.jpg |2012
    • 如果您在 Web 浏览器中查看它,您将不会 - Web 浏览器不关心空白,超过一个空格的任何内容都将被忽略。如果您查看网页的源代码,您会看到标签。
    【解决方案2】:

    尽量不要在html模板中准备zip(form.images, descriptions),而是在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 %}
    

    【讨论】:

    • 文件“/usr/local/lib/python2.7/dist-packages/wtforms/fields/core.py”,第 411 行,iter_choices 中的值,self.choices 中的标签:TypeError: “NoneType”对象不可迭代
    • imgs_with_descriptions = zip(form.images, descriptionList) 只需将该行添加到views.py,即使我不对其进行任何操作,我也会收到该错误。在它之前我有 form = DatabaseForm() 之后我有 orm.images.choices = rows
    • 如果在“return render_template('database.html', form=form, descriptions = descriptionList)”之前添加“zip(form.images, descriptionList)”? 'NoneType' 对象不可迭代 - 意味着当您调用 zip(...) 时某些变量的类型为 None
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多