一、模型設計
任何一個產品,最開始應該就是設計數據模型,模型設計好一般就不會輕易去修改它了,但是在此處,我們暫時不考慮用戶登錄評論這些,只考慮博客展示需要的模型。對應的表應該爲以下:
博客:標題 作者 分類 標籤 創建時間 最後修改時間 摘要 正文 博客插圖等
作者表: 其實也就是用戶表,django有內置的User模型
分類: 分類名稱
標籤: 標籤名稱
基於以上的模型設計,建立以下的模型代碼:
website/blog/models.py
from django.db import models
from django.contrib.auth.models import User # 導入內建的User模型,之後方便用戶認證等。博客就可以快速加入用戶登錄註冊認證等功能。
class Categorys(models.Model):
category_name = models.CharField(max_length=128, verbose_name='博客分類')
def __str__(self):
return self.category_name
class Meta:
verbose_name = '博客分類'
verbose_name_plural = '博客分類'
class Tags(models.Model):
tag_name = models.CharField(max_length=128, verbose_name='博客標籤')
def __str__(self):
return self.tag_name
class Meta:
verbose_name = '博客標籤'
verbose_name_plural = '博客標籤'
class Article(models.Model):
title = models.CharField(max_length=128, verbose_name='標題')
auth = models.ForeignKey(User, verbose_name='作者') # 作者和文章是一對多的關係,所以這邊使用ForeignKey用於關聯查詢
categorys = models.ManyToManyField(Categorys, verbose_name='分類') # 文章和分類是多對多的關係
tags = models.ManyToManyField(Tags,verbose_name='標籤') # 標籤和分類也是多對多的關係
created_time = models.DateTimeField(auto_now_add=True, verbose_name='創建時間')
update_time = models.DateTimeField(auto_now=True, verbose_name='最後修改時間')
abstract = models.TextField(max_length=256, blank=True, verbose_name='摘要')
body = models.TextField(verbose_name='正文')
img = models.ImageField(upload_to='images', blank=True, null=True, verbose_name='博客插圖')
class Meta:
verbose_name = '博客文章'
verbose_name_plural = '博客文章'
ordering = ['-created_time']
1 模型內部類Meta
class Meta用來使用類提供的模型元數據。例如排序選項ordering、數據庫表名db_table、單數和複數名稱verbose_name和 verbose_name_plural(verbose這兩個元數據基本所有Django項目都這樣固定寫)。
在class Article中我們使用的元數據ordering =[’-created_time’],表明了將來取出文章列表時候,是以創建時間降序排列的。如果去掉‘-’則升序排列
2 一對多,多對多
作者和文章的關係是一對多的關係,Django中使用ForeignKey來關聯。
from django.contrib.auth.models import User
auth = models.ForeignKey(User, verbose_name='作者')
這裏使用了Django自帶的User類,之後在寫博客登錄註冊認證時候會詳細介紹。
文章和標籤以及分類是多對多的關係,Django中使用ManyToManyField。
(img的工作原理是存儲圖片的相對路徑——第一個參數,與settings中靜態文件目錄路徑搭配做到加載圖片的效果,下一節模板渲染會用到js,css等靜態文件,一起講下怎麼使用。)
3 blank 以及 null
在img中,可以看到有blank 和 null參數,這兩個參數的區別在於null爲數據庫範圍的,而blank是表單驗證時候的。例如如果一個字段的 blank=True ,Django 在進行表單數據驗證時,會允許該字段是空值。如果字段的 blank=False ,該字段就是必填的。
這裏blank=True,null=True則對應表示,在寫博客文章時候可以選擇不上傳博客插圖,且在不上傳博客插圖時候,數據庫img字段的值爲null。如果null設置爲False,則不上傳博客插圖時候,數據庫img字段的值會爲’’ 空字符串。
4. 生成遷移文件
模型設計好以後,就要和數據庫對接生成相應的數據存儲。第一次運行時候執行以下命令先生成遷移文件:
python manage.py makemigrations
可以看到在migrations文件目錄下生成了一個0001_initial.py的遷移文件,可以自行打開看一下。(每當你修改數據模型以後都要重新生成一次遷移文件)
然後根據遷移文件,執行以下命令,生成我們的數據庫表:
python manage.py migrate
二、創建超級用戶
想要使用admin管理博客內容,需要進行admin的數據模型註冊,然後創建超級用戶
1. 模型註冊。
from django.contrib import admin
from blog.models import Categorys,Tags,Article
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title','auth','created_time','update_time','abstract']
admin.site.register(Categorys)
admin.site.register(Tags)
admin.site.register(Article,ArticleAdmin)
這裏list_display 中的字符名一定要要模型中的數據變量名相同。
具體幹嘛用的其實就是admin管理頁面要展示的內容。
除了list_display還有,list_filter詳情使用和效果如下
http://www.pianshen.com/article/384761692/
2 創建超級用戶
python manage.py createsuperuser
3. 登錄管理頁面
註冊模型和超級用戶創建完畢以後,可以啓動項目查看admin界面:
http://192.168.1.113:8888/admin (這邊是你設置的web入口)
如果你直接沒有配置IP端口啓動了項目,則admin界面就是默認的
127.0.0.1:8000/admin
python manage.py runserver
現在就可以用admin管理界面爲你的博客添加文章,添加分類和標籤了。添加以後可以去django項目的sqlite查詢表是否有對應的數據。
三、配置使用mysql
以上都是使用的django自帶的sqlite3,實際生產中我們一般都使用mysql,MongoDB,Oracle等。我們以mysql爲例。
1. 使用mysql的準備配置
首先在mysql中創建項目需要的mysql數據庫
接着在website/website/settings.py 中將默認的數據庫配置成mysql;
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'website', # 你的數據庫名稱
'HOST': '127.0.0.1', # 數據庫主機
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'ljp310851649.',
}
}
配置完以後爲了讓django能夠使用mysql需要pip安裝pymysql包,
同時在settings中加入以下代碼:
import pymysql
pymysql.install_as_MySQLdb()
2. 重新執行遷移文件
因爲數據模型沒有發生變化,只是數據庫發生了改變,所以重新執行一次遷移操作就可以了:
python manage.py migrate
再次創建超級用戶,登錄admin管理頁面新增你的相關數據,然後查看mysql看是否添加成功。
python manage.py createsuperuser
總結:
這節主要講了在項目環境搭建好以後,進行模型設計,數據庫配置以及admin的應用註冊和後臺頁面管理等,下一節開始講一下用戶展示的頁面,主要包括以下內容吧:
- 靜態文件的使用
- 模板繼承
- 博客分頁
git:
website-day02
https://github.com/syjzlee/Django-website-days