vscode+django 搭建自己的个人网站(四) ——利用ORM创建数据库模型并建立后台管理

vscode+django 搭建自己的个人网站(四) ——利用ORM创建数据库模型并建立后台管理,第1张

vscode+django 搭建自己的个人网站(四) ——利用ORM创建数据库模型并建立后台 管理 前言

​ DJANGO通过model *** 作数据库,不管数据库的类型是mysql还是sqllite3都可以通过models来建立,models中的封装了对应的SQL语句,所以创建查询等 *** 作都十分的方便,但是利用ORM 有一个很大的弊端,那就是数据库的SQL语句会很少使用,所以笔者在这里只做前期的使用,未来可能会用sql语句来代替。

​ 每一个网站都会有自己的一个或者多个管理后台,网页中可以看到的数据如果使用html全部重新写一遍的话不仅费时间有时候也并没有什么意义,所以我们的博客网站页一定需要后台来方便我们管理网站并添加数据。

ORM创建数据库

DJANGO中的模型基本原则如下:

· 每个模型在django中存在形式为一个python类

· 每个模型都是django.db.models.Model的一个子类

· 模型里的每一个类都代表数据库中的一个表

· 模型的每个字段(属性)代表数据表中的一个列

· DJANGO会为你自动生成数据库访问的API

接下来我们按照之前对数据结构的分析对数据进行创建,打开blogproject/blogproject/model.py

分类表

表名:Category、分类名:name

表字段字段类型备注
idINTEGER类型,长度为11主键,表示文章,由系统自动生成
nameVARCHAR类型,长度为30分类名

在model.py文件中写入:

#文章分类
class Category(models.Model):
    name = models.CharField('博客分类',max_length = 100)
    index = models.IntegerField(default = 999,verbose_name)
    
    class Meta:
       verbose_name = '博客分类'
       verbose_name_plural = verbose_name
	
    def __str__(self):
        return self.name
标签表

表名Tag、分类名:name

表字段字段类型备注
idINTEGER类型,长度为11主键,由系统自动生成
nameVARCHAR类型,长度为30文章的标签名

在model.py文件中写入:

#文章标签
class Tag(models.Model):
    name = models.CharField('文章标签',max_length = 100)
    index = models.IntegerField(default = 999, verbose_name = '分类排序')
    
    class Meta:
       verbose_name = '文章标签'
       verbose_name_plural = verbose_name
	
    def __str__(self):
        return self.name
推荐表

表名Tui,分类名:name

表字段字段类型备注
idINTEGER类型,长度为11主键,由系统自动生成
nameVARCHAR类型,长度为30标签名

在model.py文件中写入:

class Tui(models.Model):
    name = models.CharField('推荐位',max_length = 100)
    index = models.IntegerField(default = 999, verbose_name = '分类排序')
    
    class Meta:
       verbose_name = '推荐位'
       verbose_name_plural = verbose_name
	
    def __str__(self):
        return self.name
文章表

表名Article,分类名:title

表字段字段类型备注
idINTEGER类型,长度为11主键,有系统自动生成
titleVARCHAR类型,长度为100文章标题
categoryFOREIGNKEY外键,关联文章分类表
tagsMANYTOMANYFIELD多对多,关联标签列表
bodyTEXTFIELD文章内容
userFOREIGNKEY外键,文章作者关联用户模型,系统自带
viewsPOSTIVEINTEGERFIELD文章浏览数,正的整数,不能为负
tuiFOREGNKEY外键,关联推荐位表
creates_timeDATETIMEFIELD文章发布时间

在model.py文件中写入:

class Article(models.Model):
    title = models.CharField('标题',max_length = 70)
    excerpt = models.TextField('摘要',max_length = 200,blank = True)
    category = models.ForeignKey(Category, on_delete = models.DO_NOTHING,verbose_name = '分类',blank = True,null = True)
    #使用外键关联分类表与分类是一对多关系
    tags = models.ManyToManyField(Tag,verbose_name = '标签',blank = True)
    #使用外键关联标签表与标签是多对多关系
    img = models.ImageField(upload_to='article_img/%Y/%m/%d/',verbose_name = '文章图片',blank = True, null = True)
    body = MDTextField()
    user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name = '作者')
    '''
    文章作者,这里User是从django.contrib.auth.models导入的
    这里通过ForeignKey 把文章与User关联了起来
    '''
    views = models.PositiveIntegerField('阅读量',dafult = 0)
    tui = models.ForeignKey(Tui,on_delete = models.DO_NOTHING,verbose_name = '推荐位',blank = True,null = True)

    created_time = models.DateTimeField('发布时间',auto_now_add = True)
    modified_time = models.DateTimeField('修改时间',auto_now = True)
    
    class Meta:
       verbose_name = '文章'
       verbose_name_plural = '文章'
	
    def __str__(self):
        return self.title

