---
# System prepended metadata

title: django

---

# 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 進階

