見出し画像

3時間でDjangoのECサイトアプリを作成

■手順1:| Djangoでアプリを開発しましょう。

ーーーーーーーーーーーーーー
制作日:2021年7月25日
制作時間:約12時間
ーーーーーーーーーーーーーー
【更新履歴 1.0】
ーーーーーーーーーーーーーー
無し
ーーーーーーーーーーーーーー

完成品は下記の通りです。

商品画面

画像24

支払画面

画像25

ショッピングカート

画像26

DB設計図

画像27


Django(ジャンゴ)とは

Djangoを使えば、コンテンツ管理システムやWikiからソーシャルネットワーク、ニュースサイトなど、高品質なWebアプリケーションを簡単に、少ないコードで作成できます。シンプルなWebアプリケーションであれば、数分間で作れてしまう場合もあります。もちろん、機能を拡張して複雑なWebアプリケーションを作成することもできます。
また、Djangoは、InstagramやPinterest、Mozilla、National Geographicなどのよく知られたWebアプリでも使われています。

Djangoを使うメリットは何?

開発時にDjangoを使用すると、次のようなメリットがあります。

高速な動作
フルスタック・フレームワーク(多数の便利な機能を装備)
セキュリティ的に安全な設計
メンテナンスの容易さ
自由に選べるプラットフォーム
学習コストの低さ

事前準備

1、Pythonのサイトにアクセスし、最新のPythonをダウンロード
以下のURLにアクセスします。

画像50

正常にPythonがインストールされたか確認する
デスクトップ右下の虫眼鏡マークをクリックして「cmd」と入力します。

画像51

検索結果として「コマンドプロンプト」が出てくるので、ダブルクリックします。

続いて、表示されたコマンドプロンプトにて

>python --version

とキーボードで入力し、Enterキーを押しましょう。

Python 3.8.2

と出力されれば、正常にPythonがインストールされています。

2 、pipをインストールする
pipとは、各種パッケージのインストールを簡単にするツールです。Djangoのインストールを簡単にするため、先にインストールしていきます。

先ほどのPythonのインストール時と同様に、デスクトップの右下の虫眼鏡ボタンから「cmd」と入力してコマンドプロンプトを起動し、

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

と入力してEnterキーを押しましょう。次のようなメッセージが出力され、コマンドプロンプトのフォルダに「get-pip.py」がダウンロードされてきます。

デフォルトだとコマンドプロンプト表示時のフォルダは「C:\Users\[ユーザー名]」ですから、「get-pip.py」も「C:\Users\[ユーザー名]」の中にダウンロードされます。

続いて、下記コマンドをコマンドプロンプトに入力してEnterキーを押します。

python get-pip.py

すると次のようなメッセージが表示され、pipがインストールされます。最後に「Successfully installed…」と表示されていればpipのインストールは完了です。

3 、virtualenvをインストールする
virtualenvは仮想環境を動かすためのソフトウェアです。今回はDjangoを仮想環境で動かします。

コマンドプロンプトにて次のコマンドを入力し、Enterキーを押します。

pip install virtualenv

今回はこの「C:\Python」の配下に仮想環境を作成します。

コマンドプロンプトを開いて次のコマンドを入力し、Enterキーを押します。

cd C:\users\xxxx\desktop\ecommerce

先ほど作成した「C:\users\xxxx\desktop\ecommerce」のフォルダに移動できます。

続いて、次のコマンドを入力してEnterキーを押します。

virtualenv env1

続いて、次のコマンドを打ってEnterキーを押し、「env1」フォルダに移動します。

cd env1

そのまま次のコマンドを実行して、仮想環境を有効化します。

activate

すると、下記のように「(env1)」がプロンプトに追加されます

(env1) C:\users\xxxx\desktop\ecommerce\>


いよいよDjangoをインストールしていきます。

まずDjangoをインストールし、基本設定を作成します。

画像1

Step 1 | Djangoをインストールする

コマンドプロンプトを開き、まだインストールしていない場合はPipがDjangoをインストールします。

Pip install Django

Step 2 | Projectを新規作成

Djangoをインストールされたので、プロジェクトを作成しましょう。django-adminstartproject「プロジェクト名」を使用します。

1 django-admin startproject ecommerce
2 cd C:\users\xxxx\desktop\ecommerce

Step 3 | appを新規作成


python manage.py startapp store

Step 4 | settings.pyにアプリを追加します

プロジェクトを開くと、プロジェクトフォルダーに作成したばかりのアプリが表示されます。 必ずsettings.py内のINSTALLED_APPSに新しいアプリを追加してください

画像2


///File: settings.py
INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'store.apps.StoreConfig',
]

Step 5 | サーバー起動

