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

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

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

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

Python

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

Q&A

解決済

1回答

5429閲覧

都道府県と市区町村を紐付けて表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

2グッド

4クリップ

投稿2017/03/20 12:52

タイトルをどうつけるべきか分からず、分かりづらいタイトルで申し訳ありません。
Django(Python)でWebサイトを作っています。

下記のように、都道府県と市町村のモデルを作って、データベースを作ったうえで、都道府県と市町村の一覧を表示したいです。

python

1# models.py 2 3# 都道府県(東京都、神奈川県、…) 4clsss Prefecture(models.Model): 5 id = models.IntegerField(primary_key=True) 6 name = models.CharField(max_length=30) 7 8 def __str__(self): 9 return self.name 10 11# 市区町村(千代田区、港区、…) 12class City(models.Model): 13 name = models.CharField(max_length=30) 14 prefecture = models.ForeignKey(Prefecture, on_delete=models.CASCADE) 15 def __str__(self): 16 return self.name 17

最終的に表示したいのは、下記のような形です。

|都道府県|市区町村|
|:--|:--:|--:|
|東京都|千代田区、港区、世田谷区、…|
|神奈川県|横浜市、川崎市、…|

この場合の、views.py及びHTMLの書き方について、今まで私は下記のようにしていました。

python

1# views.py 2 3def test(request): 4 list = [] # 表示用の空のリストを作る 5 prefectures = Prefecture.objects.all() # 都道府県 6 cities = City.objects.all() # 市区町村 7 for pref in prefectures: 8 list_each_pref = [pref] # 例:["東京都"] 9 city_list_each_pref = [] # 都道府県毎の市区町村を入れる空のリスト 10 for city in cities: 11 if city.prefecture == pref: # もし当該市区町村が当該都道府県内であったら 12 city_list_each_pref.append(city) # 都道府県毎の市区町村を入れるリストに入れる ["千代田区"、"港区"] 13 list_each_pref.append(city_list_each_pref) # 例["東京都",["千代田区","港区",...]] 14 list.append(list_each_pref) #例[["東京都",["千代田区","港区",...]],["神奈川県",["横浜市","川崎市",...]]] 15 16context = { 17 "list": list 18} 19return render(request, 'test/test.html', context) 20

そして、レンダリングするHTMLは、下記のように書いていました。

html

1# test.html 2<table> 3<tr> 4 <th>都道府県</th><td>市区町村</td> 5<tr> 6{% for pref in list %} 7 <tr> 8 <td>{{pref.0}}</td> 9 <td> 10 {% for city in pref.1 %} 11 {{city}}, 12 {% endfor %} 13 </td> 14</tr> 15{% endfor %} 16

私は、今まで自己流でこのように書いていたのですが、表示用のリストを作るというのが複雑で、一般的にはこんな方法は取らないのではないかと思います。
もっとシンプルなやり方があるのではないかと思い、質問させていただきました。
お分かりの方、ご教示頂ければ幸いです。
よろしくお願いいたします。

av-, Youhei-Sakura👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Prefetcure と City は ForeignKey で関連性を持っているので、下記のようにすると良いと思います。

python

1# views.py 2def test(request): 3 context = { 4 "prefectures": Prefecture.objects.all() 5 } 6 return render(request, 'test/test.html', context)

html

1# test.html 2<table> 3<tr> 4 <th>都道府県</th><td>市区町村</td> 5<tr> 6{% for pref in prefectures %} 7 <tr> 8 <td>{{ pref.name }}</td> 9 <td> 10 {% for city in pref.city_set.all %} 11 {{ city.name }}, 12 {% endfor %} 13 </td> 14</tr> 15{% endfor %} 16

ポイントは、CityがPrefectureの外部キーを持っている場合、PrefetcureからCityのデータを取得する時はcity_set からQuerySetを取得できるというところです。

https://docs.djangoproject.com/ja/1.10/topics/db/queries/#related-objects

python

1pref1 = Prefetcure.objects.filter(id=1).get() 2pref1.city_set.all() # => pref1 を ForeignKeyとしてsetしているCityのデータ取得可能

投稿2017/03/20 13:21

編集2017/03/20 22:39
tell_k

総合スコア2120

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

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

退会済みユーザー

退会済みユーザー

2017/03/22 10:00

ありがとうございます。 返事遅くなり申し訳ありません。 _set.all()をつけることで、ForeignKeyのデータを引っ張ってくることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問