Django入門

トップ > アラカルト > Django入門

Django とは

インストール

CentOS 7 に Django をインストールする手順を下記に示します。

Shell
// Python 3.6 のための yum リポジトリをインストールする
# yum -y install https://centos7.iuscommunity.org/ius-release.rpm

// Python 3.6 をインストールする
# yum -y install python36u

// pip 3.6 をインストールする
# yum -y install python36u-pip

// Django 2.0.2 をインストールする
# pip3.6 install Django==2.0.2

Djangoのバージョンを確認する

Shell
# python3.6 -m django --version
2.0.2

プロジェクトを作成する

まず、Django プロジェクトを作成します。

Shell
$ django-admin startproject mysite
$ cd mysite

下記のファイルが作成されます。

Files
./mysite
./mysite/manage.py
./mysite/mysite
./mysite/mysite/__init__.py
./mysite/mysite/urls.py
./mysite/mysite/wsgi.py
./mysite/mysite/settings.py
./mysite/db.sqlite3

簡易サーバを起動する

開発用の簡易サーバを起動します。LISTEN する IPアドレスとポート番号を指定することができます。

Shell
$ python3.6 manage.py runserver 0.0.0.0:8000

外部のクライアントから接続すると 「Invalid HTTP_HOST header: '192.168.xx.xx:8000'. You may need to add '192.168.xx.xx' to ALLOWED_HOSTS.」 といったエラーとなることがあります。settings.py に接続を許可するホストの情報を設定する必要があります。

./mysite/settings.py
ALLOWED_HOSTS = [ "*" ]

ブラウザから、http://サーバのアドレス:8000/ にアクセスすることで、Django のサンプルページが表示されれば成功です。8000番ポート番号が解放されていない場合は、例えば下記の様にして開放する必要があります。

Shell
# yum -y install firewalld
# systemctl enable firewalld
# systemctl start firewalld
# firewall-cmd --add-port 8000/tcp --permanent
# firewall-cmd --reload

ローカライズ

必要に応じて、言語やタイムゾーンを指定します。

mysite/settings.py
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

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

mysite プロジェクトの下に books アプリケーションを作成します。

Shell
$ python3.6 manage.py startapp books

下記のファイルが作成されます。

Files
./books/__init__.py
./books/admin.py
./books/apps.py
./books/models.py
./books/tests.py
./books/views.py
./books/migrations/__init__.py

作成したアプリケーションを INSTALLED_APPS に登録します。

./mysite/settings.py
INSTALLED_APPS = [
    'books.apps.BooksConfig',
    'django.contrib.admin',
    'django.contrib.auth',

ビューを下記の様に修正します。

./books/views.py
from django.http import HttpResponse

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

urls.py ファイルを新規に作成します。。

./books/urls.py
from django.urls import path
from . import views

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

作成した books/urls.py をプロジェクトに登録します。

./mysite/urls.py
from django.contrib import admin
from django.urls import path, include

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

ブラウザで http://サーバアドレス:8000/books/ にアクセスして Hello world! が表示されれば成功です。

とりあえず今日はここまで。続きはまた別途。

MariaDB と接続する

Django は標準では SQLite を使用しますが、MariaDB を使用する場合は次のように設定します。

Shell
# pip3.6 install PyMySQL
./mysite/settings.py
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',        # データベース名
        'USER': 'xxxxxx',        # DBユーザ名
        'PASSWORD': 'xxxxxxxx',  # DBパスワード
        'HOST': '127.0.0.1',     # DBサーバアドレス
        'PORT': '3306',          # DBサーバポート
    }
}

モデルを作成する

モデルを作成します。

./books/models.py
from django.db import models

class Books(models.Model):
    title = models.CharField(max_length=256)
    author = models.CharField(max_length=256)
    category = models.CharField(max_length=256)

    def __str__(self):
        return self.title

DB に対するマイグレーションを作成し、マイグレーションを実行します。これにより、モデルで定義したテーブルやカラムが自動的に作成されます。テーブルやカラムを変更して再度マイグレーションを行うことで、テーブル追加やカラム追加がマイグレーションされます。

Shell
$ python3.6 manage.py makemigrations
$ python3.6 manage.py migrate

管理者サイトを使用する

Django は簡易的な管理サイト機能を標準で装備しています。管理者サイトからモデルで定義した DB に対して簡単な追加・一覧・更新・削除を行うことができます。まず、管理者ユーザを作成します。

Shell
$ python3.6 manage.py createsuperuser
Username (leave blank to use 'admin'): admin
Email address: admin@example.com
Password:
Password (again):
Superuser created successfully.

Books アプリケーションの Book モデルを管理者サイトで管理できるようにします。

./books/admin.py
from django.contrib import admin
from .models import Book

admin.site.register(Book)

ブラウザから http://サーバアドレス:8000/admin/ にアクセスすることで、上記で作成した管理者ユーザで管理者サイトにログインすることができます。管理者サイトから、Book の情報を何冊が登録してみましょう。

テンプレートを使用する

テンプレートを使用して Book の一覧を表示します。

./books/templates/books/listBooks.html
<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Author</th>
      <th>Category</th>
      <th>Action</th>
    </tr>
  </thead>
  <tbody>
    {% if books %}
      {% for book in books %}
        <tr>
          <td><a href="/books/{{ book.id }}/">{{ book.title }}</a></td>
          <td>{{ book.author }}</a></td>
          <td>{{ book.category }}</a></td>
          <td><a href="/books/{{ book.id }}/edit">[Edit]</a></td>
        </tr>
      {% endfor %}
    {% else %}
      <tr>
        <td colspan=4>No books.</td>
      </tr>
    {% endif %}
  </tbody>
</table>
./books/views.py
from django.http import HttpResponse
from django.template import loader
from .models import Book

def listBooks(request):
    books = Book.objects.all()
    context = {
        'books': books
    }
    template = loader.get_template('books/listBooks.html')
    return HttpResponse(template.render(context, request))
./books/urls.py
rom django.urls import path
from . import views

urlpatterns = [
    path('', views.listBooks, name='listBooks'),
]

http://サーバ:8080/users/ にアクセスして、管理者サイトで登録した本の一覧が表示されれば成功です。

詳細画面

一覧画面と同様に詳細画面を作成します。

./books/templates/books/detailBook.html
<div>ID: {{ book.id }}</div>
<div>Title: {{ book.title }}</div>
<div>Author: {{ book.author }}</div>
<div>Category: {{ book.category }}</div>
<button onclick="location.href='/books/'">Return</button>
./books/views.py
    :
def detailBook(request, book_id):
    try:
        book = Book.objects.get(pk=book_id)
    except Book.DoesNotExist:
        book = None

    context = {
        'book': book,
    }
    template = loader.get_template('books/detailBook.html')
    return HttpResponse(template.render(context, request))
./books/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.listBooks, name='listBooks'),
    path('<int:book_id>/', views.detailBook, name='detailBook'),
]

Copyright (C) 2018 杜甫々
初版:2018年3月4日 最終更新:2018年4月11日
http://www.tohoho-web.com/ex/django.html