Djangoのサンプル

準備

CentOS8を起動。

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-8.3"
  config.vm.network "forwarded_port", guest: 8000, host: 8000
  config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
end
> vagrant up
> vagrant ssh

PythonDjangoをインストール。

$ sudo dnf install -y python38
$ sudo pip3 install django

あと、SQLiteも入れておく。

$ sudo dnf install -y sqlite

プロジェクトの作成

Djangoのプロジェクトを作成。

$ cd /vagrant
$ django-admin startproject config
$ mv config myproject

アプリケーションの作成

アプリケーションを作成。

$ cd myproject
$ python3 manage.py startapp books

設定を変更。

$ vi config/settings.py
・・・
INSTALLED_APPS = [
    'books.apps.BooksConfig',   # 追加
    'django.contrib.admin',
    'django.contrib.auth',
・・・

テンプレートの置き場の変更

テンプレートの置き場を作成。

$ mkdir templates
$ mkdir templates/books

設定を変更。

$ vi config/settings.py
import os                                               # 追加
・・・
TEMPLATES = [
    {
        ・・・
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 変更
        ・・・

urlsの修正

booksのurlsを追加。

$ vi config/urls.py
・・・
from django.urls import path, include       # 変更

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

books側のurlsのファイルも作成。

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

urlpatterns = [
]

モデルの作成

モデルを作成。

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

class Book(models.Model):
    TYPE = (
        (1, '和書'),
        (2, '洋書')
    )

    title = models.CharField('タイトル', max_length=20)
    price = models.IntegerField('値段')
    type = models.IntegerField('種別', choices=TYPE)
    description = models.TextField('概要', max_length=200, blank=True)
    release_date = models.DateField('発売日', null=True)
    created_at = models.DateTimeField('作成日時', auto_now_add=True)
    updated_at = models.DateTimeField('更新日時', auto_now=True)

マイグレーションを実行。

$ python3 manage.py makemigrations
$ python3 manage.py migrate

テーブルが作られる。

$ sqlite3 db.sqlite3
> .tables
auth_group                  books_book
auth_group_permissions      django_admin_log
auth_permission             django_content_type
auth_user                   django_migrations
auth_user_groups            django_session
auth_user_user_permissions

> .schema --indent books_book
CREATE TABLE IF NOT EXISTS "books_book"(
  "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
  "title" varchar(20) NOT NULL,
  "price" integer NOT NULL,
  "type" integer NOT NULL,
  "description" text NOT NULL,
  "release_date" date NULL,
  "created_at" datetime NOT NULL,
  "updated_at" datetime NOT NULL
);

> .quit

初期データを追加

初期データのJSONを作成し、

$ mkdir books/fixtures
$ vi books/fixtures/initial_data.json
[
  {"model": "books.book", "pk": 1, "fields": {"title": "book1", "price": 1000, "type": 1, "description": "", "created_at": "2021-01-01T00:00:00+09:00", "updated_at": "2021-01-01T00:00:00+09:00"}},
  {"model": "books.book", "pk": 2, "fields": {"title": "book2", "price": 2000, "type": 1, "description": "", "created_at": "2021-01-01T00:00:00+09:00", "updated_at": "2021-01-01T00:00:00+09:00"}},
  {"model": "books.book", "pk": 3, "fields": {"title": "book3", "price": 3000, "type": 1, "description": "", "created_at": "2021-01-01T00:00:00+09:00", "updated_at": "2021-01-01T00:00:00+09:00"}},
  {"model": "books.book", "pk": 4, "fields": {"title": "book4", "price": 4000, "type": 2, "description": "", "created_at": "2021-01-01T00:00:00+09:00", "updated_at": "2021-01-01T00:00:00+09:00"}},
  {"model": "books.book", "pk": 5, "fields": {"title": "book5", "price": 5000, "type": 2, "description": "", "created_at": "2021-01-01T00:00:00+09:00", "updated_at": "2021-01-01T00:00:00+09:00"}}
]

投入。

$ python3 manage.py loaddata initial_data.json

一覧表示

urlsに追加。

$ vi books/urls.py
・・・
urlpatterns = [
    path('', views.book_list, name='book_list'),    # 追加
]

一覧表示処理を作成。

$ vi books/views.py
from django.shortcuts import render
from .models import Book

def book_list(request):
    context = {
        'object_list': Book.objects.all(),
    }
    return render(request, 'books/book_list.html', context)

テンプレートを作成。

$ vi templates/books/book_list.html
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
  <table border="1">
    <tr>
      <th>title</th>
      <th>price</th>
      <th>type</th>
      <th>release_date</th>
    </tr>
    {% for book in object_list %}
    <tr>
      <td>{{ book.title }}</td>
      <td>{{ book.price }}</td>
      <td>{{ book.get_type_display }}</td>
      <td>{{ book.release_date }}</td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

起動

起動。

$ python3 manage.py runserver 0.0.0.0:8000

ブラウザからアクセスすると、下記のように表示される。

http://localhost:8000/books/
f:id:yk5656:20210505185727j:plain

admin

adminのページにアクセスする場合は、

スーパーユーザーを追加する。

$ python3 manage.py createsuperuser

Bookをadminに追加する。

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

admin.site.register(Book)

これで、adminのページが見れる。

http://localhost:8000/admin/
f:id:yk5656:20210505185740j:plain