Django2.0入门教程:管理后台与model模型

Django的管理后台和model模型,在之前的例子里,我们也有涉及过,不过当时我们并没有进行深究。本节我们将通过例子,带大家深入了解。

一、创建项目。

创建一个名为mysite的Django项目,然后创建一个blog应用APP,在项目根目录里创建一个templates和static文件夹,在settings里注册APP,添加templates和static路径。如果想使用非SQLite数据库,请自行配置,本例使用默认的SQLite数据库。具体可参考:全局配置settings详解

二、设计模型。

完成博客,我们需要存储三种数据。文章分类、文章、文章标签。

分类表结构设计

表名:Category、分类名:name

标签表设计:

表名:Tags、标签名:name

文章表结构设计:

表名:Article、标题:title、摘要:intro、分类:category、标签:tags、内容:body、创建时间:created_time、作者:author

其中:

分类和文章是一对多的关系,标签和文章是多对多的关系,作者和文章是一对多的关系。

打开blog/models.py,输入代码:

from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    """
    Django 要求模型必须继承 models.Model 类。
    Category 只需要一个简单的分类名 name 就可以了。
    CharField 指定了分类名 name 的数据类型,CharField 是字符型,
    CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
    然后给name设置了一个'分类'的名称
    """
    name = models.CharField('分类',max_length=100)
    
class Tags(models.Model):
    """
    标签 Tag 也比较简单,和 Category 一样。
    再次强调一定要继承 models.Model 类!
    """
    name = models.CharField('标签',max_length=100)
    
class Article(models.Model):
    # 文章正文,我们使用了 TextField,并且指定了标题的长度
    title = models.CharField('标题',max_length=70)
    # 使用 TextField 来存储大段文本,文章摘要,我们指定了最大长度和允许可以为空。
    intro = models.TextField('摘要', max_length=200, blank=True)
    # 这是分类与标签,分类与标签的模型我们已经定义在上面。
    # 我们在这里把文章对应的数据库表和分类、标签对应的数据库表关联了起来,但是关联形式稍微有点不同。
    # 我们规定一篇文章只能对应一个分类,但是一个分类下可以有多篇文章,所以我们使用的是 ForeignKey,即一对多的关联关系。
    # 而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用 ManyToManyField,表明这是多对多的关联关系。
    # 同时我们规定文章可以没有标签,因此为标签 category 指定了 blank=True。
    #文章分类,我们还使用了on_delete参数,这个是Django2.0强制ForeignKey必须使用的。
    #具体更多的资料可以查看官网,也可以查看Django2.0外键参数on_delete的使用方法:https://www.django.cn/article/show-6.html
    #后面我们也会有专门的文章对一对多、多对多进行详细介绍
    category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='分类', default='1')
    tags = models.ManyToManyField(Tags, blank=True)
    # 存储比较短的字符串可以使用 CharField,但对于文章的正文来说可能会是一大段文本,因此使用 TextField 来存储大段文本。
    body = models.TextField()
    # 文章作者,这里 User 是从 django.contrib.auth.models 导入的。
    # django.contrib.auth 是 Django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。
    # 这里我们通过 ForeignKey 把文章和 User 关联了起来。
    # 因为我们规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
    #created_time,我们使用了DateTimeField字段,添加了一个auto_now_add参数,自动获取添加时间!
    created_time = models.DateTimeField('发布时间',auto_now_add=True)

三、创建模型。

数据模型设计好之后,我们就需要迁移数据到数据库。我们运行如下命令:

python manage.py makemigrations

通过运行makemigrations命令,相当于告诉Django你对模型有改动,并且你想把这些改动保存为一个“迁移(migration)”。
migrations是Django保存模型修改记录的文件,这些文件保存在对应的migration目录里。在例子中,它就是blog/migrations/0001_initial.py,你可以打开它看看,里面保存的都是人类可读并且可编辑的内容,方便你随时手动修改。

Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Article
    - Create model Category
    - Create model Tags
    - Add field category to article
    - Add field tags to article
    - Add field user to article

接下来有一个叫做migrate的命令将对数据库执行真正的迁移动作。

python manage.py migrate

migrate命令对所有还未实施的迁移记录进行操作,本质上就是将你对模型的修改体现到数据库中具体的表上面。Django通过一张叫做django_migrations的表,记录并跟踪已经实施的migrate动作,通过对比获得哪些migrations尚未提交。
migrations的功能非常强大,允许你随时修改你的模型,而不需要删除或者新建你的数据库或数据表,在不丢失数据的同时,实时动态更新数据库。如果你想修改模型时的请记住,需要分如下三步操作:
1、在models.py中修改模型;
2、运行python manage.py makemigrations为改动创建迁移记录;
3、运行python manage.py migrate,将操作同步到数据库。

四、Django管理后台admin

Django最大的优点之一,就是体贴的为你提供了一个基于项目model创建的一个后台管理站点admin。我们可以在这个管理后台对内容进行查看、添加、修改、删除数据等操作,能让你节省大量开发时间。而且Django能够根据定义的模型类自动地生成管理模块。

1、创建管理员帐号密码

首先,下面命令创建一个管理员帐号

python manage.py createsuperuser

输入用户名:

Username: admin

输入邮箱地址:

Email address:vip@django.cn

输入密码:

Password: **********
Password (again): *********
Superuser created successfully.

注意:超级用户的密码强制要求具备一定的复杂性,否者验证不通过。

2、启动开发服务器

输入如下命令:

python manage.py runserver

启动成功之后,我们在浏览器里输入:http://127.0.0.1:8000/admin/ 就能看到后台管理登录页面。输入帐号密码,就能登录管理后台。

1.jpg

3、注册admin注册blog应用

现在后台,只有默认的Django认证和授权应用,我们前面设计的那个应用模型我们需要在管理后台注册之后才能对其进行管理。

方法如下:

打开blog/admin.py文件,加入如下内容:

from django.contrib import admin
from .models import Article,Tags,Category
admin.site.register(Tags)
admin.site.register(Article)
admin.site.register(Category)

刷新页面,我们就能看到blog这个应用了。

2.jpg


文章评论 0