[不做怎麼知道系列之Android開發者的30天後端養成故事 Day4] - 動手做做看 #捲起袖子 #初探Django # DjangoHelloWorld

今天該做什麼呢?

今天我們要來用用看 Django 這個框架拉,我們對 Django 都還不熟,那麼就直接照著教學做做看,看會遇到哪些問題,遇到問題就來解決出問題的人 ! 阿不是,是解決出現的問題~

我參考 安裝 Django | Django Girls Tutorial 中文版教材,但老實說,要看中文的文件或書等等資源的時候,你要有這份文件已經過期的心理準備,你需要花費時間去針對過期文件來 debug,RS 建議能 K 英文官方文件的人就盡量 K,但是當你 K 得很心灰意冷的時候,你也是可以考慮參考中文文件,頂多加上 debug 的時間而已,也順便練練 trouble-shooting 的能力,何嘗不是一種好方法呢 ?

沒有頁碼的目錄

  • 那我們就開始囉!
    • 安裝虛擬環境
      • 創立一個虛擬環境
      • 進入到你的虛擬環境
    • 在虛擬環境下,安裝 Django
      • 創建 Django 專案 (Project)
      • 連結 DB (這邊用 django 預設的 sqlite)
    • Django 跑起來! (HelloWorld)
      • 執行我們的 django server
  • 那麼,我們的網站能做什麼呢?
    • 替我們的網站新增 App
    • 告訴 Project ,我們有一個新的 App 哦
    • 替 App 加入功能
    • 進入到 django shell 驗證資料庫的資料
    • 查詢/新增/刪除使用者
      • 查詢使用者
      • 新增使用者
      • 刪除使用者
    • 有了使用者就可以試著在部落格 Po 文囉!
      • 透過 Django 來新增一筆文章到資料庫
      • 如果沒有 Django 的話,我需要用 SQL 語法這樣寫
  • 所以我們知道怎麼在 DB 新增資料了,然後呢?
    • 利用 Django admin 的後台系統
    • 再次讓 Django 跑起來!
    • 見證你在 Django 打造的第一個後台系統
      • 新增管理員使用者
      • 再回到瀏覽器,輸入剛剛的管理員帳號
      • 我們先來把之前新增的個人帳號變為超級使用者 !
      • 再來確認一下我們之前寫的文章還在不在?

那我們就開始囉!

因為我們在架設網站的時候,多多少少會引用不同的套件,套件和套件之間可能會有相互依賴關係,而每個套件會有不同的版本,這就會造成很多很多很多的變因,所以呢! 我們需要虛擬環境,你可以把它想成是 VirtualBox 之類的概念,只是 VirtualBox 裝的是作業系統,而我們是裝不同的版本套件。

安裝虛擬環境

創立一個虛擬環境

$ python -m venv your-env-name

進入到你的虛擬環境

$ your-env-name\Scripts\activate.bat

在虛擬環境下,安裝 Django

$ pip install django==3.0.3

可到 django 官網 查詢目前最新的穩定版。

創建 Django 專案 (Project)

$ python django-env\Scripts\django-admin.py startproject mysite .

在這邊我們是建立 Project,而之後我們可以在這個 Project 底下建立許多個 App,可以是部落格,可以是個人首頁,也可以是電商網站等;一個 App 可以被多個 Project 所使用,也就是說,你在目前的 A 專案寫了一個部落格,可是我還有 B 專案也會用到部落格,就可以直接從 A 專案複製部落格 App 到 B 專案。

連結 DB (這邊用 django 預設的 sqlite)

~~$ python manage.py syncdb~~ (在 django 1.7 已被 deprecated)

改用

$ python manage.py makemigrations

$ python manage.py migrate

參考 (2015) Django manage.py Unknown command: ‘syncdb’

Django 跑起來! (HelloWorld)

執行我們的 django server

$ python manage.py runserver

那麼,我們的網站能做什麼呢?

替我們的網站新增 App

$ python manage.py startapp blog

告訴 Project,我們有一個新的 App 哦

在 mysite/setting.py 中,找到 INSTALLED_APPS 的 list,在最後加入 blog

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]

替 App 加入功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(
default=timezone.now()
)
published_date = models.DateTimeField(
blank=True, null=True
)

# 發布就是加上發布時間,並且存到 db 裡
def publish(self):
self.published_date = timezone.now()
self.save()

def __str__(self):
return self.title

這份 code 來自 Django Girls Tutorial

進入到 django shell 驗證資料庫的資料

$ python manage.py shell

1
2
3
4
>>> from blog.models import Post

>>> Post.objects.all()
<QuerySet []>

確認裡面還沒有任何的 Post,沒錯,因為我們才剛創麻~ 如果要新增文章的話,我們還需要知道是 “誰” 寫了這篇文章,那麼就來看看怎麼新增使用者吧。

查詢/新增/刪除使用者

查詢使用者

1
2
3
>>> User.objects.all()
<QuerySet []>
# 目前裡面也是沒有任何使用者 der~

新增使用者

1
2
3
4
5
6
7
8
9
10
11
# 我們先新增一筆 RS 的使用者
>>> user = User.objects.create_user(username='RS',
password='topsecret', email='rs@handsome.com')
>>> user.save()
>>> User.objects.all()
<QuerySet [<User: RS>]>

# 再新增一筆空的,等等用來測試刪除使用者的
>>> User.objects.create_user(username='test_user').save()
>>> User.objects.all()
<QuerySet [<User: RS>, <User: test_user>]>

刪除使用者

1
2
3
4
>>> User.objects.get(username='test_user').delete()
(1, {'admin.LogEntry': 0,
'auth.User_groups': 0, 'auth.User_user_permissions': 0,
'blog.Post': 0, 'auth.User': 1})

