0

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

ただし、ユニコード文字とすべてでその混乱を印刷したように見えます。

だから私はそれを素敵なテーブルにフォーマットしようとしているので、各タプルに何が含まれているかを簡単に確認できます

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

これを解決する方法についての提案は、驚くべきことにほかなりません。ありがとう

4

2 に答える 2

1

わかりやすい例として、より単純なイメージ リストから始めましょう。

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

次に、そのタプルのリストを改良して、フォームの値に使用する選択肢にします。基本的には、wtforms に 2 つの値のタプルのリストを提供することが目標です。

[
    (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'))
]

タプル内でそのタプルを処理する方法がわかりません。したがって、ラベルの値を選択するか、そのデータをより適切にフォーマットする必要があります。

したがって、リスト内包表記を変更して、より適切な説明を選択すると、目標に到達できます。

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')
]

リスト内包表記の詳細を読んでください。

于 2013-02-06T17:37:29.120 に答える
0

zip(form.images、descriptions)をhtmlテンプレートではなく、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 %}
于 2013-02-06T16:16:26.437 に答える