blog.takurinton.dev

Djangoのすゝめ

2020-05-16

Djangoって知ってますか?

Djangoって知ってます?DjangoはPythonで書かれているWeb開発フレームワークです。フレームワークとはなんぞやって人は[こちら](https://www.otsuka-shokai.co.jp/words/framework.html)から。

DjangoはMTVモデルというもので構成されています。MTVモデルとは、Djangoに標準装備されているモデリングのことで、この概念はやっていくうちに理解していけばいいと思います。

ちなみにMTVはなんの略かというと

  • M (Model)
  • T (Template)
  • V (View)
  • これらの頭文字ですね。

    最近結構Web系の知り合いが増えてきていますが、他のフレームワーク得意!って人はたくさんいても、Djangoが得意!って人は今までで1人しか出逢ってないですね(その人はちょっと別次元なんですが)

    Djangoでできること

    じゃあ一体Djangoで何ができるんだよ!って思いますよね

    結論から言うとなんでもできます(他のフレームワークも大体なんでもできるわ!ってコメントはしないで( ̄∇ ̄))

    Djangoで作られている(いた)代表的なものだと、YoutubeやInstagram、Spotifyなどがあります

    インスタ以外はみなさん利用してるんじゃないでしょうか?インスタは陽キャのやるアプリなのでこの記事を読んでいる皆さんには無縁ですね。

    あとは、僕のこのブログも実はDjangoで作っていて、理由は開発者として楽に高速開発ができるからってとこですかね。

    6時間くらいで簡単にさくっと仕上げてデプロイしました(デプロイの方が時間かかってますが。)

    記事を書く時はマークダウンで書けるようにしたり、コメント欄は匿名にしたり、なんか自分の理想のブログってものを作りたいなと思って作りました。

    自分で作ったブログって愛着が湧きますよね。フロントエンドはだいぶサボってますが、まあ手作り感があっていいでしょう!( ^∀^)

    Djangoで開発したい!

    Djangoはちょっと特殊らしいので、いろいろめんどくさい的なことを書いてある記事も見かけますが、とっても優しいチュートリアルが準備されているのでそこまで難しくないのかなと思います。

    最低限相対パスと絶対パスくらいの違いわかるよってレベルなら大丈夫(たぶん)

    公式

    のチュートリアルもいいですが、お勧めは[Django Girls](https://tutorial.djangogirls.org/ja/)です。これ一通りやればだいぶ理解できるようになると思います。

    Webアプリ作りたいって人でPython書いたことあるって人なら絶対面白いのでお勧めです!

    Djangoでの開発

    Djangoでよく使うファイルについて簡単に説明したいと思います

  • models.py データベースのテーブルを定義する。クラスの定義がテーブルの定義になっていて、models.Modelを継承してテーブル作成をする。モデリングの知識とか結構必要かもしれない。
  • views.py リクエストを受け取ってレスポンスを返すための関数やクラスを定義する部分。名前の通り、htmlファイルを指定して表紙したりする。
  • forms.py(自分で作る)formの値を受け取る時に、自動でformを生成してくれるクラスを定義する場所。これはえぐいほど便利。views.pyと連動して使用する。
  • urls.py ルーティングを定義する。これ2つあるから注意が必要(多分チュートリアルで一番最初に触れてくれる)
  • とまあこんな感じでしょうか。

    具体例をあげると、このブログのmodels.pyは以下のようになっています。

    from django.db import models
    from markdownx.models import MarkdownxField
    from markdownx.utils import markdownify
    from django.utils import timezone
    from .templatetags import app_tags
    
    class Category(models.Model):
        name = models.CharField(max_length=255, null=True)
    
    
    class Post(models.Model):
        title = models.CharField(max_length=100)
        contents = MarkdownxField('Contents', help_text='To Write with Markdown format')
        contents_image_field = MarkdownxField('Images', help_text='To Write with Markdown format')
        view = models.PositiveIntegerField(default=0)
        category = models.ForeignKey(Category, verbose_name='category', on_delete=models.PROTECT, null=True)
        pub_date = models.DateTimeField('date published')
    
        def formatted_markdown(self):
            return markdownify(self.contents)
    
    
    class Comment(models.Model):
        post_id = models.ForeignKey(Post, on_delete=models.CASCADE)
        contents = models.TextField(max_length=10000)
        pub_date = models.DateTimeField('date published')
    
    
    class Contact(models.Model):
        name = models.CharField(max_length=100)
        mail = models.EmailField()
        contents = models.TextField(max_length=10000)
        pub_date = models.DateTimeField('date published', default=timezone.now())
    

    割とわかりやすい構造になっていると思います。

    主キーはクラス定義と同時に自動でidという属性が作成されそこに連番でIntegerの値が格納されていくので、自分で定義する必要はありません。

    自分で定義したい場合は、引数としてunique=Trueを指定してあげると重複なしのフィールドにすることができます。

    Categoryクラスにはこの投稿のカテゴリを作成することができます。

    Postクラスにはタイトルやコンテンツのフィールドがあります。contents_image_fieldは見出しに使う画像を選択します。Twitterカードにも同じ画像を使用するようにhtml側で指定しています。Postクラスの中にある関数は、マークダウンで書いた文章をリアルタイムでプレビューしてくれる関数となっています。

    CommentクラスはPostクラスの主キーを外部キーとして持っているテーブルで、その投稿ごとにコメントを表示することができます。

    Contactクラスは、お問い合わせフォームの役目を担っています。まあ一般的ですね。ちなみに今のところお問い合わせは0件です。笑笑

    このような感じで、割と簡単にテーブルを定義することができます。このブログでやりとりされる全ての値を格納するためのデータベースが30行ほどで収まってしまうって感動的ですよね!泣きそうです!

    まとめ

    ここではDjangoについてほんの一部しか紹介することができませんでしたが、Djangoはすごいぞ!ってことだけ伝わったかと思います。ほんとはカスタムユーザーモデルの話とかユーザ認証の話、あとはマイグレーションについての話もしたいんですけど、またそれは次回にしましょう。

    Django勉強したい!って人は連絡待ってます。

    一緒にお勉強しましょう〜!

    長くなりましたが、以上です。