1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

(自分用)Flask_4(ドロップダウンメニュー、txtデータの表示(表を使って))

Last updated at Posted at 2020-06-19

項目

  1. ドロップダウンメニューの作成
  2. txtデータの読み込み
  3. txtを整える

1.ドロップダウンメニューの作成

python
from flask import Flask, request, render_template
app = Flask(__name__)

players = ["勇者", "戦士", "魔法使い", "忍者"]

@app.route("/")
def show():
    message = "あらたなモンスターがあらわれた!"
    return render_template("battle.html", message = message, players = players)
  • 今回はpy側に作ったリストを項目としてメニューを作成
  • リストに関してはそのまま
  • returnにリスト名入れるの忘れない様に
html
<form action="/result" method="post">
    <select name="name">
        {% for player in players %}
            <option value="{{ player }}">{{ player }}</option>
        {% endfor %}
    </select>
    <p></p>
    <button type="submit">たたかう</button>
</form>
  • selectタグでドロップダウンメニュー(セレクトボックスとも)を作るよと宣言
  • <option value="{{ player }}">{{ player }}に関しては、optionタグはメニューの項目を入力するもの
    ここではfor文を使って表示される項目名とvalueの名前を一致させている
  • これでsubmitボタンを押すと、選択した項目が入力される。

2.txtデータの読み込み

  • 用意するtxtデータは末尾を改行しておく
python
from flask import Flask, request, render_template
import codecs
app = Flask(__name__)

@app.route("/")
def bbs():
    file = codecs.open("articles.txt", "r", "utf-8")
    lines = file.readlines()
    file.close()
    return render_template("bbs.html", lines = lines)

@app.route("/result", methods=["POST"])
def result():
    article = request.form["article"]
    name = request.form["name"]
    return render_template("bbs.html", article = article, name = name)
  • import codecsを宣言しておく
    codecsを使うと指定した文字コードとかでデータを読み込めるらしい
  • file = codecs.open("articles.txt", "r", "utf-8")で指定したtxtをrモードのutf-8でfile変数に入れている
  • lines = file.readlines()で1行ごとのリストでデータを全て読み込んでいる
    ちなみに.readline()なら1行だけ読み込み、.read()ならリストとか関係なしに全部読み込む
  • ファイルは.openした後、必ずfile.close()する
html
{% for line in lines: %}
    <p>{{ line.rstrip() }} </p>
{% endfor %}
  • for文で1つずつlineに代入されたデータを表示していくだけ
  • .rstrip()で行末の改行コード1つのみを消している

3.読み込んだtxtデータを整える

  • 体裁を整えるだけのhtml的な話なのでpyは触れなくてOK
html
<table>
    <tr><th>投稿</th><th>名前</th></tr>
        {% for line in lines: %}
            {% set column = line.rstrip().split(",") %}
            <tr>
                {% for item in column: %}
                    <td>{{ item }}</td>
                {% endfor %}
            </tr>
        {% endfor %}
</table>
  • 1つ上にあるhtmlをこれに置き換える
  • まずtableタグで表を作るよと宣言する
  • trタグで横軸の中身を触るよと宣言し、タグの中でthタグによって表の項目名を設定する
  • setでcolumnの中にlineのデータをforの試行ごとに入れていく
    今回は行末の改行コードを.rstripで消した後に、.split(",")によって「,」でデータを区切っている
  • それらのデータをtrタグによって横軸方向に入れるよと言ったのち、おもむろにfor文で区切られたデータ単体をitemに入れ、tdタグというデータ入力専用のタグにてデータを入力する
  • ↑ちょい分かりにくいので補足
    例えば
txt
Hello World,peko
Hello Ruby,oz
Hello Sinatra,toramaru
世界の皆さんコンニチハ,霧島
にゃー,ネコ

というtxtデータだとすると、forの試行1回目では

  • lineにはHello World,peko(改行コード)というデータ
  • columnにはHello World , pekoというデータ(データを綺麗にしている)
  • itemにはHello Worldというデータのみ(区切られていた為にこれ単体で取り出された)

が入っている。一応trタグで横方向に入れるって宣言したのも忘れない様に

4.終わりに

  • なし
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?