Let’s start Python #4 に参加して学んだこと!(Django Part1)

Webプログラミング

先週 Let’s start Python #4 ~Djangoの基礎~ に参加してきました!今回の講座内容はDjangoの基礎テーブルの作成管理ユーザの作成です。

Djangoとは

DjangoPythonを使用したフルスタックフレームワークです。

仮想環境の作成

自分は、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インストール
  • 管理画面のカスタマイズ方法

管理画面のカスタマイズの必要に迫られていたので、とても参考になりました!
ありがとうございました~!

タイトルとURLをコピーしました