質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

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

Q&A

解決済

1回答

2233閲覧

ドロップダウンメニューの初期値を設定したい

mirukikki

総合スコア9

Flask

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

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

0グッド

0クリップ

投稿2022/07/19 05:30

ここに質問の内容を詳しく書いてください。
ただいまflaskで翻訳アプリを作っています。

実現したいこと

ドロップダウンメニューから言語を選択して翻訳後、
ドロップダウンメニューの初期値を翻訳言語にしたい。

python

1#HTMLのほうのコード 2<select name="name"> 3 {% for lang in lang %} 4 <option value="{{ lang }}"> {{ lang }}</option> 5 {% endfor %} 6</select> 7 8#pythonのコード 9lang = {"ドイツ語": "de", "英語": "en", "スペイン語": "es", "フランス語": "fr", 10 "イタリア語": "it", "ポルトガル語": "pt", "日本語": "ja", "韓国語": "ko", "ヒンディー語": "hi"} 11 12#翻訳実行後、結果とともにページを再表示 13return render_template('translate.html', lang=lang.keys())

発生している問題・エラーメッセージ

selectedを追加しても一番最後の要素が自動で初期値になるだけで
困っています。

よろしくお願いいたします。

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

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

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

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

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

Lhankor_Mhy

2022/07/19 05:42

選択された言語はどのように取得しているのでしょうか?
mirukikki

2022/07/19 07:26

回答ありがとうございます! language = request.form['name'] で取得しております!
Lhankor_Mhy

2022/07/19 08:03

language がコードに登場していないみたいですが、まずはそこからでは。
mirukikki

2022/07/19 08:49

すみません><だいぶ端折って書いちゃいました>< 実際はちゃんと入ってます!
guest

回答1

0

ベストアンサー

どのような処理をしているのかわかりませんが、やりたいことのニュアンス的に以下の様な感じじゃないでしょうか?

python

1from flask import Flask, render_template 2 3app = Flask(__name__) 4 5 6@app.route('/') 7def index(): 8 langs = [ 9 {"display": "ドイツ語", "code": "de"}, 10 {"display": "英語", "code": "en"}, 11 {"display": "スペイン語", "code": "es"}, 12 {"display": "フランス語", "code": "fr"}, 13 {"display": "イタリア語", "code": "it"}, 14 {"display": "ポルトガル語", "code": "pt"}, 15 {"display": "日本語", "code": "ja", "selected": True}, 16 {"display": "韓国語", "code": "ko"}, 17 {"display": "ヒンディー語", "code": "hi"} 18 ] 19 20 return render_template('index.html', langs=langs) 21 22 23if __name__ == '__main__': 24 app.run() 25

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>おためし</title> 6</head> 7<body> 8<select name="name"> 9 {% for lang in langs %} 10 {% if lang.selected %} 11 <option value="{{ lang.code }}" selected> {{ lang.display }}</option> 12 {% else %} 13 <option value="{{ lang.code }}"> {{ lang.display }}</option> 14 {% endif %} 15 {% endfor %} 16</select> 17</body> 18</html>

selectedを追加しても一番最後の要素が自動で初期値になるだけで困っています。

selectedをなんとなく質問文のHTMLに書いても、全てにselectedが付いて、最後に見つけたselectedが選択されているって事になるだけじゃないですかね。

画面遷移が発生したりして選択言語が変わる場合も、似たような感じでどれが選択されているのかを渡せばやりたいことができると思います。

投稿2022/07/19 06:34

FiroProchainezo

総合スコア2401

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

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

mirukikki

2022/07/19 07:25