コマンドで「python manage.py runnserver」を実行し、

python manage.py runnserver
 

ポート127.0.0.1:8000を開きます。
すべてが正しく行われると、下の画像のようなデフォルトのDjangoランディングページが表示されます。

画像3

プロジェクトでアプリ(ストア)を作成したので、テンプレートを保存するフォルダーを作成しましょう。
HTMLファイルは、アプリ内の「テンプレート」というフォルダー内に保存されます。

Step 6 | Templates Folder 新規作成

ファイル構造は次のようになります。
appname(ストア)-> tempaltes-> appname(ストア)。

画像4

Step 7 | Templates html ファイルを新規作成

必要なテンプレートを作成しましょう。

Main.html→すべてが継承するテンプレート
Store.html→すべての製品を含むホームページ/ストアフロント
Cart.html→ユーザーのショッピングカート
Checkout.html→チェックアウトページ

h3タグに各ページの名前を追加して、テストできるようにします

画像5

画像6

次は「ビュー」と「URLパス」を作成してこれらのレンダリングを行います。

Step 8 | Viewsファイルを新規作成

アプリのviews.pyファイル内に3つのビューを作成します。 今は、作成したテンプレートをレンダリングしたいだけです。 とりあえず、空のコンテキストを作成して渡しましょう。

///File: store/views.py

from django.shortcuts import render
def store(request):
	context = {}
	return render(request, 'store/store.html', context)
def cart(request):
	context = {}
	return render(request, 'store/cart.html', context)
def checkout(request):
	context = {}
	return render(request, 'store/checkout.html', context)

Step 9 | URLsファイルを新規作成

次に、これらのビューを呼び出すための「URLパス」をいくつか作成する必要があります。

アプリ内に「urls.py」というファイルを作成します。

アプリ内で「ビュー」とともに「パス」をインポートし、urlpatternsリストを作成します。 「urlpatterns」内に、ビューごとに1つずつ、合計3つのパスを作成し、名前を付けます。

///File: store/urls.py

from django.urls import path
from . import views
urlpatterns = [
	#Leave as empty string for base url
	path('', views.store, name="store"),
	path('cart/', views.cart, name="cart"),
	path('checkout/', views.checkout, name="checkout"),
]

Step 10 | Base URLs 設定

新しいURLを接続するには、ルートディレクトリにあるurls.pyファイルを開いて「インクルード」する必要があります。

まず、「path」の直後に「inlcude」をインポートし、「store」内に作成した新しいurls.pyを指すパスを追加します。

///File: ecommerce/urls.py

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
   path('admin/', admin.site.urls),
   path('', include('store.urls')),
]

Step 11 | サーバーを起動

Webブラウザを起動して、下記URLをアドレスバーに入力してアクセスしてみましょう。

http://127.0.0.1:8000/

python manage.py runserver

画像7

テンプレートの作業を開始する前に、または画像、css、およびjsファイルの静的ファイルを作成しましょう。

Step 12 | "Static" Folder 新規作成

ルートディレクトリに「static」というフォルダを作成します。

新しい「静的」フォルダ内に、「CSS」というフォルダと「Images」という別のフォルダを作成しましょう。 これらのファイルには、すべてのCSSと画像が含まれます。

画像8

Step 13 | CSS File 新規作成

///File: static/css/main.css

body{
	background-color: blue;
}

Step 14 | STATICFILES_DIRES 設定追加

///File: settings.py

STATICFILES_DIRS = [
   os.path.join(BASE_DIR, 'static')
]

画像9

Step 15 | Static Files to Page追加

settings.pyで設定したら、スタイルシートをテンプレートに追加しましょう。 とりあえず、ホームページ「store.html」に追加してみましょう。

まず、静的をテンプレートにロードしてから、動的パスを使用してリンクを追加する必要があります。

画像10

///File: store/templates/store/store.html

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">

<h3>store</h3>

Step 16 | Image追加

///File: store/templates/store/store.html

画像11

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
<h3>store</h3>
<img src="{% static 'images/cart.png' %}">

Step 17 | Main Template作成

main.htmlを開き、「Ecom」というタイトルの標準htmlレイアウトを作成します。

///File: store/templates/store/main.html

<!DOCTYPE html>
<html>
   <head>
          <title>Ecom</title>
    </head>
    <body>
    </body>
</html>

Step 18 |  Viewport & Static追加

次に、各ページで使用できるようにするいくつかのものをテンプレートに追加しましょう。

<!DOCTYPE html>のすぐ下にload staticを追加して、画像とスタイルを追加できるようにします。 <title>の下に、ビューポートメタタグを追加して、ウェブサイトのモバイル対応を向上させます(これが何であるかわからない場合は、タグを追加するだけです)。最後に、すべてのページで利用できるようになるスタイルシートを追加します。 これはこのテンプレートから継承します。

