プログラミング学習

Djangoで簡単な「文字カウントメモ」を作ってみる

Django ロゴプログラミング学習

こんにちは。リューさん(@Ryu_programs)です。この記事では以下のような人に向けてDjangoで簡単なWebアプリを作成していきます。

  • Djangoの学習をしたいけど、何から始めれば良いのか分からない
  • Pythonを使って何か作ってみたい
  • プログラミングについて興味がある

また、この記事は以前の記事の続きです。まだ読んでいない場合は、是非読んでみてください。

Django学習 ~Django紹介編~
この記事では、DjangoやWebフレームワークについて分かりやすく紹介しています。DjangoとはPythonのWebフレームワークで、利用することで簡単にWebアプリを作成できます。また、この記事の後に環境構築編や開発編などが続きます。

Dockerを用いて環境構築する場合はこの記事がお勧めです。

Django学習 ~環境構築編~
この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。

アプリケーションを作成する

countmemoアプリケーションを作成する

まず、manage.pyと同じディレクトリ上で以下のコマンドを実行し、countmemoアプリケーションを作成しましょう。

$ python3 manage.py startapp countmemo

このコードはDockerを利用している場合、以下のようなコードになります。

$ docker-compose run web ./manage.py startapp countmemo

上のコードを実行すると、countmemoディレクトリが作成され、その中にmodels.pyviews.pyが入っているはずです。以下はPaizaCloudのスクリーンショットなので、表示形式は少し違うかもしれませんが、このようなファイル構成になっていれば問題ありません。exampleはプロジェクト名です。

settings.pyを変更する

その後、settings.pyに新しいアプリを作成したことを教えてあげましょう。settings.py内のINSTALLED_APPSに以下のように’countmemo.apps.CountmemoConfig’を記述します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'countmemo.apps.CountmemoConfig',
]

モデルを変更する

models.pyを変更する

次に、countmemoフォルダ内のmodels.pyを書き換えていきます。このmodels.pyを元にDjangoがデータベースを操作してくれるので、非常に大事なファイルです。今回は以下のように記述していきます。

from django.db import models
from django.utils import timezone

# Create your models here.
class MemoModel(models.Model):
    memo_text = models.CharField(max_length=200)
    up_date = models.DateTimeField(default=timezone.now)
    length = models.IntegerField(default=0)

    def __str__(self):
        return self.memo_text

マイグレーションを行う

models.pyに追記したらマイグレーションを実行しましょう。こうすることでDBに変更を加えます。models.pyを変更した場合は必ず行っておけば間違いありません。

manage.pyと同階層で以下のコマンドを実行します。

$ python3 manage.py make migrations
$ python3 manage.py migrate

Dockerの場合は、以下のようなコマンドになります。

$ docker-compose run web ./manage.py make migrations
$ docker-compose run web ./manage.py migrate

views.pyを確認用に変更する

countmemoフォルダ内のviews.pyを以下のように変更しましょう。

from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world!!!!!")

views.pyは簡単に言えばアプリの処理に関する役割を担います。今回は確認のために、Hello, world!!!!!と表示するように記述しています。

URL関連の設定を行う

countmemoアプリ内にurls.pyを作成する

views.pyを変更したら、次はurls.pyを変更してアクセスできるようにしましょう。まず、countmemoフォルダ内にurls.pyというファイルを作成し、以下のように記述します。

また、app_nameを記述することで、アプリが大量になったときにviews.pyやテンプレートファイルからアクセスしやすくなります。記述しておきましょう。

from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = [
    path('', views.index, name='index'),
]

プロジェクト内のurls.pyを変更する

僕の場合は、exampleというプロジェクト名なので、exampleフォルダの中のurls.pyを変更していきます。こうすることで、countmemoアプリ内のurls.pyを読み込むようになります。

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('countmemo.urls')),
]

アプリにアクセスする

runserverコマンドを実行しましょう。

Dockerの場合は以下の、以前の記事で説明したURLに、それ以外の環境を使っている場合は環境構築時にDjangoのロケットが表示されていたURLにアクセスしてみてください。

Django学習 ~環境構築編~
この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。

トリミングしているため分かりづらいですが、上記のようにHello, world!!!!!と表示されていれば成功です。次のステップへと進みましょう。

base.htmlを作成する

次に、base.htmlを作成します。まず、countmemoフォルダの中にtemplatesフォルダを作成し、さらにそのtemplatesフォルダの中にcountmemoフォルダを作成しましょう。

そして、countmemoフォルダの中にbase.htmlを作成します。

現在、countmemo > templates > countmemo > base.htmlのようになっているはずです。そうであればbase.htmlに以下のように追記していきます。今回はbootstrap4を使うので、そちらもbase.htmlで読み込んでいきます。

<!doctype html>
<html lang="ja">
    <head>
        <title>{% block title %}{% endblock %}</title>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
    </head>
    <body>
        {% block content %}
        {% endblock %}

        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
        {% block extrajs %}
        {% endblock %}
    </body>
