先週 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インストール
- 管理画面のカスタマイズ方法
管理画面のカスタマイズの必要に迫られていたので、とても参考になりました!
ありがとうございました~!