这里的img中的upload_to = 'article_img/‘是指向了图片的上传目录,’%Y/%m/%d/'是自动在上传图片时加上上传时间

注:这里的body的类型是MDTextField,这是因为笔者后面需要markdown来写文章,这样的话会更加方便

轮播图表

表名Banner,分类名text_info

表字段字段类型备注
idINTEGER类型,字长11主键,由系统自动生成
text_infoVARCHAR类型,字长100标题,存储图片信息
imgIMAGE类型图片类型,保存传图片的类型
link_urlURLFIELD类型图片链接的URL
is_activeBOOLEANFIELD有TRUE和FALSE两个类型,意思为是否激活

在model.py文件中写入:

class Banner(models.Model):
    text_info = models.CharField('标题',max_length=50,default = '')
    img = models.ImageField('轮播图',upload_to = 'banner/')
    link_url = models.URLField('图片链接',max_length = 100)
    is_active = models.BooleanField('是否是active',default = False)

    def __str__(self):
        return self.text_info
    
    class Meta:
        verbose_name = '轮播图'
        verbose_name_plural = '轮播图'

这里的img中的upload_to = 'banner/'是指向了图片的上传目录

友情链接表

表名Link,分类名name

表字段字段类型备注
idINTEGER类型主键,由系统自动生成
nameVARCHAR类型,长度为70友情链接的名称
linkurlURLFIELD类型友情链接的URL

在model.py文件中写入:

class Link(models.Model):
    name = models.CharField('链接名称',max_length = 20)
    linkurl = models.URLField('网址',max_length = 100)

    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name = '友情链接'
        verbose_name_plural = '友情链接'

这里我们只是创建了数据库的模型代码,真正的数据库创建还需要我们来进行数据库迁移

等所有的表都建立完成,接下来只要利用命令将数据库进行迁移即可:

python manage.py makemigrations
python manage.py migrate

注:在运行第一个命令之后,blogproject/migrations目录会自动生成几个000开头的文件,这里是数据库迁移的记录,而且支持手动更改,正真的数据库的创建是第二句命令

在这里可能会出现一些错误

笔者这里出现以下报错

SystemCheckError: System check identified some issues:

ERRORS:
myblog.Article.img: (fields.E210) Cannot use ImageField because Pillow is not installed.
        HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow".

原因是图片上传需要Pillow模块的支持,所以可以执行下面语句下载Pillow模块,完成后再执行语句即可成功

pip install Pillow

这是运行第一个命令后的效果

这是运行第二个命令后的效果

这样我们的数据库终于成功创建啦😸,接下来就可以使用后台来 *** 作数据库啦

建立后台管理

数据库管理在django有多种方式

一、直接使用mysql语句在mysql终端管理数据

二、使用vscode的扩展插件管理(扩展见文章一)

三、使用django的后台管理数据

由于django有非常强大的后台可以直接配置使用,而且在日常的网站护理中也都会直接使用后台来管理,所以这里我们也要建立后台管理来方便我们以后的网站维护与作品发布。

最基本的前提是要先在settings.py里对其进行注册,就是在INSTALLED_APPS里把APP名添加进去(详见文章3),实际上admin是已经注册好的

然后我们需要在自己APP文件夹中的admin.py文件中对数据表做注册,代码如下:

from .models import Banner, Category, Tag, Tui, Article, Link 
#导入需要管理的数据库表

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('id', 'category', 'title', 'tui', 'user', 'views', 'created_time')
    # 文章列表里显示想要显示的字段
    list_per_page = 50
    # 满50条数据就自动分页
    ordering = ('-created_time',)
    #后台数据列表排序方式
    list_display_links = ('id', 'title')
    # 设置哪些字段可以点击进入编辑界面



@admin.register(Banner)
class BannerAdmin(admin.ModelAdmin):
    list_display = ('id', 'text_info', 'img', 'link_url', 'is_active')

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'index')

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Tui)
class TuiAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')

@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
    list_display = ('id', 'name','linkurl')

然后我们需要给自己注册管理员账号,激活管理工具

通过下面命令即可设置账号密码

python manage.py createsuperuser

注:这里密码太短太简单都会提醒你重设

打开调试后在浏览器登录网址http://localhost:8000/admin/就能登录进入后台啦


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/917001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存