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
$ 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
ブラウザからアクセスすると、下記のように表示される。
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のページが見れる。