• トップ
  • ブログ一覧
  • 【最終回】Djangoで日記アプリを作ろう~総復習編~
  • 【最終回】Djangoで日記アプリを作ろう~総復習編~

    広告メディア事業部広告メディア事業部
    2021.09.06

    エンジニアになろう!

    Djangoで日記アプリを作ろう ~総復習編~

    前回は Django の便利な認証系パッケージ allauth を使って、ユーザー登録やログインといった機能を実装しました。

    ここまでの連載で日記の作成・閲覧・編集・削除に加えて、テンプレートに工夫を施す方法や Django における基本的なテストの実施方法、そして allauth を利用した認証機能の実装ができるようになりました。

    今回の第9回で本連載は終わりとなります。

    本記事ではこれまで学んだ内容を総復習します。

    また、これから Django を使った開発を進めていく上で便利な Django の拡張パッケージを紹介します。

    まずは、第1回から第9回までに学んだ内容を復習しましょう。

    Django の基本的な思想

    Django において最も基本的な思想、それがMVTという設計パターンです。

    MVT は、Model・View・Template の略称です。

    Model は、データアクセス層であり、データベースとのやりとりを支援します。

    テンプレートはプレゼンテーション層、いわゆるユーザーインターフェースを定義します。

    そして最後に View は、ビジネスロジック層です。

    モデルと連携してデータを処理し、テンプレート(HTML)をレンダリングします。

    URL ディスパッチャ

    MVT に加えてもう一つ重要なのが、URL ディスパッチャです。

    URL ディスパッチャはユーザーが URL にアクセスした際にその URL に対応した View を呼び出します。

    これまでのアプリ開発でも urls.py に URL とそれに対応する View クラスを宣言してきました。

    MVT と URL ディスパッチャ、これらが Django においてまず最初に抑えるべきポイントです。

    使いこなすとコード量がグッと減る便利なViewクラス

    前の章で View はビジネスロジック担当すると説明しました。

    ビジネスロジックとは例えば日記データの作成や編集、削除のことです。

    TemplateView と呼ばれる DjangoView クラスを利用して View を実装することも可能です。

    しかし、データの作成や編集など、いわゆる CRUD(Create、Read、Update、Delete)作業に関しては、Django は便利な汎用クラスを用意してます。

    本連載でも利用した、CreateViewListViewDetailViewUpdateViewDeleteView のことです。

    これらのクラス継承した View クラスを使うことで、ほとんどコーディングすることなく CRUD 作業を実装できます。

    Django テンプレート言語

    Django テンプレート言語は、テンプレートファイル上で利用することのできる便利な機能です。

    この言語を使いこなすことによって、HTML テンプレートファイルを効率的にそして簡素に作ることができます。

    テンプレート言語における重要な概念が変数とタグです。

    変数は {{ 変数名 }} といったように二重の中括弧で表現されます。

    この変数に関して必ず理解しておかなければならないことは「変数を使えば View でコンテキストに埋め込んだデータを利用することができる」という点です。

    例えば下記のように、日記の一覧表示を行う View を ListView を用いて実装したとしましょう。

    1class DiaryListView(ListView):
    2    template_name = 'diary_list.html'
    3    model = Diary

    この場合、diary_list.html というテンプレート内部で {{diary_list}} といった形で日記データのリストを利用することができます。

    一方タグは {% タグ名 %} といったように%を使った記法になります。

    タグを使う上でまず理解しておきたいのは大きく2つ。

    2つのタグ

    1つ目は for タグや if タグなどのロジックを実現するタグです。

    for タグを使えば日記データのリストを下記のようにループ処理することが可能です。

    1{% for diary in diary_list %}
    2<p>
    3    {{ diary.date }}
    4    <a href="{% url 'diary:diary_detail' diary.pk %}">{{ diary.title }}</a>
    5</p>
    6{% endfor %}

    これで日記の内容を一覧表示できますね。

    もう1つが block タグを用いたテンプレートの継承です。

    この block タグを利用することで親テンプレートの一部分を変えた子テンプレートを作成することが可能となり「ほとんど中身が同じだけど一部分だけが異なる複数のテンプレート」を効率よく作成できます。

    Django における単体テスト

    Django における単体テストは Python の標準テストモジュール unittest が基本となっており、unittest のサブクラスである django.test.TestCase を利用してテストコードを実装していきます。

    本連載では下記のようなテストコードを実装しました。

    1import datetime
    2from django.test import TestCase
    3from .models import Diary
    4
    5
    6class DiaryModelTests(TestCase):
    7
    8    @classmethod
    9    def setUpTestData(cls):
    10        Diary.objects.create(title='initial_test_title', text='initial_test_text')
    11
    12    def test_diary_has_date(self):
    13        """
    14        作成した日記データに日付が付与されているか確認
    15        """
    16        Diary.objects.create(title='test_title', text='test_text')
    17        actual_diary = Diary.objects.get(title='test_title')
    18        self.assertIsInstance(actual_diary.date, datetime.date)
    19
    20    def test_save_and_retrieve(self):
    21        """
    22        日記データの保存と取得を確認
    23        """
    24        Diary.objects.create(title='test_title', text='test_text')
    25        actual_diary = Diary.objects.get(title='test_title')
    26        self.assertEqual(actual_diary.title, 'test_title')

    setUpTestData メソッドを利用してテストで利用するテスト用データを作成し、そのデータをテストコードを実装したメソッド内部で参照できます。

    allauth を用いた認証機能の実装

    django-allauth は Django によるアプリ開発においてよく利用される認証機能を実現するパッケージです。

    ユーザーの登録、ログイン、パスワードの再設定や変更など、会員制 web アプリを開発する上で必須となる機能を素早く実装することができます。

    Django には django.contrib.auth という標準の認証パッケージが組み込まれていますが、ユーザー登録のビューがなかったりテンプレートが用意されていなかったりと物足りない部分があります。

    実務上では特別な事情がない限り django-allauth を使って認証系機能を実装した方が低コストで良いでしょう。

    Django の便利なパッケージ

    ここまでは第1回から第9回の内容を総復習しました。

    最後に Django を用いた web アプリケーション開発で便利なパッケージを紹介します。

    Django REST Framework

    Django REST Framework を利用すれば Django と連携した RESTful な Web API を作ることができます。

    データベースにある表形式データを React などのフロントエンド側に渡す場合には、表形式データを JSON などのフォーマットに変換する必要があります。

    この変換処理はシリアライズと呼ばれますが、Django REST Framework を用いればシリアライズ処理の実装が非常に簡単になります。

    また Django REST Framework で作成した API は、その利用方法などを記載したドキュメントを自動生成することが可能です。

    API の仕様は頻繁に変わるものですが、この自動生成機能があればドキュメントの更新漏れを防ぐことができます。

    django-model-utils

    django-model-utils は Django のモデルクラスの拡張を行います。

    例えば StatusModel クラスは、モデルの状態を表すステータスフィールドを持たせることができます。

    例えばメディア記事のデータに対して「作成中・レビュー前・投稿OK」といった状態を持たせたい場合に利用できます。

    他にもモデルデータの論理削除を実施したい場合に使う SoftDeletableModel クラスなど、Django が標準で提供していないモデルクラスを多数用意しています。

    モデルを設計した後に使えそうなクラスがないか一度ドキュメントを見てみると良いでしょう。

    django-storages

    Django とクラウドストレージサービスを連携するためのパッケージです。

    Google Cloud の Google Storage や Amazon Web Service の S3 などのストレージサービスを Django アプリのデフォルトストレージとして利用できるようになります。

    写真や動画などのアップロードを伴うアプリを開発する際にぜひ使いたいパッケージです。

    まとめ

    今回はこれまでの記事の総復習と便利な Django パッケージについて学びました。

    今回のポイントは以下の通りです!

    1. Django の基本思想は MVT と URL ディスパッチャ
    2. 実務では CreateView などの便利な View クラスを利用しよう
    3. Django テンプレート言語の基本は変数とタグ
    4. Django における単体テストは Python の標準テストモジュール unittest がベースとなっている
    5. 認証機能を実装したいなら django-allauth が便利
    6. Django アプリと連携した Restful Web API を実装するなら Django REST Framework
    7. django-model-utils は Django のモデルクラスを拡張する
    8. Django とクラウドのストレージサービスを連携するならば django-storages を使う

    これにて全9回となる Django の連載は終了となります!

    9回では解説できないほど Django にはまだまだ奥深い所がありますので、本連載をベースとしてこれからも Django の世界を探求してください!

    本連載を御覧頂き、ありがとうございました!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事