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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

Python

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

HTML

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

Q&A

解決済

1回答

1847閲覧

Djangoでfor文を使ってリストの要素を表示させる方法

harug

総合スコア28

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

Python

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

HTML

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

0グッド

0クリップ

投稿2021/11/23 13:34

前提・実現したいこと

プログラミング初心者です。
現在、Django上でpythonを使ってWebアプリ制作をしています。
templatesのhtml内にリストの要素を繰り返し表示させようとしたところ、以下のような問題が発生しました。

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

以下のように各町名を繰り返し表示するプルダウンメニューを作成しようとしているのですが、for文で記述した部分が消された状態で表示されてしまい、思うように表示されません。
要は

<option value="">選択してください</option> の部分だけが表示されます。

該当のソースコード

index.htmlです。
アプリ名はsearch_shopです。

html

1 <form method='POST' action="{% url 'search_shop:shop_town' %}" id="index_form"> 2 {% csrf_token %} 3 <select name="select_town"> 4 <option value="">選択してください</option> 5 {% for town in towns %} 6 <option>{{town}}</option> 7 {% endfor %} 8 </select> 9 <input type='submit' value='検索'> 10 </form> 11 12

また、以下はviews.pyです。

python

1def Shop_Info(request): 2 template_name = "index.html" 3 options = { 4 'towns':["石川町","絵鞆町","海岸町","香川町","神代町","港南町","幸町"] 5 } 6 return render(request, template_name, options)

次にsearch_shop/urls.pyです。

python

1urlpatterns = [ 2 path('',views.Shop_Info,name='shop_town') 3]

最後にプロジェクトのurls.pyです。

python

1urlpatterns = [ 2 path('admin/', admin.site.urls), 3 path('',include('search_shop.urls')), 4 path('search_shop/',include('search_shop.urls')), 5] 6

試したこと

html

1{% for town in towns %} 2{{town}} 3{% endfor %}

このようにformタグの外で普通に記述しても、townsは全く表示されませんでした。

エラーも出ないので、何か文法のミスかurls.pyのパス指定のミスかと、色々考えられますがいくら調べても原因は分かりませんでした。
とても初歩的なことで申し訳ありませんが、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

テンプレート上のrenderメソッドで返しているオブジェクトの変数がoptionsに対し、ビュー上で展開しているオブジェクト変数はtownsです。

オブジェクトoptionsの中に指定したtownsはあくまでoptions.townsという包含関係のプロパティに過ぎませんので、現状だとテンプレートとビューの変数が紐付いてません。renderメソッドの第三引数は変数をビュー上に返す役割を持っているので、それを把握しておきましょう。

なので以下の方法で対応できるはず。

テンプレート上のrenderメソッドを紐付けて、ビュー上のfor構文の中で展開元はoptions.townsなのでそれに合わせようにします。

py

1return render(request, template_name, {'options':options})

html

1<select name="select_town"> 2 <option value="">選択してください</option> 3 {% for town in options.towns %} 4 <option>{{town}}</option> 5 {% endfor %} 6 </select>

投稿2021/11/24 00:35

編集2021/11/24 03:18
FKM

総合スコア3640

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

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

harug

2021/11/24 02:06

初めまして。 回答ありがとうございます。 仰る通りだと思い、さっそくコードを書き直してみたのですが結果は何も変わらずです…汗 何か他にに原因は考えられますでしょうか。
FKM

2021/11/24 02:38 編集

renderテンプレートを以下のようにしてください return render(request, template_name, {'options':options}) テストしてみた限りではうまくいったので、これで大丈夫だとは思いますが。
harug

2021/11/24 02:44

解決できました! ありがとうございます。 最後に、可能であればなぜこのような記述で実現できたか簡単にお教え頂けますでしょうか?
FKM

2021/11/24 03:17 編集

render_templateで変数をビューで返すときにはオブジェクト化してから受け渡し用の引数の指定が必要です。なので、 {'options':options} このようにすれば受け渡すことができます。この引き渡し用のオブジェクトに指定するキー(極力、同じにしとけばいいでしょう)は変数optionsが持っているプロパティのtownsとは別物です。 仮にテンプレートで return render(request,render_template,{'hoge':options}) とやってもビューではこのようになります。 {% for town in hoge.towns %} <option value="{{member.city_no}}">{{ town }}</option> {% endfor %}
harug

2021/11/24 03:55

ビューで変数を返すときは、オブジェクト化をすること。 忘れないように気を付けます。 とても勉強になりました。 ご丁寧にどうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問