2024年2月12日 星期一

Django 5.0:用擲骰子來說視圖(View)如何傳送變數到模版(Template)

 參考資料:Python架站特訓班Django 3最強實戰

1.打開cmd,輸入mkvirtualenv passdata命令建立虛擬環境。


2.輸入pip install django建立Django套件。

3.輸入django-admin startproject passdata來建立Djano專案,利用cd passdata來切換目錄

4.輸入python manage.py startapp passdataapp來建立應用程式,利用md static以及md templates來建立static以及templates目錄。

5.輸入python manage.py migrate指令進行模型(Model)與資料庫(Database)的同步。

6.輸入python manage.py runserver指令來啟動Server。

7.打開瀏覽器,輸入http://127.0.0.1:8000/網址,開啟首頁。

8.環境設定,設定settings.py,passdata\settings.py。

範例一、傳遞變數到Template模版
9.環境設定,設定settings.py,passdata\settings.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
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
"""
Django settings for passdata project.

Generated by 'django-admin startproject' using Django 5.0.2.

For more information on this file, see
https://docs.djangoproject.com/en/5.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.0/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-&no51-lnfzi&69rr-zvymsabq0=ay5ydi-auxfn4%en^623xm)'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'passdataapp',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'passdata.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR/'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',                
            ],
        },
    },
]

WSGI_APPLICATION = 'passdata.wsgi.application'


# Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/5.0/topics/i18n/

LANGUAGE_CODE = 'zh-hant'

TIME_ZONE = 'Asia/Taipei'

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/

STATIC_URL = 'static/'
STATICFILES_DIRS = [
    BASE_DIR/'static',
    ]
# Default primary key field type
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

重新整理

10.設定URL,passdata\urls.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
"""
URL configuration for passdata project.

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/5.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from passdataapp.views import dice

urlpatterns = [
    path('admin/', admin.site.urls),
    path('dice/', dice),
]

11.定義dice()函式passdataapp\views.py。

1
2
3
4
5
6
7
from django.shortcuts import render
import random #加入random模組

# Create your views here.
def dice(request):
    no = random.randint(1, 6) #亂數產生1-6其中一個數字
    return render(request, "dice.html", {"no":no})

12.新增templates\dice.html檔案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html>
<html>
<head>
	<meta charset='utf-8'>
	<title>擲骰子</title>
</head>
<body>
	<h1>點數:{{no}}</h1>
</body>
</html>

執行結果:
13.開啟瀏覽器,輸入http://127.0.0.1:8000/dice/。

範例二、使用locals()傳遞變數到Template模版(一)-同時顯示3顆骰子點數
14. 設定dice2的URL,passdata\urls.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
"""
URL configuration for passdata project.

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/5.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from passdataapp.views import dice, dice2

urlpatterns = [
    path('admin/', admin.site.urls),
    path('dice/', dice),
    path('dice2/', dice2),
]

15.定義dice2()函式passdataapp\views.py。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from django.shortcuts import render
import random #加入random模組

# Create your views here.
def dice(request):
    no = random.randint(1, 6) #亂數產生1-6其中一個數字
    return render(request, "dice.html", {"no":no})

def dice2(request):
    no1 = random.randint(1, 6) #亂數產生1-6其中一個數字
    no2 = random.randint(1, 6) #亂數產生1-6其中一個數字
    no3 = random.randint(1, 6) #亂數產生1-6其中一個數字
    #使用locals()函式來傳遞所有的區域變數
    return render(request, "dice2.html", locals())

16.新增templates\dice2.html檔案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<!DOCTYPE html>
<html>
<head>
	<meta charset='utf-8'>
	<title>擲骰子 (二)</title>
</head>
<body>
	<h1>點數{{no1}}</h1>
	<h1>點數二:{{no2}}</h1>
	<h1>點數三:{{no3}}</h1>
</body>
</html>

執行結果:
17.開啟瀏覽器,輸入http://127.0.0.1:8000/dice2/。

範例三、使用locals()傳遞變數到Template模版(二)-顯示玩家名稱、骰子點數和累計數。
18. 設定dice3的URL,passdata\urls.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
"""
URL configuration for passdata project.

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/5.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from passdataapp.views import dice, dice2, dice3

urlpatterns = [
    path('admin/', admin.site.urls),
    path('dice/', dice),
    path('dice2/', dice2),
    path('dice3/', dice3),
]

19.定義dice3()函式passdataapp\views.py。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from django.shortcuts import render
import random #加入random模組

# Create your views here.
def dice(request):
    no = random.randint(1, 6) #亂數產生1-6其中一個數字
    return render(request, "dice.html", {"no":no})

def dice2(request):
    no1 = random.randint(1, 6) #亂數產生1-6其中一個數字
    no2 = random.randint(1, 6) #亂數產生1-6其中一個數字
    no3 = random.randint(1, 6) #亂數產生1-6其中一個數字
    #使用locals()函式來傳遞所有的區域變數
    return render(request, "dice2.html", locals())
    
times = 0
def dice3(request):
    global times    #宣告global變數
    times = times + 1
    local_times = times
    username = "David"
    no = random.randint(1, 6) #亂數產生1-6其中一個數字
    return render(request, "dice3.html", locals())

20.新增templates\dice3.html檔案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<!DOCTYPE html>
<html>
<head>
	<meta charset='utf-8'>
	<title>擲骰子 (三)</title>
</head>
<body>
	<h1>玩家:{{username}}</h1>
	<h1>點數:{{no}}</h1>
	<h1>累計次數:{{local_times}}</h1>
</body>
</html>

執行結果:
17.開啟瀏覽器,輸入http://127.0.0.1:8000/dice3/。


沒有留言:

張貼留言