一、模型设计
任何一个产品,最开始应该就是设计数据模型,模型设计好一般就不会轻易去修改它了,但是在此处,我们暂时不考虑用户登录评论这些,只考虑博客展示需要的模型。对应的表应该为以下:
博客:标题 作者 分类 标签 创建时间 最后修改时间 摘要 正文 博客插图等
作者表: 其实也就是用户表,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