</html>

base.htmlは他のhtmlファイルのひな型のようなものです。用いることで大幅にコードを減らすことができます。

一覧表示テンプレートを作成する

countmemoフォルダ内のviews.pyを以下のように変更します。generic.ListViewはデータ一覧を表示したい時に使うと便利です。テンプレートファイルには、object_listという名前でデータが渡されます。

from django.shortcuts import render
from django.views import generic

from .models import MemoModel

class MemoListView(generic.ListView):
    model = MemoModel
  template_name = 'countmemo/memolist.html'

views.pyを変更したので、同じくcountmemoフォルダ内のurls.pyを以下のように変更します。classベースのviewを使った場合は、以下のようにas_view()をつけるようにしましょう。

from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = [
    path('', views.MemoListView.as_view(), name='index'),
]

MemoListViewのためのmemolist.htmlを、templateフォルダ内のcountmemoフォルダ内に作成します。object_listで渡されたデータをfor文を用いて順に取り出し、テーブルの形にまとめています。

{% extends 'countmemo/base.html' %}

{% block title %} memolist {% endblock %}

{% block content %}
    <table class="table">
        <thead>
            <tr>
                <th>#</th>
                <th>テキスト</th>
                <th>文字長</th>
                <th>作成日</th>
            </tr>    
        </thead>
        <tbody>
            {% for data in object_list %}
                <tr>
                    <th>{{ data.id }}</th>
                    <th>{{ data.memo_text }}</th>
                    <th>{{ data.length }}</th>
                    <th>{{ data.up_date }}</th>
                </tr>
            {% endfor %}
        </tbody>
    </table>
{% endblock %}

ここまで完了したら、以下のコマンドでサーバーを動かしましょう。

$ python3 manage.py runserver

Dockerの場合は次のようなコマンドになります。ただ、Dockerの場合はdocker-compose up -dで既にrunserverを実行していると思うので、必要ないかもしれません。

$ docker-compose run web ./manage.py runserver

先ほどのURLにアクセスし、以下のようになっていれば成功です。

データを追加できるようにする

まず、views.pyに次のように記述します

from django.shortcuts import render, redirect
from django.views import generic

from .models import MemoModel

class MemoListView(generic.ListView):
    model = MemoModel
    template_name = 'countmemo/memolist.html'
    

class CreateMemo(generic.CreateView):
    model = MemoModel
    fields = ['memo_text',]
    template_name = 'countmemo/memoadd.html'
    
    def form_valid(self, form):
        memo = form.save(commit=False)
        memo.length = len(memo.memo_text)
        memo.save()
        return redirect('countmemo:index')

変更点はCreateMemo以下です。この場合、models.pyで指定したmemo_textのみを入力し、lengthに入力された値の文字列長を格納するようにしています。

form_validは入力された文字列が要件を満たすときに呼び出されます。

次に、アプリの方のurls.pyを以下のように変更します。

from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = [
    path('', views.MemoListView.as_view(), name='index'),
    path('add/', views.CreateMemo.as_view(), name='add'),
]

こちらも、変更点はview.CreateMemo.as_view()の部分だけです。

以前作成したmemolist.htmlにデータ追加ページに遷移するためのボタンを設置します。追記する場所はどこでもいいです。僕はテーブルの下のところに設置しました。

<a class="btn btn-primary d-block d-md-inline-block mb-2 mb-md-0" 
href="{% url 'countmemo:add' %}" role="button">追加</a>

その後、memoadd.htmlをmemolist.htmlやbase.htmlと同じフォルダに作成し、以下のように記述します。

{% extends 'countmemo/base.html' %}

{% block title %} memoadd {% endblock %}

{% block content %}
    <form method="post">
    {% csrf_token %}

    {{ form }}
    <button class="btn btn-primary" type="submit">save</button>
    </form>
{% endblock %}

bootstrapを適用させるにはformの内容をひとつづつ記述し、classを追加するか、javascriptやforms.py等で自動的に追加するかなどの作業が必要なのですが、今回は省きます。また、それらの記事も書くかもしれません。

ここまで終わったら、runserverコマンドを実行してWebアプリを動かしてみましょう。先ほどの画面に追加ボタンが現れているはずです。そのボタンをクリックしてください。以下の写真のようになっていれば成功です。

上手く動いていたら適当に入力してみてください。

このように、うまくカウントできていれば成功です。

まとめ

どうでしたか?Djangoを使えば、慣れてしまえば簡単なアプリをこのように30分程度で作れてしまいます。もちろん、今回のアプリはデザインも機能も優れているとは言い難いですが、Djangoのすごさを少しでも分かってもらえたのではないでしょうか。

もし、「ここが分からない」「分かりづらい」などありましたら、Twitter(@Ryu_programs)までよろしくお願いします。

また、今回利用したPythonの学習方法などもブログに書いています。よろしければ読んでみてください。

Pythonの勉強方法
最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。

タイトルとURLをコピーしました