ICT関連の学習備忘録

ICTの学習をアウトプットするワークブックサイト

ICT関連の学習備忘録

2019/09/03:ECサイト作成(1)-プロジェクト作成、DB設定、商品一覧-

ネットショップ的な何かを作るプロジェクトをやって行きます。

事前準備・・って言っても大したことしないけど
http://shop.workbook.tokyo/
っていうURLにしたいので、
Nginxでプロキシ設定をして受け流しさせます。
ポートはDjangogirlsのブログで8000使ったので今回は8001を使います。

※一段落してからログ見つつ振り返ってるので順番が前後するかもしれません。。。

仮想環境に入る。
[user ~]$ source django01/myvenv/bin/activate

プロジェクトを作る!
(myvenv) [user django01]$ django-admin startproject shop .
CommandError: *****/manage.py already exists, overlaying a project or app into an existi
ng directory won't replace conflicting files
エラー!

やり直します。
プロジェクトを置く場所を作成してから、
その中でスタートプロジェクト→スタートアプリ
(myvenv) [user ~]$ mkdir django02
(myvenv) [user ~]$ cd django02
(myvenv) [user django02]$ django-admin startproject mysite .
(myvenv) [user django02]$ ls
manage.py  mysite
(myvenv) [user django02]$ python manage.py startapp shop
プロジェクトとアプリの土台というか箱が出来上がり。

django02プロジェクト(ディレクトリ)に
mysiteディレクトリと
shopディレクトリと
manage.pyファイルが出来上がりました。

取り急ぎMySQLを使えるようにしておきます。
mysite/manage.pyを開いて、import sysの直下に下記書き足す。
#mysite/manage.py
import os
import sys
import pymysql
pymysql.install_as_MySQLdb()
mysite内の設定ファイルを少し変更する
まず、settings.pyの中を自分の環境に合わせていくつか変更
#mysite/settings.py
#ホストアドレス設定
ALLOWED_HOSTS = ['127.0.0.1','shop.workbook.tokyo']	

#アプリケーション名を追加
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'shop',	
]

#データベースの設定
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'ShopDB',
        'USER': '*****',
        'PASSWORD': '*****',
    }
}
#ロケーションの変更
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

#静的ディレクトリ設定
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')
mysite/urls.pyの編集
管理者ページ(/admin)とindex(仮)のURL設定を記述
#mysite/urls.py
from django.urls import path, include
from django.contrib import admin
from django.urls import path
import shop.views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',shop.views.product_list, name='product_list'),
]
mysite設定は取り敢えず一旦修了。
今度はアプリケーション側の設定
shop/views.pyでtemplateをレスポンスするように設定する。
#shop/views.py
from django.shortcuts import render
from django.template.response import TemplateResponse


def product_list(request):
    products = Product.objects.order_by('name')
    return TemplateResponse(request, 'catalogue/product_list.html',
                            {'products':products})
忘れてたので、データベース作ります・・・。
shop/models.pyの中で2つのデータベースクラスを作成する。
#shop/models.py
class Category(models.Model):
    """カテゴリ
    """
    name = models.CharField("カテゴリ名", max_length=32)

    def __str__(self):
        return self.name


class Product(models.Model):
    """商品情報
    """
    category = models.ForeignKey(Category, null=True, blank=True,
                                on_delete=models.SET_NULL)
    name = models.CharField("商品名", max_length=128)
    price = models.PositiveIntegerField("価格")
    
    
    def __str__(self):
    return self.name
models.pyの用意が(データベースのテーブル定義)が出来たら、
ターミナルに戻って、マイグレーションしてテーブルを作成する。

マイグレーションする前のテーブル状態は下記(先に一回しちゃった←
mysql> SHOW TABLES;
+----------------------------+
| Tables_in_ShopDB           |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
んで、マイグレーションをして先程のmodels.pyの内容をテーブルに落とし込む。
[[user django02]$ python manage.py makemigrations shop
Migrations for 'shop':
  shop/migrations/0001_initial.py
    - Create model Category
    - Create model Product
(myvenv) [[user django02]$ python manage.py migrate shop
Operations to perform:
  Apply all migrations: shop
Running migrations:
  Applying shop.0001_initial... OK
もう一度データベースを見てみる。
mysql> SHOW TABLES;
+----------------------------+
| Tables_in_ShopDB           |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| shop_category              |
| shop_product               |
+----------------------------+

mysql> DESC shop_category;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

mysql> DESC shop_product;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(11)          | NO   | PRI | NULL    | auto_increment |
| name        | varchar(128)     | NO   |     | NULL    |                |
| price       | int(10) unsigned | NO   |     | NULL    |                |
| category_id | int(11)          | YES  | MUL | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
shop_categoryとshop_productが作成される。
DESCで見ると分かるけどプライマリーキーとかオートインクリメントが設定されている。
かつ、 ForeignKeyでcategory_idとcategoryのカラムidとリレーションシップが付けられている。

商品が何もないと確認もしようがないので手打ちで2商品追加します・・・w
ペン(カテゴリ:文房具)と、Pythonの本(カテゴリ:書籍)を仮で登録します。(本が安いww)
mysql> INSERT INTO shop_category VALUES(1,'文房具');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO shop_product VALUES(1,'ペン',150,1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO shop_category VALUES(2,'書籍');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO shop_product VALUES(2,'Pythonの本',450,2);
Query OK, 1 row affected (0.00 sec)
はい、追加しました。
追加したんですが、adminの管理ページに少し追記すれば
簡単にデータの追加や削除が出来るので先に(既に後だが)やっておく。
shop/admin.pyを開いて
下記のように追記。
#shop/admin.py
from django.contrib import admin
from .models import Category, Product


admin.site.register(Product)
admin.site.register(Category)
from .modelsのところで、models.pyを指し、
import Category, Productのところでmodels.pyの中の
class Categoryと、class Productを、読み込んだ後、

管理ページで管理できるように下の2行を該当クラスを登録。

区切りの最後にtemplateファイルを作って次回へ続く。
viws.pyでテンプレートのレスポンス先としてたファイルを作成
※return TemplateResponse(request, 'catalogue/product_list.html')←のファイル。
で、ファイルの中身は適当に・・最低限データベースから引き出せてるかの確認が出来れば良い程度に。今は。
(myvenv) [user django02]$touch shop/templates/catalogue/product_list.html
(myvenv) [user django02]$vi shop/templates/catalogue/product_list.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>商品一覧</title>
</head>

<body>
<a href="{% url 'product_list' %}">商品一覧</a>
<hr>

<ul>{% for product in products %}
  <li>[{{ product.category.name}}] {{ product.name }}:{{ product.price }}円</li>
  {% endfor %}
</ul>

</body>
</html>
で、表示確認ができたところで一旦修了。



前のページへ戻る