///File: store/templates/store/main.html

  
<!DOCTYPE html>
{% load static %}
<html>
   <head>
          <title>Ecom</title>
       <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1" />
       <link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
    </head>
    <body>
    </body>
</html>

Step 19 | Bootstrap 導入

画像12

///File: store/templates/store/main.html

<!DOCTYPE html>
{% load static %}
<html>
<head>
	<title>Ecom</title>
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1" />
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
	<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
</head>
<body>

	<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
	<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body>
</html>

Step 20 | Container/Navbar Placeholder


ナビゲーションバーを追加する前に、テンプレートにプレースホルダーを追加して、すべてのページがメインテンプレートから継承されていることを確認しましょう。

<body>タグ内で、最初に「container」のクラスを使用してdivを作成し、すべてのコンテンツを他のテンプレート内の中央に配置します。
div内で、ページのブロックタグを作成しましょう。これは、他のすべてのページのコンテンツが設定される場所です。 <br>タグを追加して、コンテンツとページの上部を分離しました。
とりあえず、navbarプレースホルダーに<h3>タグを追加しましょう。 次のステップで実際のナビゲーションバーに移動します。

画像13

///File: store/templates/store/main.html

<!DOCTYPE html>
{% load static %}
<html>
<head>
	<title>Ecom</title>
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1" />
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
	<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
</head>
<body>
	<h3>Navbar Placeholder</h3>
   <hr>
    <div class="container">
           <br>
           {% block content %}

           {% endblock content %}
        </div>

	<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
	<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body>
</html>

Step 21 | Inheriting継承

画像14

画像15

画像16

///File: store/templates/store/store.html

{% extends 'store/main.html' %}
{% load static %}
{% block content %}
    <h3>Store</h3>
{% endblock content %}

///File: store/templates/store/cart.html

{% extends 'store/main.html' %}
{% load static %}
{% block content %}
    <h3>cart</h3>
{% endblock content %}

///File: store/templates/store/checkout.html

{% extends 'store/main.html' %}
{% load static %}
{% block content %}
    <h3>checkout</h3>
{% endblock content %}

画面で確認しましょう。

画像17

Step 22 | Bootstrap Navbar作成

navbarには、getbootstrap.comの何かを使用し、インストール後にカスタマイズを行います。 提供されたリンクに移動し、以下のようなナビゲーションバーを見つけて、コードをコピーします。

画像18

///Bootstrap Navbar code

<nav class="navbar navbar-expand-lg navbar-light bg-light">
 <a class="navbar-brand" href="#">Navbar</a>
 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
   <span class="navbar-toggler-icon"></span>
 </button>
 <div class="collapse navbar-collapse" id="navbarSupportedContent">
   <ul class="navbar-nav mr-auto">
     <li class="nav-item active">
       <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
     </li>
     <li class="nav-item">
       <a class="nav-link" href="#">Link</a>
     </li>
     <li class="nav-item dropdown">
       <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
         Dropdown
       </a>
       <div class="dropdown-menu" aria-labelledby="navbarDropdown">
         <a class="dropdown-item" href="#">Action</a>
         <a class="dropdown-item" href="#">Another action</a>
         <div class="dropdown-divider"></div>
         <a class="dropdown-item" href="#">Something else here</a>
       </div>
     </li>
     <li class="nav-item">
       <a class="nav-link disabled" href="#">Disabled</a>
     </li>
   </ul>
   <form class="form-inline my-2 my-lg-0">
     <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
     <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
   </form>
 </div>
</nav>

Step 23 | Dark Theme変更

Before:
<nav class="navbar navbar-expand-lg navbar-light bg-light">
After:
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">

画像19

Step 24 | ナビゲーションバーをカスタマイズする

追加したBootstrapナビゲーションバーをニーズに合わせてカスタマイズします。 

1-タイトルを「Navbar」から「Ecom」に変更し、URLをホームページに設定します
<nav class="navbar navbar-expand-lg navbar-light bg-light">
 <a class="navbar-brand" href="{% url 'store' %}">Ecom</a>
 <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
   <span class="navbar-toggler-icon"></span>
 </button>
 <div class="collapse navbar-collapse" id="navbarSupportedContent">
   <ul class="navbar-nav mr-auto">
     <li class="nav-item active">
       <a class="nav-link" href="{% url 'store %}">Store<span class="sr-only">(current)</span></a>
     </li>
