DjangoでviewsからHTML(templates)への値の渡し方


概要

djangoの値をhtmlに渡すために必要なviewsの書き方を調べてきたので、よければお役に立ててください。また、ある程度djangoを触ってる人向けに書いてあります。

開発環境

Mac
djagno=3.2.1
python=3.9.1

きっかけ

viewsからhtmlに値を渡す際に、querysetが表示されてしまって、なかなか自分の思い通りにならなかったので、忘備録兼、記事にしたいと思います。

views.pyの書き方

まずは、関数での値の渡し方
()の中の数字はそれと同じものを指しています。

views.py
def hello(request):
    hello(①) = "Hello World"
    context = {
        'hello'(②): hello(①)
    }
    return render(request, 'hello.html', context)

hello.html
<!DOC...
<body>
<h1>{{ hello(②) }}</h1>
</body>

このcontextというのに入れるのが基本系だと思います。また、辞書型で渡さないとエラーになってしまうため、このような書き方をしています。公式ドキュメント通りだとこの書き方だと思います。また、models.pyを作って、簡単にadmin.pyで表示、編集。それの値を受け取り、関数を使って、値を渡してみます。
admin.pyで保存したのは
id = 1 = Hello World
id = 2 = Goodbye World
の2つです。1つしか表示しない場合はfor文はいらないですが、せっかくなので、同時に紹介したいと思います。

models.py
class Greetings(models.Model):
      greeting = models.CharField(max_length=20)

views.py
def greeting(request):
    greetings = Greetings.objects.all()
    context = {
        'greetings'(①): greetings,
    }
    return render(request, 'greeting.html', context)

hello.html
{% for greeting(②) in greetings(①) %}
<h1>{{ greeting(②) }}</h1>
{% endfor %}

次は汎用ビューでの値の渡し方です。greeting.htmlの中身は上のものと一緒です。

models.py
class Greetings(models.Model):
      greeting = models.CharField(max_length=20)

views.py
class GreetingView(TemplateView):
    model = Greetings
    template_name = 'greeting.html'

    #この関数が、classからhtmlに値を渡すおまじないになります。2行目まではほとんど一緒だと思います。
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['greetings'] = Greetings.objects.all()
        return context

こうすると、Hello World と GoodBye World が一緒に表示されます。
また、汎用ビューのDetailViewを使う際は、id毎に別々のgreetingを呼ぶことができます。
自分でも確認ができてよかったです。次は、modelのフィールドについて話してみようと思います。