認識數據庫
- 存儲數據的倉庫
- 什么是數據?
- 學生的姓名、性別、成績;
- 用戶的銀行卡號、密碼、余額、交易記錄
- 網站的登錄賬號、密碼、評論
- 游戲的用戶名、裝備、屬性、等級
數據是如何存在數據庫中
一張張表存儲各種信息
-
表與表之間還可能有不同的聯系
imageimage
Django中的數據庫
打開blog應用里的models.py文件
-
加入以下內容
#繼承于models.Model, 新建了叫post的表格 class Post(models.Model): # 有title屬性 title=modesl.CharField(max_length=80)
-
同步數據庫
- 根目錄運行
python manage.py makemigrations
-
得到如下提示,表示創(chuàng)建了Post模型
image - 繼續(xù)命令運行
python manage.py migrate
-
得到如下提示
image
- 根目錄運行
利用admin后臺系統(tǒng)管理數據
運行
python manage.py runserver
啟動服務器-
修改blog文件夾中的admin.py
from django.contrib import admin from .models import Post # Register your models here. admin.site.register(Post)
-
登錄admin后臺系統(tǒng)
-
訪問
http://127.0.0.1:8000/admin
,會看到新增了一個欄目image
-
-
admin后臺系統(tǒng)管理
點擊Posts進入,可以看見還沒有內容發(fā)布過
-
點擊ADD POST,可直接添加一個Post的title
image 在title中輸入內容,SAVE保存,保存后叫Post project(1),不直觀
-
修改blog文件夾里的models.py
class Post(models.Model): # 有title屬性 title=models.CharField(max_length=80) def __str__(self): return self.title
此時,這里就展示的是你輸入的title的內容
image
設計博文模型
-
一篇博客相關的信息如下:
- 標題
- 副標題
- 作者
- 發(fā)表日期
- 標簽
- 分類
- 博文內容
- 博文鏈接
- 點贊數(可選)
- 閱讀量(可選)
-
Django中可用的各類模型
image目前常用:
- CharField 簡單文字模型
- DateTiemField 時間模型
- TextField 大段文字模型 -
設計博文模型簡易版
image這樣設計存在什么問題?
作者、標簽、分類存在同一個表中,會造成大量重復的內容、不易檢索、不易修改。
image -
設計博文模型進階版
image
博文基礎模版
-
models.py
添加一些基礎模型class Post(models.Model): title=models.CharField(max_length=80) subtitle=CharField(max_length=120) publish_date=models.DateTimeField() content=models.TextField() link=models.CharField(max_length=200) def __str__(self): return self.title
-
關聯作者模型
from django.db import models from django.contrib.auth.models import User` class Post(models.Model): title=models.CharField(max_length=80) subtitle=CharField(max_length=120) publish_date=models.DateTimeField() content=models.TextField() link=models.CharField(max_length=200) # 利用ForeignKey()即把字段author關聯另外一個模型 author=models.ForeignKey(User,on_delete=models.CASCADE) def __str__(self): return self.title
新建分類模型和標簽模型
添加兩個class,同時補充Post類
class Category(models.Model):
"""分類"""
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Tag(models.Model):
"""標簽"""
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Post(models.Model):
title=models.CharField(max_length=80)
subtitle=models.CharField(max_length=120)
publish_date=models.DateTimeField()
content=models.TextField()
link=models.CharField(max_length=200)
# 利用ForeignKey()即可關聯另外一個模型
author=models.ForeignKey(User,on_delete=models.CASCADE)
category=models.ForeignKey(Category,on_delete=models.CASCADE)
# 利用MangToManyField()關聯另外一個模型
tag=models.ManyToManyField(Tag,blank=True)
def __str__(self):
return self.title
-
ForeignKey()和ManyToManyField()的區(qū)別
-
一對多的關系,使用ForeignKey()
一篇文章只有一個分類,一個分類下有多個文章
image -
多對多的關系,使用MangToManyField()
一個文章可以有多個標簽,一個標簽會對應多個文章
image
-
-
新建了2個模型,所以要在admin.py中添加
from django.contrib import admin from .models import Post from .models import Category from .models import Tag # Register your models here. admin.site.register(Category) admin.site.register(Tag) admin.site.register(Post)
運行Django的管理命令
-
只要修改了
models.py
文件,都需要運行python manage.py makemigrations
會提示:
image意思為:
image選擇1方案,填寫默認值1,除了時datetime填timezone.now
創(chuàng)建成功:
image 每次運行完
python manage.py makemigrations
,都要運行python manage.py magrate
注意:如果這里運行
python manage.py magrate
時一直報錯,難以結局,可以嘗試刪掉my_blog
下的db.sqlite3
文件,再重新運行python manage.py magrate
,再重新創(chuàng)建admin賬號即可。
admin后臺查看
-
進入到后臺管理,可以看到新增了Category、Tag
image -
點擊Posts-Add post,新增了我們寫的字段
image 添加Category,比如添加
編程
分類

-
添加Tag,比如添加
Python
標簽image -
再進入到post,可以發(fā)現Category可選編程,Tag可以選Python,直接點擊
?
添加也可
image
從數據庫提取真正的博文信息
- 修改
views.py
引入Post模型
from .models import Post
列出全部的Post數據,按發(fā)表日期倒序排列
Post.objects.all().order_by('-publish_date')
-
修改如下:
from django.shortcuts import render from django.http import HttpResponse from .models import Post # Create your views here. def index(request): post_list=Post.objects.all().order_by('-publish_date') return render(request,'blog/index.html',{'post_list':post_list})
設計博客詳情頁網址
每篇博文有一個英文的網址,如
127.0.0.1:8080/blog/django-course-1
后臺link只需要填
django-course-1
部分-
修改index.html的博客詳情頁鏈接,設計為
blog/link
<a href="/blog/{{post.link}}">
-
將時間那里改為我們的時間變量
<p class="post-meta">Posted by <a href="#">{{post.author}}</a> {{post.publish_date}}</p>
修改urls.py的網址配置,將blog_detail的參數改為blog_link
path('<int:blog_link>',views.blog_detail,name='blog_detail'),
-
修改views.py
from django.shortcuts import render,get_object_or_404
get_object_or_404表示從某個模型根據關鍵字提取某段數據,找不到返回數據,就返回404頁面
def blog_detail(request,blog_link): post=get_object_or_404(Post,link=blog_link) return HttpResponse(post.content)
-
在管理后臺配置一篇博客,看下效果
imageimage
添加博客詳情頁模版
我們下載的模版中,有一個post.html的文件,就是我們博客詳情頁的模版,把它用到我們項目中,放在我們app的/templates/blog
下.
-
修改views.py
def blog_detail(request,blog_link): post=get_object_or_404(Post,link=blog_link) # 返回博文詳情 return render(request,'blog/post.html',{'post':post})
-
修改post.html
同我們修改index.html一樣,把js、css、img的路徑進行修改:
<link href="{%static 'blog/vendor/bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">
修改title、標題、副標題、作者、正文、時間:



更漂亮的正文排版
方式一:在后臺的content中直接寫html代碼,比較麻煩;
方式二:采用Markdown格式編寫博文(推薦)
- 安裝markdown模塊
pip install markdown2
- 修改views.py
def blog_detail(request,blog_link): post=get_object_or_404(Post,link=blog_link) post.content = markdown2.markdown(post.content) # 返回博文詳情 return render(request,'blog/post.html',{'post':post})
- 后臺博客content中用markdown語法進行編輯


發(fā)現沒有對標簽進行渲染,如何解決?
在post.html中的`{{post.content}}`修改為`{{post.content|safe}}`


**遺留問題,這里貌似不支持代碼塊的展示,待解決**
調整url
現在的url是127.0.0.1:8000/blog/
首頁,我們希望127.0.0.1:8000
就是首頁
- 修改my_blog的urls.py
urlpatterns = [ path('admin/', admin.site.urls), path('',include('blog.urls')), ]
- 修改blog的urls.py
urlpatterns = [ path('',views.index,name='blog_index'), path('blog/<slug:blog_link>/',views.blog_detail,name='blog_detail'), ]
如何把網站對外發(fā)布
- 購買服務器和域名
服務器見文章最前面部分
-
域名
- 國內:wanwang.aliyun.com
- 國外:godaddy.com
- .cn/.com等域名需要實名認證
服務器或者域名在國內買的,需要進行備案,沒有備案的話,有可能會被墻掉
-
購買后,設置域名解析,表示該域名指向的服務器ip地址
image
Django部署
(不詳細講,自行google)
安裝uwsgi
-
配置uwsgi.ini
示例:
image 安裝nginx
配置nginx
啟動uwsgi
uwsgi --ini uwsgi.ini
啟動nginx
服務器使用中常見的幾個問題
- 可能是數據庫沒有填寫我們的hosts
- 80端口可能之前已經被打開,關掉80端口即可
- ip地址沒填對,要公網的ip地址
- 連上一段時間沒有操作也會自動斷掉
- 網絡連接問題
- 安裝一個screen應用