Python網頁設計-Django使用筆記(一):基本環境

Django系列文:

Python網頁設計-Django使用筆記(一):基本環境

Python網頁設計-Django使用筆記(二):實作104職缺爬蟲APP

Python網頁設計-Django使用筆記(三):Mezzanine CMS

Python網頁設計-Django使用筆記(四):LINE聊天機器人(部署至Heroku)

Python網頁設計-Django使用筆記(五):資料庫(CRUD)

Python網頁設計-Django使用筆記(六):幫網站加上Custom Domain

Python網頁設計-Django使用筆記(七):套用Bootstrap Template

Django 2.0版本注意事項在urls.py中已經不再需要使用url函式設定urlpatterns,而是改用path函式設定,本文有用到url函式的可依照需求換成path函式參考: [Python] Django 2.0 以 path 函式設定 urlpatterns

推薦閱讀

建立資料夾

mkdir django-app
cd django-app

建立虛擬環境

conda create -n django-app python=3.6
activate django-app

安裝Django

pip install django

檢查版本

python -m django --version

建立項目

django-admin startproject LINE
  • manage.py: 一个让你可以管理Django项目的工具程序。
  • LINE/__init__.py:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。
  • LINE/settings.py:Django项目的配置文件。
  • LINE/urls.py:Django项目的URL声明(URL映射),就像是你的网站的“目录”。
  • LINE/wsgi.py:项目运行在WSGI兼容Web服务器上的接口文件。

建立first應用程式

每個project可以建立一個或多個Application應用程式

python manage.py startapp first

建立first資料夾

  • __init__.py:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。
  • admin.py:可以用来注册模型,用于在Django的管理界面管理模型。
  • apps.py:当前应用的配置文件。
  • migrations:存放与模型有关的数据库迁移信息。
  • __init__.py:一个空文件,告诉Python解释器这个目录应该被视为一个Python的包。
  • models.py:存放应用的数据模型,即实体类及其之间的关系(MVC/MTV中的M)。
  • tests.py:包含测试应用各项功能的测试类和测试函数。
  • views.py:处理请求并返回响应的函数(MVC中的C,MTV中的V)。

建立templates資料夾

Django是MTV(Model, Template, View)架構,顯示模板(.html)放置在templates資料夾中
(在LINE目錄: manage.py所在位置)

md templates

建立static資料夾

Django會將使用到的圖形檔案、CSS或JS檔案,存在本機的static資料夾中。(在LINE目錄: manage.py所在位置)

md static

注意:

templates和static資料夾位在最上層目錄,與LINE應用程式平行

建立migration資料庫檔案

(在LINE目錄: manage.py所在位置)

python manage.py makemigrations

同步模型與資料庫

(在LINE目錄: manage.py所在位置)
產生db.sqlite3檔案

python manage.py migrate

啟動伺服器

python manage.py runserver    #預設網址為:http://127.0.0.1:8000/#如果想改在不同的IP端口執行python manage.py runserver 192.168.0.88 8080 

首先用 ipconfig 查詢本機 IP, 得到例如 192.168.0.88, 然後修改settings.py, 將此 IP 以字串格式放入 ALLOWED_HOST

ALLOWED_HOSTS = ['192.168.0.88']

視圖(view)與URL

設定settings.py

DEBUG = True為預設除錯模式,執行時會輸出錯誤訊息方便除錯,在上線部署時,要改成False增加網站安全性(第26列)

26 DEBUG = True

settings.py加入Application應用程式

INSTALLED_APPS(第40列)

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'first' #新增的網頁APP
]

settings.py設定Template路徑

設定templates路徑讓Django能讀取到模板(.html)檔案

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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',
],
},
},
]

settings.py設定語系和時區

LANGUAGE_CODE = 'zh-hant' #繁體中文TIME_ZONE = 'Asia/Taipei' #台北時區USE_I18N = True
USE_L10N = True
USE_TZ = True

settings.py設定static靜態檔的路徑

#大約在120行左右加入
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]

設定urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhello
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello)
]

設定views.py

from django.shortcuts import render
from django.http import HttpResponse
def sayhello(request):
return HttpResponse("Hello django!")

傳送參數(hello2)

修改urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhello,hello2
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello)
url(r'^hello2/(\w+)/$', hello2)
]

修改views.py

from django.shortcuts import render
from django.http import HttpResponse
def sayhello(request):
return HttpResponse("Hello django!")
def hello2(reuest,username):
return HttpResponse("Hello" + username)

模板的使用(hello3)

在templates資料夾中新增hello3.html
模板中讀取變數的語法為{{變數名稱}}
#{{ greeting }}佔位符 #
#{% for %} 模板指令#

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>第一個模板</title>
</head>
<body>
<h1>歡迎光臨: {{username}}</h1>
<h2>歡迎光臨: {{now}}</h2>
</body>
</html>

修改urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhello,hello2,hello3
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello)
url(r'^hello2/(\w+)/$', hello2)
url(r'^hello3/(\w+)/$', hello3)
]

修改views.py

連結hello3.html

from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponse
def sayhello(request):
return HttpResponse("Hello django!")
def hello2(reuest,username):
return HttpResponse("Hello" + username)
def hello3(request,username):
now=datetime.now()
return render(request,"hello3.html",locals())

加入static靜態檔案(hello4)

我們已在settings.py中加入了路徑資料夾:

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

這時候,如果要加入圖片和CSS,必須在static中再新增images和css的資料夾

修改urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from first.views import sayhello,hello2,hello3,hello4
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^$', sayhello),
url(r'^hello2/(\w+)/$', hello2),
url(r'^hello3/(\w+)/$', hello3),
url(r'^hello4/(\w+)/$', hello4),
]

修改views.py

from django.shortcuts import render
from datetime import datetime
from django.http import HttpResponse
def sayhello(request):
return HttpResponse("Hello django!")
def hello2(reuest,username):
return HttpResponse("Hello\n" + username)
def hello3(request,username):
now=datetime.now()
return render(request,"hello3.html",locals())
def hello4(request,username):
now=datetime.now()
return render(request,"hello4.html",locals())

在templates資料夾中新增hello4.html

並且在static/images中放入ball.png

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>顯示圖片的模板</title>
{% load static %}
<link href="{% static "css/style.css" %}" rel="stylesheet" type = "text/css" />
</head>
<body>
<div id ="home">
<img src="{% static "images/ball.png" %}" alt="歡迎光臨" width="32" height="32"/>
<span class="info">歡迎光臨:{{username}}</span>
<h2>現在時刻: {{now}}</h2>
</div>
</body>
</html>

在static/css中新增style.css

.info {
color:red;
font-size: 1.5em;
}

小結:

開啟 http://127.0.0.1:8000/ 會顯示

Hello django!

開啟 http://127.0.0.1:8000/hello2/david/ 會顯示

Hello david

開啟 http://127.0.0.1:8000/hello3/david/ 會顯示

歡迎光臨: david

歡迎光臨: Jan. 13, 2020, 10:48 a.m.

開啟 http://127.0.0.1:8000/hello4/david/ 會顯示含有圖片及CSS效果的:

歡迎光臨: david

歡迎光臨: Jan. 13, 2020, 10:48 a.m.

Written by

Machine Learning / Deep Learning / Python / Flutter cakeresume.com/yanwei-liu

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store