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

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

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

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

Python

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

Q&A

解決済

1回答

3651閲覧

django viewで作成したlistを使用してtemplateでチェックボックスを表示したい

Renkon

総合スコア26

Django

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

Python

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

0グッド

0クリップ

投稿2020/02/26 01:26

編集2020/02/26 05:06

表題の件に関してですが、project/app02/view.pyにて

python

1from django.shortcuts import render 2 3def index(request): 4 context = {'lists': ["データ1", "データ2", "データ3"]} 5 return render(request, 'index.html', context)

とし、project/templates/app/index.htmlにて

html

1{% for list in lists %} 2 <input type="checkbox" name="email" value="{{email}}" /> {{list}}<br /> 3{% endfor %}

と書いている状況です。

http://127.0.0.1:8000/app02/にアクセスすると何も表示されません。
terminalにもエラーの表示はなされません。

どのようにすればチェックボックスが表示されるのでしょうか?

ファイル構造は

project │ db.sqlite3 │ manage.py │ ├─AppSelect │ │ admin.py │ │ apps.py │ │ models.py │ │ tests.py │ │ urls.py │ │ views.py │ │ __init__.py │ │ │ ├─migrations │ │ │ __init__.py │ │ │ │ │ └─__pycache__ │ │ __init__.cpython-36.pyc │ │ │ └─__pycache__ │ admin.cpython-36.pyc │ models.cpython-36.pyc │ urls.cpython-36.pyc │ views.cpython-36.pyc │ __init__.cpython-36.pyc │ ├─config │ │ settings.py │ │ urls.py │ │ wsgi.py │ │ __init__.py │ │ │ └─__pycache__ │ settings.cpython-36.pyc │ urls.cpython-36.pyc │ wsgi.cpython-36.pyc │ __init__.cpython-36.pyc │ ├─app01 │ │ admin.py │ │ apps.py │ │ models.py │ │ tests.py │ │ views.py │ │ __init__.py │ │ │ └─migrations │ __init__.py │ ├─app02 │ │ admin.py │ │ apps.py │ │ forms.py │ │ models.py │ │ tests.py │ │ urls.py │ │ views.py │ │ widgets.py │ │ __init__.py │ │ │ ├─migrations │ │ │ __init__.py │ │ │ │ │ └─__pycache__ │ │ __init__.cpython-36.pyc │ │ │ └─__pycache__ │ admin.cpython-36.pyc │ forms.cpython-36.pyc │ models.cpython-36.pyc │ urls.cpython-36.pyc │ views.cpython-36.pyc │ __init__.cpython-36.pyc │ ├─static │ └─app02 │ └─images │ sample.jpg │ └─templates │ base.html │ ├─AppSelect │ index.html │ └─app02 index.html

としております。

urls.pyはconfig, AppSelect, app02それぞれにおいて(app01は何も記述してありません)
config/urls.py

python

1from django.contrib import admin 2from django.urls import path, include 3from django.views.generic import RedirectView 4 5urlpatterns = [ 6 path('admin/', admin.site.urls), 7 path('AppSelect/', include('AppSelect.urls')), # URLがAppSelect/なら、AppSelectアプリ内のurls.pyを参照する 8 path('app02/', include('app02.urls')), 9 path('',RedirectView.as_view(url='/AppSelect/')), # URLが''なら(topディレクトリへのアクセス)はAppSelectに直接飛ぶ(redirectする)ようにしておく 10]

AppSelect/urls.py

python

1rom django.urls import path 2from django.views.generic import TemplateView 3 4urlpatterns = [ 5 path('', TemplateView.as_view(template_name='AppSelect/index.html'), name='index'), 6]

app02/urls.py

python

1from django.contrib import admin 2from django.urls import path 3from django.views.generic import TemplateView 4from . import views 5 6urlpatterns = [ 7 #TemplateViewを使ってTOPページ(index.html)を定義 8 path('', TemplateView.as_view(template_name='app02/index.html'), name='index'), 9]

としてあります。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問にでている情報

project/template/app/index.htmlにて

のうち、app/index.htmlの部分を信頼するなら(templatetemplatesの単純な写し間違いだとするなら)

return render(request, 'index.html', context)

return render(request, 'app/index.html', context)

ですね。

エラーになってないなら、project/templates/index.html存在してしまっているのかな、と思いました。


まずテンプレートの探索が正しいかを確認したいですね。

{% for list in lists %} <input type="checkbox" name="email" value="{{email}}" /> {{list}}<br /> {% endfor %}

の上、テンプレートのできるだけ冒頭に、何か文字を入れて表示されるかどうかを確認しましょう。

それが表示されるようならテンプレートの別の部分の問題でしょう(このforループが実行されてない、というような)。

表示されないようなら、
次はdef index(request):が本当に呼ばれているかを確認したいです。

def index(request): raise RuntimeError('本当にindexが呼ばれてる')

とかしてエラーが出ることを確認しましょう。


TemplateView

def index(request): return render(request, 'some_app/index.html')

のような中身がないお決まりのビュー関数を書いて

path('', some_app.index, name='index'),

と書かずに済むためのものなので、(本当はもっと機能があるのでしょうけれどそれはおいておいて)
TemplateView.as_viewで呼び出すように書いたらindexが呼ばれることはないですね。呼び出さない設定を書いているわけですから。

投稿2020/02/26 02:01

編集2020/02/26 05:41
quickquip

総合スコア11235

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

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

Renkon

2020/02/26 02:17

ご指摘ありがとうございます。 templatesの写し間違いでした。 また、app/views.pyを def index(request): context = {'lists': ["データ1", "データ2", "データ3"]} return render(request, 'app/index.html', context) としたのですが、いまだに画面には何も表示されません。 すみません。いかがでしょうか。
Renkon

2020/02/26 02:50

>まずテンプレートの探索が正しいかを確認したいですね。 テンプレートにただのチェックボックスを作る文を記述しました。 <input type="checkbox" name="tags" value="1" id="id_tags_0"> <label for="id_tags_0">Python</label> 結果、ブラウザにチェックボックスが表示されました。 >次はdef index(request):が本当に呼ばれているかを確認したいです。 viewsの記述をお示しいただいたとおり変更しました。 def index(request): raise RuntimeError('本当にindexが呼ばれてる') 結果、ブラウザにもターミナルにもエラーは出ませんでした。 def index():が呼ばれていないようです。。。
quickquip

2020/02/26 03:22

整理すると、 質問に挙げられたdef index **以外** のメソッドから、質問に挙げられたテンプレートが読み出されている という可能性が最も高いわけですね。 プロジェクトの中に最低2つ urls.py があると思うのでそちらが意図通りか見ましょう。 分からないようであれば、ディレクトリ名を含めて質問を編集してurls.pyを書いてみてください。その場合はもうちょっと全体のディレクトリ構造が分かるようにしてもらえるとよいかと。
Renkon

2020/02/26 05:05

質問を編集いたしました。 urls.pyの設定がまちがっているでしょうか? ご確認のほどお願いいたします。
quickquip

2020/02/26 05:25

まちがっているというか、呼び出す設定をしてませんねとしか。 TemplateView.as_view は「そのテンプレートのファイルを出力しろ」っていうことですから……。
Renkon

2020/02/26 05:54

TemplateViewのご説明をいただいてようやく理解ができました。 全く意図通りのコードがかけておりませんでした。お教えいただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問