# django ## 第二堂: django 快速入門 :::info ### 簡介 本章節將快速使用 django 建置一個網頁框架,快速掌握開發的流程。 往後章節將根據此章節的概要進行延伸。 ::: ### 個人部落格的網站規劃 * 專案名稱: mblog * 透過 admin 管理文章之張貼、編輯、刪除,支援 markdown 語法。 * 使用 Bootstrap 網頁框架。 * 主頁顯示 文章標題、摘要、張貼日期。 * 點擊各文章可以顯示各文章內容。 * 文章可以解析 Markdown 語法。 ### 建立conda 環境 給django使用 ```shell= conda create --name django python=3.9 conda activate django ``` ### 安裝 django ```shell= pip install django ``` ### 建立一個 Django project ```shell= # 使用 django-admin 指令建立一個 mblog project django-admin startproject mblog cd mblog # 建立 Django 應用程式 (APP_MainSite) python manage.py startapp APP_MainSite # 使用 runserver 啟動 django 服務 # 指定 IP 位置為 0.0.0.0 通訊埠 8007 python manage.py runserver 0.0.0.0:8007 ``` 修改 /mblog/mblog/setting.py,允許 django 網頁架設在某 HOST IP 底下 ```python= ALLOWED_HOSTS = ["*"] ``` > [color=#cc209b] 這是一個安全機制,避免一些惡意的用戶進來攻擊網頁,所以會限定特定網頁架設在特定 IP 底下,讓其他用戶訪問。但我們這邊就直接開啟,允許所有連線。 此時,在網頁瀏覽器輸入 http://192.168.80.201:8007/ 就可以打開 Django 頁面 ![](https://hackmd.io/_uploads/Hk98u3aI3.png) --- ### Project 中的資料結構 ``` mblog/ [專案資料夾] ├── APP_MainSite/ │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations/ │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── manage.py [用來管理網站組態,命令網站的啟動等...,平常不會去修改代碼] └── mblog/ [此資料夾底下包含設定檔] ├── __init__.py ├── settings.py [Project的一些設定,由此控制] ├── urls.py [用來委派URL網址,和函數的對應關係] └── wsgi.py [溝通網頁伺服器 Apache 使用] ``` > [color=#fca044] [檔案資料結構繪圖工具](https://tree.nathanfriend.io/?s=(%27options!(%27fancy5~fullPath!false~trailingSlash5~rootDot5)~6(%276%27Edit%20me%20to%20generate4a0nic7tre7*diagram%27%3A3*%3A%7D4Use%20indentation0to%20indicat7fil7and3folder3nesting.02You%20can%20even32us7*2markdown3*2bullets%27)~version!%271%27)*%20%2004*2-%2030*4%5Cn*5!true6source!7e3%017654320*) --- ### 修改 Setting.py 設定引用APP、語言、時間 ```python= INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', "APP_MainSite" # 將APP_MainSite 導入 ] ... LANGUAGE_CODE = 'zh-hant' # 修改語言(中文-漢字) TIME_ZONE = 'Asia/Taipei' # 修改時區 ``` --- ### 建立資料庫 基本上,Django 是使用 ORM Model 操作資料庫,我們不太需要使用 **SQL語法**去操作資料庫。預設中,Django 會使用 ==SQLite== 來儲存資料庫內容,通過以下指令產生一個 **db.sqlite3** 檔案。 ```shell= python manage.py migrate ``` --- ### 修改 models.py 創建表格欄位 ```python= from django.db import models from django.utils import timezone # 安裝 pytz 讓 timezone 生效: pip install pyt # Create your models here. # create tableName = "Post" class Post(models.Model): # colName = title 文字類型的資料,最多可以填寫200個字元 title = models.CharField(max_length=200) # slug 每篇文章的網址 slug = models.CharField(max_length=200) # body 撰寫文章內容 body = models.TextField() pub_date = models.DateTimeField(default=timezone.now) class Meta: ordering = ('-pub_date',) def __str__(self): return self.title ``` 每次建立完 models.py 後,要對 SqliteDB 資料庫進行新增 ```shell= python manage.py makemigrations python manage.py migrate ``` --- ### 修改 admin.py 在後台管理介面能夠操作資料 ```python= from django.contrib import admin # 從 models.py 引用,剛剛定義的 Post class from .models import Post # Register your models here. # 定義管理介面的資料顯示欄位 class PostAdmin(admin.ModelAdmin): list_display = ("title","slug","pub_date") # 讓管理介面可以操作 Post table admin.site.register(Post,PostAdmin) ``` --- ### 建立超級使用者 ```shell= # 建立超級使用者 python manage.py createsuperuser # 更改超級使用者密碼 python manage.py changepassword (username) ``` runserver 後,可以在 當前ip位置/admin/ 對於table的資料進行操作(http://192.168.80.201:8007/admin/ ) ![](https://hackmd.io/_uploads/SkXpGAR83.png) ![](https://hackmd.io/_uploads/HyhSR1kwh.png) ![](https://hackmd.io/_uploads/rykYAkyD2.png) --- ## django 進階