A. 在INSALLED APPS 末端加入 'myapp',
B. 設定 TAMPLATE 路徑 os.path.join(BASE_DIR, 'templates')
C. 設定語言繁體中文 zh-Hant
D. 完成設定後 儲存。
16. 編輯urls.py,新增一個首頁path以及對應到的函式
.
18. 更新網頁可見 Hello Django!
19. 網址直傳參數 (字串)
A. 編輯 urls.py 增加sayheelo2函式 路徑
B. 編輯 myapp\views.py 加入sayheelo2函式
C. 頁面執行結果
11/2
Python Package Index - 分享的套件包網站
ORM - Python 使用的資料庫方式不同於C使用的 my_sql
ORM - Object Relational Mapping,程式設計技術,用於實現物件導向程式語言裡不同類型系統的資料之間的轉換。 從效果上說,它其實是建立了一個可在程式語言裡使用的「虛擬物件資料庫」
物件導向 - 軟體可以像硬體一樣,做成套件包有共通性,供其它使用者使用
功能導向 - 依廠商需求製作,case by case。
python 資料型式:
今天老師範例連結
今天建立 youtube 影片的網頁, 建立資料庫, 可新增刪除影片
老師筆記:
影音筆記
VIDEO
一、建立專案和app
mkvirtualenv youtube (建立youtube虛擬環境)
pip install django
django-admin startproject youtubeproj (建立 youtubeproj)
cd youtubeproj (進入youtubeproj 目錄)
python manage.py startapp youtubeapp (建立youtubeapp)
2. settings.py 設定
編輯 youtubeproj\y outubeproj\ setting.py
...略..
INSTALLED_APPS = [
'django.contrib.admin' ,
'django.contrib.auth' ,
'django.contrib.contenttypes' ,
'django.contrib.sessions' ,
'django.contrib.messages' ,
'django.contrib.staticfiles' ,
'youtubeapp', #在INSTALLED_APPS加入建立的app
...略..
.TEMPLATES = [
{
'BACKEND' : 'django.template.backends.django.DjangoTemplates' ,
'DIRS' : [os. path. join(BASE_DIR, 'templates') ], #設定templates路徑 ...略..
LANGUAGE_CODE = ' zh-Hant ' #設定語言
TIME_ZONE = ' Asia/Taipei ' #設定時區
...略..
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os. path. join(BASE_DIR, 'static'),
]
#設定 static 路徑
3.編輯 youtubeproj\youtubeproj\urls.py
...略..
from django.contrib import admin
from django.urls import path
from youtubeapp.views import home
urlpatterns = [
path('admin/' , admin. site. urls),
path('', home),
]
4. 編輯 youtubeproj\youtubeapp\views.py
from django.shortcuts import render
# Create your views here.
def home (request):
return render(request, 'index.html', locals ())
5.建立index,html程式, 置於第一階youtubeproj 目錄下建置templates 目錄
youtubeproj\templates\index.html
<!DOCTYPE html>
<html>
<head>
<title>
影片播放網站
</title>
</head>
<body>
<iframe width="560" height="315"
src=" https://www.youtube.com/embed/W40mDCqWyYo "
frameborder="0"
allow="accelerometer;
autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
</iframe>
#本段由youtube 分享 -> 嵌入複製程式碼
</body>
</html>
6. youtubeproj路徑下執行
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
7. 檢視網頁
二、設定影片影片大小及連結點改為變數
VIDEO
影片嵌入程式碼是採用iframe的標籤,其主要的參數有width, height, src。
1.修改index.html 中 iframe 中 width, height, src為變數 {{width}}、{{height}}、{{src}}
youtubeproj\templates\index.html
<iframe width="{{width}} " height="{{height}} "
src="https://www.youtube.com/embed/{{src}} "
frameborder="0"
allow="accelerometer;
autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
</iframe>
修改iframe 中的寬、高、連結點
2. youtubeproj\youtubeapp\views.py 設定影片的寬、高和連結點
三、建立資料庫
1. 編輯 youtubeproj\youtubeapp\models.py
from django.contrib import admin
# Register your models here.
class video(models.Model):
name = models.CharField(max_length=50, null=False)
width = models.IntegerField(default = 1280)
height = models.IntegerField(default = 720)
src = models.CharField(max_length=50, null=False)
def _str_(self):
return self.name
2.開啟admin.py撰寫註冊video資料庫到後台管理
1
2
3
4
5
6
from django.contrib import admin
from youtubeapp.models import video
# Register your models here.
admin. site. register(video)
執行下列指令,
python manage.py makemigrations (生成同步數據庫的代碼)
python manage.py migrate (同步數據庫-也就是對數據庫執行真正的遷移動作)
python manage.py createsuperuser (建立尸superuser 帳號 admin 密碼 1234 )
python manage.py runserver
3. 127.0.0.1:8000/admin 進入後台,
4. 建立第一筆資料 Name : Django
5.編輯views.py取得一筆資料
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.shortcuts import render
from youtubeapp.models import video
# Create your views here.
def home (request):
try :
v = video. objects. get(name= "Django")
width= v. width
height= v. height
src = v. src
except :
print ("沒找到")
width= 1280
height= 720
src = 'W40mDCqWyYo'
return render(request, 'index.html' , locals ())
6. 網頁 測試執行結果 - 檢視 127.0.0.1:8000頁面
四、[ Django ] 影片網站資料庫及後台管理(四) - 讀取所有資料
1.修改views.py程式
1
2
3
4
5
6
7
8
9
10
11
from django.shortcuts import render
from youtubeapp.models import video
# Create your views here.
def home (request):
try :
videos = video. objects. all()
except :
print ("沒有任何資料")
return render(request, 'index.html' , locals ())
2. 修改index.html
youtubeproj\templates\index.html
<!DOCTYPE html>
<html>
<head>
<title>
影片播放網站
</title>
</head>
<body>
{% for video in videos %}
<iframe
width="{{video.width }}"
height="{{video.height }}"
src="https://www.youtube.com/embed/{{video.src }}"
frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
</iframe>
{% endfor %}
</body>
</html>
每一次循環中,模板系統會渲染在 {% for %} 和 {% endfor %} 之間的所有內容。
3. 再新增一筆資料
檢視網頁, 目前有兩筆影片
五、[ Django ] 影片網站資料庫及後台管理(四) - 讀取所有資料
1. 在urls.py增加路徑
from django.contrib import admin
from django.urls import path
from youtubeapp.views import home , pos t
urlpatterns = [
path( 'admin/' , admin . site . urls),
path( '' , home) ,
path('index/', home),
path('post/', post)
]
2. views.py 新增post 函式
from django.shortcuts import render , redirect
from youtubeapp.models import video
# Create your views here.
def home (request):
try :
videos = video. objects. all()
except :
print ("沒有任何資料" )
return render(request, 'index.html' , locals ())
def post(request):
if request.method == "POST":
name = request.POST["videoname"]
width = int(request.POST["videowidth"])
height = int(request.POST["videoheight"])
src = request.POST["videosrc"]
v = video.objects.create(name=name, width=width, height=height, src=src)
v.save
return redirect('/index/')
return render(request, 'post.html', locals())
3. templates目錄下新增 post.html
<!DOCTYPE html>
<html>
<head>
<title> 新增一筆資料 </title>
</head>
<body>
<form action="/post/" method = "POST" name = "form1">
{% csrf_token %}
<div>
名稱 : <input type="text" name="videoname" /></br>
寬度 : <input type="text" name="videowidth" /></br>
高度 : <input type="text" name="videoheight" /></br>
來源 : <input type="text" name="videosrc" /></br>
<input type="submit" name="送出資料" /></br>
</div>
</form>
</body>
</html>
4. 啟動 post.html ( 127.0.0.1:8000/post )
5. 新增影片, 並檢視網頁, 可得三影片
六、影片網站資料庫及後台管理(六) - 表單模型化
輸入資料需要驗證,若未驗證容易引起不可遇期的問題發生。本篇文章在於使用Python程式,設計驗證表單。
1.增加驗證表單程式form.py (置於 youtubeappyoutubeapp目錄下)
1
2
3
4
5
6
from django import forms
class PostForm (forms. Form):
name = forms. CharField(max_length= 50 , initial= '')
width = forms. IntegerField(max_value= 1280 , min_value= 640 )
height = forms. IntegerField(max_value= 1280 , min_value= 640 )
src = forms. CharField(max_length= 50 , initial= '')
2.views.py 增加 postform 函式。
from django.shortcuts import render, redirect
from youtubeapp.models import video
from youtubeapp.form import PostForm
# Create your views here.
def home(request):
try:
videos = video.objects.all()
except:
print("沒有任何資料")
return render(request, 'index.html', locals())
def post(request):
if request.method == "POST":
name = request.POST["videoname"]
width = int(request.POST["videowidth"])
height = int(request.POST["videoheight"])
src = request.POST["videosrc"]
v = video.objects.create(name=name, width=width, height=height, src=src)
v.save
return redirect('/index/')
return render(request, 'post.html', locals())
def postform(request):
postform = PostForm()
return render(request, "postform.html", locals())
3. 增加路徑 urls.py
from django.contrib import admin
from django.urls import path
from youtubeapp.views import home, post, postform
urlpatterns = [
path('admin/', admin.site.urls),
path('',home),
path('index/', home),
path('post/', post),
path('postform/', postform),
]
4. 製作驗證表單 postform.html
<form action="." method="POST" name="form1">
{% csrf_token%}
{{postform}}
</form>
5. 開啟網頁檢視
6. 右鍵 - 檢查
檢視原始碼
(七) - 新增影片並驗證width, height 只能輸入數字
加入下方連結影片, 並使用驗證表單。
1. 新增 post2.html
<!DOCTYPE html>
<html>
<head>
<title>資料新增並驗證</title>
</head>
<body>
<form action="." method="POST" name="form1">
{% csrf_token%}
<table border="1" cellspacing="1" ncellpadding="4">
<tr><th>影片名稱</th><td>{{postform.name}}</td></tr>
<tr><th>影片寬度</th><td>{{postform.width}}</td></tr>
<tr><th>影片高度</th><td>{{postform.height}}</td></tr>
<tr><th>影片來源</th><td>{{postform.src}}</td></tr>
</table>
<input type="submit" name="button1" id="button1" value="送出"/>
<input type="reset" name="button2" id="button2" value="重置"/>
</form>
</body>
</html>
2. urls.py 加入post2 路徑
from django.contrib import admin
from django.urls import path
from youtubeapp.views import home, post, postform, post2
urlpatterns = [
path('admin/', admin.site.urls),
path('',home),
path('index/', home),
path('post/', post),
path('postform/', postform),
path('post2/', post2),
]
3. views.py 加入post2 路徑
....略....
def postform(request):
postform = PostForm()
return render(request, "postform.html", locals())
def post2(request):
if request.method == "POST":
postform = PostForm(request.POST)
if postform.is_valid():
name = postform.cleaned_data["name"]
width = int(postform.cleaned_data["width"])
height = int(postform.cleaned_data["height"])
src = postform.cleaned_data["src"]
v = video.objects.create(name=name, width=width, height=height, src=src)
v.save
return redirect('/index/')
else:
print("證驗有誤")
else:
postform = PostForm()
return render(request, 'post2.html', locals())
4. 測試頁面-影片寬度和高度只能輸入數字, 執行加入
5. 開啟網頁檢視
八、影片網站資料庫及後台管理 - 用下拉式選單的方式, 刪除資料
1.新增 delete.html
<!DOCTYPE html>
<html>
<head>
<title>刪除資料</title>
</head>
<body>
<h1>刪除資料</h1>
<form action="." method="POST" name="form1">
{% csrf_token%}
請輸入欲刪除的影片名稱:
<select name="videoname">
{% for video in videos %}
<option value="{{video.name}}">{{video.name}}</option>
{% endfor %}
</select>
<input type="submit" name="button" id="button" value="確定刪除"/>
</form>
</body>
</html>
2. urls.py 加入 delete delete 路徑
from django.contrib import admin
from django.urls import path
from youtubeapp.views import home, post, postform, post2, delete
urlpatterns = [
path('admin/', admin.site.urls),
path('',home),
path('index/', home),
path('post/', post),
path('postform/', postform),
path('post2/', post2),
path('delete/', delete),
]
3. views.py 下方加入delete 函式
....略....
def delete (request):
if request. method == "POST" :
videoname= request. POST['videoname' ]
try :
v = video. objects. get(name= videoname)
v. delete()
return redirect('/index/' )
except :
print ("讀取錯誤" )
try :
videos = video. objects. all()
except :
print ("沒有任何資料")
return render(request, "delete.html" , locals ())