2-余分なリンクを削除します
<li class="nav-item">
       <a class="nav-link" href="#">Link</a>
     </li>
     <li class="nav-item dropdown">
       <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
         Dropdown
       </a>
       <div class="dropdown-menu" aria-labelledby="navbarDropdown">
         <a class="dropdown-item" href="#">Action</a>
         <a class="dropdown-item" href="#">Another action</a>
         <div class="dropdown-divider"></div>
         <a class="dropdown-item" href="#">Something else here</a>
       </div>
     </li>
     <li class="nav-item">
       <a class="nav-link disabled" href="#">Disabled</a>
     </li>
3-フォームラッパーを削除します
<form class="form-inline my-2 my-lg-0">
     <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
     <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
   </form>
4-class = "form-inline my-2my-lg-0"のクラスでdivを作成します。 このラッパーは元のフォームの位置を保持する必要がありますが、ショッピングカートのリンクとログインボタンを保持するようになりました
<div class="form-inline my-2 my-lg-0">
5-ログインボタンを作成します。 ログインページを作成するまで、今のところリンクは空のままにしておきます
 <a href="#"class="btn btn-warning">Login</a>
6-カートページへのリンクを作成します
<a href="{% url 'cart' %}"> </a>
7-カートリンク内に、ショッピングカートの画像を追加します
<a href="{% url 'cart' %}">
<img  id="cart-icon" src="{% static 'images/cart.png' %}"> </a>
8-「カート合計」のIDを持つ段落タグにカート合計を追加します
 <p id="cart-total">0</p>

///File: static/css/main.css

<!DOCTYPE html>
{% load static %}
<html>
<head>
	<title>Ecom</title>
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1" />
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
	<link rel="stylesheet" type="text/css" href="{% static 'css/main.css' %}">
</head>
<body>
	<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
	  <a class="navbar-brand" href="{% url 'store' %}">Ecom</a>
	  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
	    <span class="navbar-toggler-icon"></span>
	  </button>
	  <div class="collapse navbar-collapse" id="navbarSupportedContent">
	    <ul class="navbar-nav mr-auto">
	      <li class="nav-item active">
	        <a class="nav-link" href="{% url 'store' %}">Store <span class="sr-only">(current)</span></a>
	      </li>
	 
	    </ul>
	    <div class="form-inline my-2 my-lg-0">
	     	<a href="#"class="btn btn-warning">Login</a>
	     	
	     	<a href="{% url 'cart' %}">
	    		<img  id="cart-icon" src="{% static 'images/cart.png' %}">
	    	</a>
	    	<p id="cart-total">0</p>
	    </div>
	  </div>
	</nav>
    <div class="container">
           <br>
           {% block content %}

           {% endblock content %}
        </div>

	<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
	<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body>
</html>

Step 25 | CSSをカスタマイズする

///File: static/css/main.css

body{
	background-color: hsl(0, 0%, 98%);
}
h1,h2,h3,h4,h5,h6{
	color:hsl(0, 0%, 30%);
}
.box-element{
	box-shadow:hsl(0, 0%, 80%) 0 0 16px;
	background-color: #fff;
	border-radius: 4px;
	padding: 10px;
}
.thumbnail{
	width: 100%;
	height: 200px;
	-webkit-box-shadow: -1px -3px 5px -2px rgba(214,214,214,1);
   -moz-box-shadow: -1px -3px 5px -2px rgba(214,214,214,1);
   box-shadow: -1px -3px 5px -2px rgba(214,214,214,1);
}
.product{
	border-radius: 0 0 4px 4px;
}
.bg-dark{
	background-color: #4f868c!important;
}
#cart-icon{
	width:25px;
	display: inline-block;
	margin-left: 15px;
}
#cart-total{
	display: block;
	text-align: center;
	color:#fff;
	background-color: red;
	width: 20px;
	height: 25px;
	border-radius: 50%;
	font-size: 14px;
}
.col-lg-4, .col-lg-6, .col-lg-8, .col-lg-12{
	margin-top: 10px;
}
.btn{
	border-radius: 0;
}
.row-image{
	width: 100px;
}
.form-field{
	width:250px;
	display: inline-block;
	padding: 5px;
}
.cart-row{
	display: flex;
   align-items: flex-stretch;
   padding-bottom: 10px;
   margin-bottom: 10px;
   border-bottom: 1px solid #ececec;
}
.quantity{
	display: inline-block;
	font-weight: 700;
	padding-right:10px;
	
}
.chg-quantity{
	width: 12px;
	cursor: pointer;
	display: block;
	margin-top: 5px;
	transition:.1s;
}
.chg-quantity:hover{
	opacity: .6;
}

.hidden{
	display: none!important;
}

画像20

次は下記の内容を作成する予定です。

store.html

画像21

cart.html

画像22

checkout.html

画像23

ここから先は

10,206字 / 22画像

¥ 998

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?