利用Python Django實(shí)現(xiàn)簡(jiǎn)單博客系統(tǒng)
第一節(jié) - 基礎(chǔ)
1. 簡(jiǎn)單的導(dǎo)覽圖,學(xué)會(huì)不迷路

對(duì) Django 的評(píng)價(jià):借用李清照的《鷓鴣天 桂花》來表達(dá),
暗淡輕黃體性柔。情疏跡遠(yuǎn)只香留。何須淺碧深紅色,自是花中第一流。
梅定妒,菊應(yīng)羞。畫闌開處冠中秋。騷人可煞無情思,何事當(dāng)年不見收。
Django makes it easier to build better Web apps more quickly and with less code.
- 容易上手,開發(fā)速度快
- 囊括了網(wǎng)站開發(fā)中的用戶管理,內(nèi)容管理,網(wǎng)站地圖,RSS等常用的插件
- 安全性強(qiáng),解決了 SQL 注入,跨站攻擊等問題
- 應(yīng)用廣泛
2. 基本操作介紹
- 安裝:pip install Django
- 創(chuàng)建項(xiàng)目:django-admin startproject mysite
- 運(yùn)行項(xiàng)目:python manage.py runserver
- 創(chuàng)建應(yīng)用:python manage.py startapp blog
3. 命令簡(jiǎn)單介紹
- django-admin.py :django 的任務(wù)管理命令行工具
- manage.py :對(duì)django-admin 的簡(jiǎn)單封裝,同樣可以實(shí)現(xiàn)命令行操作(最好對(duì)于該文件不要修改,也不要?jiǎng)h除)
4. mysite:所建項(xiàng)目的管理功能目錄
- setting.py :項(xiàng)目初始化配置,可以針對(duì)整個(gè)項(xiàng)目進(jìn)行有關(guān)參數(shù)的配置,比如數(shù)據(jù)庫(kù),添加應(yīng)用等
- urls.py :url 的配置表文件,主要是將url映射到應(yīng)用程序上??梢允悄硞€(gè)應(yīng)用中的urls.py 文件,也可以是某個(gè)具體的視圖函數(shù)。被稱之為 URLconf,是 Django 一個(gè)非常強(qiáng)大的特性。
- wsgi.py :web server gateway interface 的縮寫。wsgi.py 定義了我們所創(chuàng)建的項(xiàng)目都是 wsgi 應(yīng)用。
5. blog:我們創(chuàng)建的項(xiàng)目之一
- admin.py :自定義 Django 管理工具,比如設(shè)置在管理界面能夠管理的項(xiàng)目,或者重新定義與系統(tǒng)管理有關(guān)的類對(duì)象,向管理功能增加新的內(nèi)容。
- apps.py : 對(duì)應(yīng)用的配置,比如為管理功能提供一個(gè)適合的應(yīng)用名稱
- migrations:存儲(chǔ)應(yīng)用數(shù)據(jù)的表結(jié)構(gòu)的指令,可以修改和創(chuàng)建數(shù)據(jù)庫(kù),從而子 models.py 模型類和數(shù)據(jù)庫(kù)表之間遷移
- models.py : 應(yīng)用的數(shù)據(jù)模型
- test.py : 編寫測(cè)試文檔
- views.py : 用戶保存各種請(qǐng)求的函數(shù)或者類。如果編寫的是函數(shù),則稱之為基于函數(shù)的視圖,如果編寫的是類,則稱之為基于類的視圖。
6. db.sqlite3 : 默認(rèn)的數(shù)據(jù)庫(kù)
7. 網(wǎng)站配置:mysite/setting.py
- DEBUG:開發(fā)的時(shí)候設(shè)置為 True??梢燥@示具體的報(bào)錯(cuò)信息。
- ALLOWED_HOSTS:在 DEBUG 為 True 的時(shí)候,值可以為空。在部署到生產(chǎn)環(huán)境的時(shí)候,需要把主域名填寫到這里,才能通過域名訪問到本網(wǎng)站
- INSTALLED_APPS: 所有的應(yīng)用只有寫到這里才會(huì)生效。
- DATABASES: 配置數(shù)據(jù)庫(kù)。默認(rèn)為 sqlite
- LANGUAGE_CODE: 設(shè)置姓名的語(yǔ)言。漢語(yǔ)設(shè)置為 ‘zh-hans'
- TIME_ZONE: 設(shè)置時(shí)區(qū),通常東八。 設(shè)置為:‘Aisa/Shanghai
第二節(jié) - 博客開發(fā)
默認(rèn)已經(jīng)創(chuàng)建好的 django 的項(xiàng)目和應(yīng)用,并將應(yīng)用注冊(cè)到項(xiàng)目中
1. 編寫博客的數(shù)據(jù)模型類
設(shè)計(jì)數(shù)據(jù)庫(kù)和表結(jié)構(gòu)是做網(wǎng)站的基礎(chǔ)。

