🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

6585閲覧

[HTML, Flask] htmlの中身を繰り返し処理

Yukiya025

総合スコア86

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

0クリップ

投稿2019/09/26 10:41

編集2019/09/27 00:36

やりたいこと

HTMLの中身を繰り返し処理 (verb0~verb6) したいです。

  • app.py (@app.route~が記述)
  • base_wordforms.html (HTML継承のための親ファイル)
  • test.html (HTML継承のための子ファイル。{% extends "base_wordforms.html" %})

該当箇所

python

1# app.py 2@app.route("/testverb", methods=["GET"]) 3def testverb(): 4 vrb_l = ru_func.verbtest() 5 return render_template("test.html", 6 verb0=vrb_l[0], 7 verb1=vrb_l[1], 8 ...() 9 verb6=vrb_l[6])

html

1<!--base_wordforms.html--> 2<h1>{% block verb0 %}{% endblock %}の現在活用</h1> 3<td>{% block verb1 %}{% endblock %}</td> 4...(略) 5<td>{% block verb6 %}{% endblock %}</td>

html

1<!--test.html--> 2{% block verb0 %} 3 {{verb0 }} 4{% endblock %} 5 6{% block verb1 %} 7 {{verb1}} 8{% endblock %} 9...(略) 10{% block verb6 %} 11 {{verb6}} 12{% endblock %}

試したこと

test.html{% block verb0 %}{{verb0}}{% endblock %}を以下のようにしてみましたがはじかれます。。jinja2が問題だとは思うのですが、では具体的にどう変えたらいいのかがわかりません(>_<)

html

1<!--test.html--> 2{% for i in range(7) %} 3{% block {{"verb" + str(i)}} %}{{"verb" + str(i)}}{% endblock %} 4{% endfor %}
# エラー文 jinja2.exceptions.TemplateSyntaxError: expected token 'name', got '{'

いろいろいじってみたが。。。?

エラーが出続けて眠いのでギブアップorz 惜しいような気がするが堂々巡り。
問題は{% block xxx %} の扱い方のようでjinja2.exceptions.TemplateSyntaxError: unexpected '%'とか'+'云々と出てきて治してもエラーが出続ける。

GitHubに上げました

ファイルの場所

  • app.py (ルートディレクトリ)
  • templates/base_wordforms.html
  • templates/test.html

できましたー(≧∀≦)

siruku6さまの以下の一言

ソースを見たのですが、{% block %} と {% endblock %}は、そこにはいらなかったような気がします

test.htmlには当てはめたのですが、base_wordforms.htmlには当てはめず「{% block verb0 %}{% endblock %}で。。。えっと0の所はどう変数を持ってこようか?」などと考えていました。とりあえず夜も遅いしベッドに入って目が覚めてO'Reillyの読み放題サービスで、Flask Framework Cookbook: Over 80 proven recipes and techniques for Python web development with Flask, 2nd EditionFlask By Example by Gareth Dwyer(2016-03-31) を行ったり来たり、siruku6さまに言われたことを考えつついろいろ脳内シミュレーションして「もしかしたらbase_wordforms.htmlはブロックなしでシンプルに{{ verb[0] }}なんて書けばいいんじゃない?」ということに思い至りそれで試したらうまくいきました:D

学んだこと

  • {{}}にはPythonの変数が入る
  • {% block xxx %}{% endblock %}xxxの部分の名前は同じものを同じページで1回以上つかったらだめ。

完成したGitHub
heroku該当ページ。ちゃんと表示されています^^v

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siruku6

2019/09/26 12:43

HTMLと記載されているファイルについてなのですが、もし {% extends "base_wordforms.html" %} など、他にも書かれているものがあるのであれば、全て記載した方がよいと思います。 そうでないと、根本的な原因を突き止めることができずに、的外れな回答になってしまうと思います。 おそらくですが、{% extends "base_wordforms.html" %}はいずれかのファイル内に書いていますよね。 他にも何かあれば省略せずに記載した方がいいと思います。 (どこが原因なのかわからない場合は特に)
Yukiya025

2019/09/27 00:37

ですよねf^^; 「すっきりさせた方がいいかな?」なんて思ってよく迷います。。
guest

回答1

0

ベストアンサー

試したことについて

ソースを見たのですが、{% block %}{% endblock %}は、そこにはいらなかったような気がします

python

1{% for i in range(7) %} 2 {{"verb" + str(i)}} 3{% endfor %}

恐らくこんな感じになるはずです。

全体像

全体的には、こんな位置関係になると思います。

python

1<!--base_wordforms.html--> 2 3<!DOCTYPE html> 4<html> 5 <head> 6 <title>タイトル</title> 7 </head> 8 <body> 9 <!-- この中に各ビューファイルが読み込まれる --> 10 {% block content %}{% endblock %} 11 </body> 12</html>

python

1<!-- test.html --> 2 3<!-- 親テンプレートファイルの指定はここで行う --> 4{% extends "base_wordforms.html" %} 5 6{% block content %} 7 8 {% for i in range(7) %} 9 {{"verb" + str(i)}} 10 {% endfor %} 11 12{% endblock %}

色々作り変えて覚えるしかないのですが。。

このサイトは結構丁寧に解説している気がします
【随時更新】Flaskのjinja2テンプレートエンジンのチートシート
参考まで

補足

※render_templateメソッドの引数に渡されている変数は、なくてもview表示ができそうだったため使用していません

投稿2019/09/26 12:56

編集2019/09/26 12:58
siruku6

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yukiya025

2019/09/26 16:08

ありがとうございます。試してはみたのですがうまく行かず。。。{% block xxx %}のxxxに変数を入れ込めたら解決するような気がするのですがいかがでしょうかorz app.pyでvrb = ["vrb0", "vrb1", "vrb2", "vrb3", "vrb4", "vrb5", "vrb6"]というリストを作ってそれをtemplates/test.htmlでfor文対応するように入れ込むことを検討したのですがうまく行きません(T_T)
siruku6

2019/09/26 23:42

直接解決には至らなかったようですが、進展があったようで何よりです!
Yukiya025

2019/09/27 00:38

いえいえ、siruku6さまのおかげですよ(≧∀≦)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問