先週 Let’s start Python #4 ~Djangoの基礎~ に参加してきました!今回の講座内容はDjangoの基礎でテーブルの作成と管理ユーザの作成です。
Djangoとは
DjangoはPythonを使用したフルスタックフレームワークです。
仮想環境の作成
自分は、WSL+Ubuntu環境で実施しました。
$ mkdir elvmember # 作業ディレクトリの作成 $ cd elvmember $ python -m venv myvenv # 仮想環境を作成 $ source myvenv/bin/activate # 仮想環境を起動 (myvenv) $ # プロンプトが変更されたことを確認(※以降は省略) # 仮想環境の停止方法 (myvenv) $ deactivate $ # プロンプトが元に戻る
Djangoのインストール
$ python -m pip install --upgrade pip # pipのアップデート $ vi requirements.txt Django~=2.2.4 $ pip install -r requirements.txt # requirements.txtファイルを読み込んでインストール $ pip list # 確認 Package Version ---------- ------- Django 2.2.6 pip 19.3 pytz 2019.3 setuptools 40.6.2 sqlparse 0.3.0
プロジェクトの作成
$ django-admin startproject elvsite .
$ cd elvsite
$ vi settings.py # 以下のように編集
$ diff -y --suppress-common-lines settings.py.org settings.py
LANGUAGE_CODE = 'en-us' | LANGUAGE_CODE = 'ja' # LANG設定変更
TIME_ZONE = 'UTC' | TIME_ZONE = 'Asia/Tokyo' # TIME_ZONE設定変更
> STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 静的ファイルのパスを追加
$ cd ..
$ python manage.py migrate # データベースを作成
$ python manage.py runserver # Webサーバの起動
# ※停止は「ctrl+c」
ブラウザでhttp://localhost:8000にアクセスし、以下の画面が表示されることを確認

アプリ作成
$ python manage.py startapp master # masterアプリを作成
$ vi elvmember/settings.py
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'master.apps.MasterConfig' # master/apps.py の MasterConfig クラスを追加
]
$ vi master/models.py # models.pyを編集
import uuid
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.core.validators import RegexValidator
class Employee(models.Model):
""" 社員マスタ """
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(verbose_name = "名前", max_length=20,default='')
name_furigana = models.CharField(verbose_name = "ふりがな", max_length=20,default='')
entering_date = models.DateTimeField(verbose_name = "入社日", blank=True, null=True)
retirement_date = models.DateTimeField(verbose_name = "退職日", blank=True, null=True)
created_date = models.DateTimeField(verbose_name = "作成日", default=timezone.now)
published_date = models.DateTimeField(verbose_name = "更新日", blank=True, null=True)
def save(self, *args, **kwargs):
auto_now = kwargs.pop('published_date', True)
if auto_now:
self.published_date = timezone.now()
super(Employee, self).save(*args, **kwargs)
def __str__(self):
return self.name
$ python manage.py makemigrations master # テーブルを作成するファイルを作成
$ python manage.py migrate master # テーブルを作成
admin.py
作成したテーブルの追加/編集/削除するのに、Django adminを使います。
管理サイトへのログイン
$ python manage.py createsuperuser # 管理ユーザの作成 Username: admin Email address: Password: Password(again):
http://localhost:8000/adminにアクセスして、管理サイトにアクセスします。