在 ./blog/model.py 中編寫如下類
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
from django.utils import timezone
class BlogArticles(models.Model):
title = models.CharField(max_length=300)
author = models.ForeignKey(User, related_name='blog_posts', null=True, on_delete=models.SET_NULL)
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ('-publish', )
def __str__(self):
return self.title
創(chuàng)建model 參考參數(shù):
一、字段
1、models.AutoField 自增列= int(11)
如果沒有的話,默認(rèn)會(huì)生成一個(gè)名稱為 id 的列,如果要顯示的自定義一個(gè)自增列,必須將 給列設(shè)置為主鍵 primary_key=True。
2、models.CharField 字符串字段
必須 max_length 參數(shù)
3、models.BooleanField 布爾類型=tinyint(1)
不能為空,Blank=True
4、models.ComaSeparatedIntegerField 用逗號(hào)分割的數(shù)字=varchar
繼承CharField,所以必須 max_lenght 參數(shù)
5、models.DateField 日期類型 date
對(duì)于參數(shù),auto_now =True則每次更新都會(huì)更新這個(gè)時(shí)間;auto_now_add 則只是第一次創(chuàng)建添加,之后的更新不再改變。
6、models.DateTimeField 日期類型 datetime
同DateField的參數(shù)
7、models.Decimal 十進(jìn)制小數(shù)類型= decimal
必須指定整數(shù)位max_digits和小數(shù)位decimal_places
8、models.EmailField 字符串類型(正則表達(dá)式郵箱)=varchar
對(duì)字符串進(jìn)行正則表達(dá)式
9、models.FloatField 浮點(diǎn)類型= double
10、models.IntegerField 整形
11、models.BigIntegerField 長(zhǎng)整形
integer_field_ranges ={
'SmallIntegerField':(-32768,32767),
'IntegerField':(-2147483648,2147483647),
'BigIntegerField':(-9223372036854775808,9223372036854775807),
'PositiveSmallIntegerField':(0,32767),
'PositiveIntegerField':(0,2147483647),
}
12、models.IPAddressField 字符串類型(ip4正則表達(dá)式)
13、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的)
參數(shù)protocol可以是:both、ipv4、ipv6
驗(yàn)證時(shí),會(huì)根據(jù)設(shè)置報(bào)錯(cuò)
14、models.NullBooleanField 允許為空的布爾類型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 減號(hào)、下劃線、字母、數(shù)字
18、models.SmallIntegerField 數(shù)字
數(shù)據(jù)庫(kù)中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 時(shí)間 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正則表達(dá)式
22、models.BinaryField 二進(jìn)制
23、models.ImageField圖片
24、models.FilePathField文件
二、字段參數(shù)
1、null=True
數(shù)據(jù)庫(kù)中字段是否可以為空
2、blank=True
django的 Admin 中添加數(shù)據(jù)時(shí)是否可允許空值
3、primary_key = False
主鍵,對(duì)AutoField設(shè)置主鍵后,就會(huì)代替原來的自增 id 列
4、auto_now 和 auto_now_add
auto_now 自動(dòng)創(chuàng)建---無論添加或修改,都是當(dāng)前操作的時(shí)間
auto_now_add 自動(dòng)創(chuàng)建---永遠(yuǎn)是創(chuàng)建時(shí)的時(shí)間
5、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default 默認(rèn)值
8、verbose_name Admin中字段的顯示名稱
9、name|db_column 數(shù)據(jù)庫(kù)中的字段名稱
10、unique=True 不允許重復(fù)
11、db_index = True 數(shù)據(jù)庫(kù)索引
12、editable=True 在Admin里是否可編輯
13、error_messages=None 錯(cuò)誤提示
14、auto_created=False 自動(dòng)創(chuàng)建
15、help_text 在Admin中提示幫助信息
16、validators=[]
17、upload-to
2. 生成數(shù)據(jù)庫(kù)遷移文件&創(chuàng)建數(shù)據(jù)表
# 命令行執(zhí)行 # 創(chuàng)建數(shù)據(jù)庫(kù)表遷移文件 python manage.py makemigrations # 查看遷移文件 python manage.py sqlmigrate blog 0001
然后會(huì)發(fā)現(xiàn)在migrations文件夾下生成了以0001開頭的py文件,在命令行會(huì)輸出我們的建表語(yǔ)句(sql)
# 生成數(shù)據(jù)表 python manage.py migrate
可以在 navicate 中連接 db.sqlite 進(jìn)行數(shù)據(jù)的查看。
3. 創(chuàng)建超級(jí)管理員
python manage.py createsuperuser
跟著步驟就可以了,創(chuàng)建超級(jí)管理員的賬號(hào)和密碼。一定牢記嗷~
啟動(dòng)項(xiàng)目后訪問 http://127.0.0.1:8000/admin/
然后就可以進(jìn)入頁(yè)面啦
頁(yè)面中的 Groups 和 Users 是 Django 在用戶管理應(yīng)用中默認(rèn)的。
4. 發(fā)布博客文章
我們登陸進(jìn)來之后沒有找到發(fā)布文章的地方,為什么呢?
接下來就需要我們對(duì) ./blog/admin.py 文件做修改了。
from django.contrib import admin from .models import BlogArticles # 將該類BlogArticles注冊(cè)到admin中 admin.site.register(BlogArticles)
再次返回我們的 http://127.0.0.1:8000/admin/ 就可以進(jìn)行文章的添加了。
5. 顯示博客信息
我們寫好的文章如果想讓別人看到,如何做呢?

