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

Webプログラミング

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

Djangoとは

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

仮想環境の作成

自分は、WSL+Ubuntu環境で実施しました。

1
2
3
4
5
6
7
8
9
$ mkdir elvmember               # 作業ディレクトリの作成
$ cd elvmember
$ python -m venv myvenv         # 仮想環境を作成
$ source myvenv/bin/activate    # 仮想環境を起動
(myvenv) $                      # プロンプトが変更されたことを確認(※以降は省略)
 
# 仮想環境の停止方法
(myvenv) $ deactivate
$                               # プロンプトが元に戻る

Djangoのインストール

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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

プロジェクトの作成

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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にアクセスし、以下の画面が表示されることを確認

アプリ作成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ 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を使います。

 

管理サイトへのログイン

1
2
3
4
5
$ python manage.py createsuperuser              # 管理ユーザの作成
Username: admin
Email address:
Password:
Password(again):

http://localhost:8000/adminにアクセスして、管理サイトにアクセスします。

 

モデルに電話番号を追加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ 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

 

日本語表記に変換

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ 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

 

項目の追加

1
2
3
4
5
6
7
8
9
# 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を追加

 

検索フォームの追加

1
2
3
4
5
6
7
8
9
10
11
12
# 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で、入力欄の見た目を調整できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ 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をコピーしました