モデルに電話番号を追加
$ vi master/models.py
import uuid
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.core.validators import RegexValidator
class Employee(models.Model):
""" 社員マスタ """
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(verbose_name = "名前", max_length=20,default='')
name_furigana = models.CharField(verbose_name = "ふりがな", max_length=20,default='')
# 電話番号を追加
tel_number_regex = RegexValidator(regex=r'^[0-9]+$',
message = (u"電話番号は半角英数のみで入力してください。例:09012345678"))
tel_number = models.CharField(validators=[tel_number_regex],
max_length=15, verbose_name='電話番号',blank=True, null=True)
entering_date = models.DateTimeField(verbose_name = "入社日", blank=True, null=True)
retirement_date = models.DateTimeField(verbose_name = "退職日", blank=True, null=True)
created_date = models.DateTimeField(verbose_name = "作成日", default=timezone.now)
published_date = models.DateTimeField(verbose_name = "更新日", blank=True, null=True)
def save(self, *args, **kwargs):
auto_now = kwargs.pop('published_date', True)
if auto_now:
self.published_date = timezone.now()
super(Employee, self).save(*args, **kwargs)
def __str__(self):
return self.name
# DBの更新
$ python manage.py makemigrations master
$ python manage.py migrate master

日本語表記に変換

$ vi master/models.py
import uuid
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.core.validators import RegexValidator
class Employee(models.Model):
""" 社員マスタ """
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(verbose_name = "名前", max_length=20,default='')
name_furigana = models.CharField(verbose_name = "ふりがな", max_length=20,default='')
tel_number_regex = RegexValidator(regex=r'^[0-9]+$',
message = (u"電話番号は半角英数のみで入力してください。例:09012345678"))
tel_number = models.CharField(validators=[tel_number_regex],
max_length=15, verbose_name='電話番号',blank=True, null=True)
entering_date = models.DateTimeField(verbose_name = "入社日", blank=True, null=True)
retirement_date = models.DateTimeField(verbose_name = "退職日", blank=True, null=True)
created_date = models.DateTimeField(verbose_name = "作成日", default=timezone.now)
published_date = models.DateTimeField(verbose_name = "更新日", blank=True, null=True)
def save(self, *args, **kwargs):
auto_now = kwargs.pop('published_date', True)
if auto_now:
self.published_date = timezone.now()
super(Employee, self).save(*args, **kwargs)
def __str__(self):
return self.name
# employeeを社員(日本語)に変更
class Meta:
verbose_name = '社員'
verbose_name_plural = '社員名簿'
# DBの更新
$ python manage.py makemigrations master
$ python manage.py migrate master

項目の追加
# master/admin.py
from django.contrib import admin
from .models import Employee
# 下記を追加
class EmployeeAdmin(admin.ModelAdmin):
list_display = ('name', 'name_furigana', 'entering_date' ,'id')
admin.site.register(Employee, EmployeeAdmin) # EmployeeAdminを追加

検索フォームの追加
# master/admin.py
from django.contrib import admin
from .models import Employee
class EmployeeAdmin(admin.ModelAdmin):
list_display = ('name', 'name_furigana', 'entering_date' ,'id')
# 検索フォームの追加
list_filter = ['entering_date']
search_fields = ['name', 'name_furigana']
admin.site.register(Employee, EmployeeAdmin)

forms.py
forms.pyで、入力欄の見た目を調整できます。
$ vi master/forms.py # 新規作成
from django import forms
from .models import Employee
from django.forms import widgets
from django.forms.fields import DecimalField, DateTimeField
class EmployeeForm(forms.ModelForm):
name = forms.CharField(max_length=20, label='名前',
help_text='フルネームを入力',
widget = widgets.Input(attrs={'size':30}))
created_date = forms.DateTimeField(label='作成日',
widget = widgets.Input(attrs={'readonly':'readonly', 'size':30}))
$ vi master/admin.py
from django.contrib import admin
from .models import Employee
from .forms import EmployeeForm # 追記
class EmployeeAdmin(admin.ModelAdmin):
form = EmployeeForm # 追記
list_display = ('name', 'name_furigana', 'entering_date' ,'id')
list_filter = ['entering_date']
search_fields = ['name', 'name_furigana']
admin.site.register(Employee, EmployeeAdmin)

学んだこと
- requirements.txtファイルを読み込んで、一度にpipインストール
- 管理画面のカスタマイズ方法
管理画面のカスタマイズの必要に迫られていたので、とても参考になりました!
ありがとうございました~!