在templates目錄下創(chuàng)建一個(gè)文件base.html 和一個(gè)blog文件夾,里面有 title.html , content.html 文件
文件內(nèi)容如下:
# base.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=l">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" rel="external nofollow" >
<link rel="stylesheet" rel="external nofollow" >
</head>
<body>
<div class="container">
{% block content %}
{% endblock %}
</div>
</body>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</html>
# title.html
{% extends "base.html" %}
{% block title %}
博客標(biāo)題
{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>小北的博客</h1>
</div>
<div class="row">
<div class="col-xs-12 col-mo-8">
<ul>
{% for blog in blogs %}
<li>
<a href="{{ blog.id }}" rel="external nofollow" >{{ blog.title }}</a>
</li>
{% endfor %}
</ul>
</div>
<div class="col-xs-6 col-mo-4">
<h2>廣告</h2>
<p>和我一起學(xué)python</p>
</div>
</div>
{% endblock %}
# content.html
{% extends "base.html" %}
{% block title %}
博客內(nèi)容
{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>{{ article.title }}</h1>
</div>
<div class="row">
<div class="col-xs-12 col-mo-8">
<div>
<p>{{ article.author.username }}</p>
<p>{{ publish }}</p>
<p>{{ article.body }}</p>
</div>
</div>
<div class="col-xs-6 col-mo-4">
<h2>廣告</h2>
<p>和我一起學(xué)python</p>
</div>
</div>
{% endblock %}
一定要在 templates 下創(chuàng)建,這是Django 默認(rèn)的存放本應(yīng)用所需模版的目錄
圖為示例結(jié)構(gòu)

在./blog/views.py 中編寫視圖函數(shù)
from django.shortcuts import render
from .models import BlogArticles
# Create your views here.
def blog_title(request):
blogs = BlogArticles.objects.all()
return render(request, "blog/title.html", {"blogs": blogs})
def blog_aritcle(request, article_id):
article = BlogArticles.objects.get(id=article_id)
pub = article.publish
return render(request, "blog/content.html", {"article": article, "publish": pub})
在url中注冊(cè)路由地址
在 blog/urls.py 中
from django.conf.urls import url
from . import views
from django.urls import path
from blog.views import *
urlpatterns = [
path('title', blog_title, name='blog_title'),
path('<int:article_id>', blog_aritcle, name='blog_aritcle'),
]
在當(dāng)前項(xiàng)目下的urls.py 中
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
urlpatterns = [
path('admin/', admin.site.urls, name='admin'),
path('blog/', include('blog.urls')),
]
然后頁(yè)面就可以訪問了,可以查看文章列表頁(yè)和詳情頁(yè)。
到此這篇關(guān)于利用Python Django實(shí)現(xiàn)簡(jiǎn)單博客系統(tǒng)的文章就介紹到這了,更多相關(guān)Django實(shí)現(xiàn)博客系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用于業(yè)余項(xiàng)目的8個(gè)優(yōu)秀Python庫(kù)
今天小編就為大家分享一篇用于業(yè)余項(xiàng)目的8個(gè)大型Python庫(kù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-09-09
Python+OpenCV實(shí)現(xiàn)圖像識(shí)別替換功能詳解
OpenCV-Python是一個(gè)Python庫(kù),旨在解決計(jì)算機(jī)視覺問題。本文將利用Python+OpenCV實(shí)現(xiàn)圖像識(shí)別替換功能,感興趣的小伙伴可以動(dòng)手嘗試一下2022-07-07
Python實(shí)現(xiàn)的堆排序算法原理與用法實(shí)例分析
這篇文章主要介紹了Python實(shí)現(xiàn)的堆排序算法,簡(jiǎn)單描述了堆排序的原理,并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)堆排序的相關(guān)操作技巧,代碼中備有較為詳細(xì)的注釋便于理解,需要的朋友可以參考下2017-11-11
python系統(tǒng)指定文件的查找只輸出目錄下所有文件及文件夾
這篇文章主要介紹了python系統(tǒng)指定文件的查找只輸出目錄下所有文件及文件夾,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Tensorflow: 從checkpoint文件中讀取tensor方式
今天小編就為大家分享一篇Tensorflow: 從checkpoint文件中讀取tensor方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
python中tf.boolean_mask()函數(shù)的使用方法詳解
這篇文章主要介紹了python中tf.boolean_mask()函數(shù)的使用方法詳解,?tf.boolean_mask()?函數(shù)的作用是通過布爾值對(duì)指定的列的元素進(jìn)行過濾,需要的朋友可以參考下2023-11-11
基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析
這篇文章主要介紹了基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
python操作docx寫入內(nèi)容,并控制文本的字體顏色
今天小編就為大家分享一篇python操作docx寫入內(nèi)容,并控制文本的字體顏色,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02

