python,djangoでのhtmlへの表示方法。(関数編+汎用ビュー編)。
早速関数編からやっていきましょう!
まずは基本から。views.pyに以下のように書き込みます。
def 関数名(request):
context = {
'test':'これはテストです'
}
return render(request, 'アプリケーション名':html名.html', context)
html部分に
{{ test }}
urls.pyに
path('使用したいURL', view.関数名, name='使用したい名前'),
と書くとcontextリストの中のtestキーが呼び出され、valueである'これはテストです'という文字が表示されます。
でも実際にはmodels.pyからデータベースに保存されたデータを表示させるパターンが多いと思います。そんな方はこのように。
from .model import モデル名
def 関数名(request)
context = {
'test_list': モデル名.objects.all(),
}
return render(request, 'アプリケーション名':html名.html', context)
allにするとモデルに登録されているデータがすべて取り出されます。 ここでは説明を省きますが、filterを使って特定のデータだけ取り出すことも可能ですよ。
モデル名.objects.all(),
続いてはhtml側。
{% for test in test_list %}
{{ test.表示したいモデルのフィールド名 }}
{% endfor %}
分割して解説しましょうか。
models.pyからデータベースに保存されたデータが複数あった場合for文を使って1つずつ呼び出しましょうということ。
test_listにモデル名.object.all()が反映されていて、for test部分でそれと一つずつ取り出してるイメージ(を僕は持っています。)
{% for test in test_list %}
{% endfor %}
testにモデルからのデータが一つずつ送られるわけですが、そのモデルのどのフィールドを表示した以下を以下の書き方で定義することができます。
{{ test.表示したいモデルのフィールド名 }}
例えばモデルにtest_1,test_2,test_3というフィールドがあった場合。
{{ test.test_1 }}
{{ test.test_2 }}
と書くとtest_1フィールドのデータベースに保存されたデータが表示された後にtest_2が表示されますが、test_3は書いてないので表示はされません。
今までは関数でやってきましたが、汎用ビューで書き換えるとこうなります。
汎用ビューはクラスを使います。
from django.views import generic
class クラス名(generic.ListView):
template_name = 'アプリケーション名/使用したいhtml名.html'
model = モデル名
これだけ!!!!
これいつも思うけどすごいよね!!
urls.pyを
path('使用したいURL', views.クラス名.as_view(), name='使用したい名前'),
とすることを忘れないでくださいね。
ちなみにtemplateの名前なんですが
モデル名_list.html
という名前をhtmlにつけると
二行目のtemplate_name部分は無くても動作するので試してみてください。
class クラス名(generic.ListView):
template_name = 'アプリケーション名/使用したいhtml名.html'
model = モデル名
templateの中身は、
{% for 使用したい名前 in モデル名_list %}
{{ 使用したい名前.使用したいモデルのフィールド名 }}
{% endfor %}
で動作します。なにしろデフォルトでモデル名+_listが設定されていて、そのように記載すると色々指定が省略できるんですね。