回答ありがとうございます!!!! 今で先なので戻り次第さっそく取り掛かります! やりたいことはまさにこんな感じでございます(#^.^#)
mirukikki

2022/07/19 08:50

なんとなく理解することができた気がします! あとは"selected": Trueを動的に設定すれば大丈夫って感じですよねっ!
mirukikki

2022/07/19 08:55

ちょっとどうやればいいのかわからないのでダメだったら教えてください(>_<)
mirukikki

2022/07/19 09:34

なんとかできたんですけどコードに自信がありませんなのでちょっと見てくれませんか? まずHTMLはvalue="{{ loop.index0 }}"にしてインデックスを取得しました。 それからpythonのほうでlanguage = request.form['name']で インデックスを取得してprint(langs[int(language)]['code'])で言語コードを 取得して翻訳します。それからrender_templateで再読み込みする前に def reset(): for i in range(9): lang[i]['selected'] = False のリセット関数で全部falseに変えてlangs[int(language)]['selected'] = Trueをしてます!
FiroProchainezo

2022/07/19 10:50

たぶん動いているんじゃないかと思いますが、理解出来ない部分があります。 valueにloop.index0はインデックスが欲しいから指定しているんだと思いますが、['name']という名前で受け取るものとして適切だと思えません。 コードが拡張されて複雑になったら修正失敗などの原因になる気がするので、jaやenなどのコードを指定して渡して貰った方が良いんじゃないかと思います。(貰ったcodeからindexを検索しましょう。) for i in range(9)はlangsが9個だから9なんだと思いますが、配列の長さは`len(langs)`で取得可能なので、そちらを使った方が良いです。 10個になったり8個になったら、関係する場所全部直すことになります。 大抵の場合、いつかミスりますので、変更が不要な形にしましょう。 `lang[i]['selected'] = False`については、その上に`print(langs[int(language)]['code'])`と書いてあるので、langという配列なのかlangsという配列なのかがわかりません。 こういうよくわからないのを避けるために、動作する最小のコードを質問文に掲載していただく必要があります。 また、この部分は、なんでいちいちFalseに指定し直しているのか不明です。 特定のテンプレートにlangs配列を渡すなら、それが呼び出される関数でlangsを作成して、必要な部分にselectedを指定すれば良いと思います。 もしかしてlangsはグローバルなんでしょうか? 私が例で書いたコードの様にindexでlangsを作れば毎回同じ内容になります。 例のコードは`{"display": "日本語", "code": "ja", "selected": True},`と書いてある通り、問答無用で日本語がセレクトされていますが、このselectedを書かずに、langs定義後、指定されたcodeに従ってselectedを指定すればやりたいことができるんじゃないでしょうか? FlaskはWebなので、グローバル変数を使うのはやめた方が良いです。 Webは複数同時にアクセスされる可能性があり、グローバル変数を使った場合、変数が想定通りの内容になっているか不明です。 デプロイするとき等にgunicornやmod_wsgiなどを使用すると思いますが、これらを使うとFlaskは複数プロセスで実行され、メモリ空間が別になり、また、そのプロセスも再起動を繰り返したりする可能性がありますので設計を見直した方が良いです。
mirukikki

2022/07/19 12:50

お忙しいところ誠に恐縮でございます>< codeからindexを検索する方法がわかりませんでした!! あと、len(langs)にしたら動きました!ありがとうございます!! lang[i]['selected'] = Falseは完全にスペルミスでございます。 それ以降のことはよくわからなかったんですけど、一回リセットしているのは 同じページから何度も言語を選択しなおして翻訳しなおししたいからです! そのたびに同じページに再render_templateしてます。
mirukikki

2022/07/19 12:52

あ..たぶん意味が分かりました! 確かにlangsは、importの下に書いていてグローバルになっています。 でもそうしないとスコープ的になんか厳しいんです><
mirukikki

2022/07/19 12:58 編集

ひとまず本当にありがとうございます! もうちょっと頑張ってみます。
mirukikki

2022/07/19 13:10 編集

すみません、できました>< @app.route('/trans/', methods=['GET', 'POST']) def trans(): langs = [ {"display": "ドイツ語", "code": "de"}, {"display": "英語", "code": "en"}, {"display": "スペイン語", "code": "es"}, {"display": "フランス語", "code": "fr"}, {"display": "イタリア語", "code": "it"}, {"display": "ポルトガル語", "code": "pt"}, {"display": "日本語", "code": "ja"}, {"display": "韓国語", "code": "ko"}, {"display": "ヒンディー語", "code": "hi"} ] こういうことでよかったんですよね!!
FiroProchainezo

2022/07/19 23:35

できたなら良かったですね。 自己回答でもなんでも良いので質問を締めていただけますか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問