有了使用者就可以試著在部落格 Po 文囉!

雖然我們還看不到部落格長什麼樣子,但我們已經能透過 django 框架,寫一篇文章進入到資料庫裡,你可能會覺得:「這樣有什麼了不起?」,RS 跟你說,還真的了不起,在沒有框架的輔助下,我們要新增一筆資料到資料庫裡,是需要寫 SQL 語法的,現在你只需要幾行 python codes !

透過 Django 來新增一筆文章到資料庫

1
2
3
4
5
6
7
8
9
10
11
12
# 寫一篇 Po 文
>>> Post.objects.create(author=user,
title='Sample title', text='test content')
<Post: Sample title>

# 查看是不是真的有新增成功
>>> Post.objects.all()
<QuerySet [<Post: Sample title>]>

# 也可以抓出不同作者的文章
>>> Post.objects.filter(author=user)
<QuerySet [<Post: Sample title>]>

如果沒有 Django 的話,我需要用 SQL 語法這樣寫

1
INSERT INTO Post (username, title, text) VALUES ("RS", "Sample title", "Test content.")

這樣看起來是不是用 Django 比較好理解也比較好寫,而且這行還不包含使用者的詳細資料 (password, email, etc…)

所以我們知道怎麼在 DB 新增資料了,然後呢?

在瀏覽器開起來使用的感覺,跟下指令、寫程式操作的感覺,還是差很多的,所以接下來我們就要想辦法讓它看起來像部落格囉 ! 我們可以利用 Django admin 裡有內建的後台管理系統,來試試看吧。

利用 Django admin 的後台系統

編輯 blog/admin.py

1
2
3
4
5
6
from django.contrib import admin
from .models import Post

# 將我們寫在 model 裡的 Post
# 註冊到 admin 裡面
admin.site.register(Post)

再次讓 Django 跑起來!

$ python manage.py runserver

見證你在 Django 打造的第一個後台系統

打開瀏覽器,輸入 http://127.0.0.1:8000/admin/,這時候瀏覽器會自動跳轉到 http://127.0.0.1:8000/admin/login/?next=/admin/,你就可以看到登入的畫面。

然後輸入我們前面所創立的 RS 使用者帳號密碼,疑,怎麼會不能登入?

原來是因為我們沒有權限,確實我們剛在新增 RS 使用者的時候,只有填入 username, password, email 而已,並沒有指定管理員的身分給它,那該怎麼辦呢?

新增管理員使用者

1
2
3
4
5
6
7
8
9
> python manage.py createsuperuser
System check identified some issues:

WARNINGS:
blog.Post.created_date: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
Username (leave blank to use 'rs'):

# 這個時候就可以填入我們的超級使用者(管理員)的帳號囉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> python manage.py createsuperuser
System check identified some issues:

WARNINGS:
blog.Post.created_date: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
Username (leave blank to use 'rs'): admin
Email address: rs@admin.com # 再填入 email
Password: # 以及密碼
Password (again): # 密碼確認
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y # 最後確認同意創立管理員帳號
Superuser created successfully.

再回到瀏覽器,輸入剛剛的管理員帳號

登入成功後,就會進到後台的管理畫面,就可以去查看/新增/修改各種資料,像是 使用者資訊、部落格文章 等等。

我們先來把之前新增的個人帳號變為超級使用者 !

先點 Users 的 Change 按鈕,看到 RS 的這個帳號在 STAFF STATUS 這個欄位是打叉的,表示這個帳號無法登入後台,那我們就讓它可以 !

點進去 RS 裡面,往下滾動到 Permissions,將 Staff status 和 Superuser status 打勾,最後按 Save。

搭拉,變成綠勾勾了,我們事不宜遲,馬上換成 RS 來登入 XD

壓呼,用 RS 登入成功成功 !

再來確認一下我們之前寫的文章還在不在?

點進去 BLOG App 裡的 Posts 欄位的 Change 按鈕,看到 Sample title 就放心了~

再點進去 Sample title 裡面,看有什麼欄位是可以修改的

單日心得總結

今天很簡略地帶大家一起走過 Django 的 HelloWorld,離真正能利用 Django,打造出我們想要的電商網站,還有段距離,大家一起努力,加油 <3

今天的文字比較少,所以比前兩天提早一個小時下班了 XD,要邊學習邊有系統地寫成文章,所需要的時間與精力,是比我原本想像的還要多很多的,我每天從十點開始敲鍵盤、想文章結構、邊做邊收集素材、校稿,到完稿大約是六點半到七點左右了,其實才幾天就有點精神耗弱,真的是太弱了QQ,現在的 RS 真的真的很佩服能每天堅持生稿的鐵人賽的前輩們、專欄作家們,還有廣大的自由工作者們,更不用說在職、已婚且有小孩要照顧的人,下了班還要學習與兼顧文章品質,實在是很需要毅力的任務。

明天我們來想辦法在畫面上,生出一點什麼吧 !

我是 RS,這是我的 不做怎麼知道系列 文章,我們 明天見。


  • 喜歡我的文章嗎? 趕快來看看我都發了什麼文章吧:我的文章目錄
  • 歡迎閱讀我的上一篇: [不做怎麼知道系列之Android開發者的30天後端養成故事 Day3] - 讓熱情燒一會兒 #別間斷很重要 #Python資料結構
  • 歡迎閱讀我的下一篇: [不做怎麼知道系列之Android開發者的30天後端養成故事 Day5] - 當個小畫家 #改變我的首頁 #前後端怎麼結合 #讓Django讀取HTML
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2021-2022 Sam Ho
  • Visitors: | Views:

請我喝杯咖啡吧~

支付宝
微信