如何利用 Django 自带的 Admin 发布和查看项目内容

前言
在上一篇文章中,我们煞费苦心的利用控制台中的命令行对我们的模型进行操作——增删改查。其中,我们创建了一个超级管理员用户,而且能在浏览器中启动 http://127.0.0.1:8000/admin/ ,进入如下页面,本文我们将通过这个系统进行博客发布。

发布博客
那么,如何利用超级管理员发布博客文章呢?我们利用自己创建的用户名和密码进行登录。登录成功后,进入系统,见到如下页面:

我们可以看到,Groups 和 Users 是 Django 在用户管理应用中默认的用户分类。单击 User,我们能看到当前当前项目只有一个用户 zoeu,我们可以自己创建 Groups 和 Users,读者可以自己通过单击 Add 自行添加。

我们今天的任务是通过超级管理员发布博客文章,所以点击 BLOGS 下的 Add 按钮,我们进入如下页面,

在这个页面中添加自己想要完成的博客内容,这里所填的表单中的各项与我们在 BlogArticles 类中的属性对应,当我们填好每一项的内容之后,单击保存,这篇标题为《开工大吉》的博客就被保存到数据库中,页面跳转到博客文章列表,并且将在页面上方显示添加成功,如图所示:

接下来我们可以通过查询数据库查看我们的博客文章内容:
sqlite> .header on
sqlite> .mode column
sqlite> select * from blogs_blogarticles;
id          title       body             publish              author_id
----------  ----------  ---------------  -------------------  ----------
1           开工大吉        假期还没过足瘾,表示舍不得国庆  2019-10-09 16:58:25  1
sqlite>
 
 当然,我们上图中的博客列表有些简单,我们可以自定义让列表页更加丰富,所以我们需要在./blog/admin.py 文章中,增加部分代码:
from django.contrib import admin
from .models import BlogArticles
# Register your models here.
class BlogArticlesAdmin(admin.ModelAdmin):
    list_display = ("title", "author", "publish")
    list_filter = ("publish", "author")
    search_fields = ("title", "body")
    raw_id_fields = ("author",)
    date_hierarchy = "publish"
    ordering = ["-publish", "author"]
admin.site.register(BlogArticles, BlogArticlesAdmin)
 
 保存后刷新我们页面,我们的列表显示如下:

新增代码解释如下:
- 首先定义一个 BlogArticlesAdmin 类,继承自 ModelAdmin
 - list_display 属性:设置列表可显示的字段,将列表栏显示文章标题、作者、和发布时间
 - list_filter 属性:设置过滤选项,通过发布时间和作者对文章进行筛选
 - search_fields 属性:搜索文章标题和文章内容进行文章查找
 - raw_id_fields 属性:显示外键详细信息
 - date_hierarchy 属性:按日期月份筛选
 - ordering 属性:按发布日期排序
 
至此,相比于我们自己用代码去完成这些功能,Django 能够用一行代码即可增加对一个模型(数据表)的增删查改,我们是不是看到一个强大的管理员工具,更多的功能需要自己去发现。
我们现在已经发布我们的博客,但是最重要的是如何把自己的博客给别人看到呢?总不能只能在终端才能查看对吧。
模板引擎设置
要显示文章标题,就要把标题从数据库中先读取出来。我们在创建 BlogArticles 模型时,有一个专门的 title 字段存储文章标题,那么怎么读取到它呢?通过前面学习笔记:
- 一种是通过 
SQL语句进行查询 – **select **语句 - 另一种就是通过 Django 自带的 API 进行读取,这个功能强大的 API 还可以创建、获取、修改和删除对象
 
显示文章标题
在 manage.py 所在的目录创建一个名为 templates 的新文件夹:
myblog/
 |    |-- blog
 |    |-- myblog/
 |    |-- templates/   <-- 这里
 |    +-- venv/
 |    +-- db.sqlite3
 |    +-- manage.py
 
 
 建立的目录如下图:

创建 home.html 文件
然后在 templates 文件夹中,创建一个名为 home.html 的 HTML 文件:
templates/home.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>我的博客</title>
    </head>
    <body>
    <h1>我的博客</h1>
    {% for blog in blogs %}
        <li>{{ blog.title }} </li> <br>
    {% endfor %}
    </body>
</html>
 
 在 home 中,我们使用了原始 HTML 和一些特殊标签 {% for ... in ... %} 和 {{ variable }} 。它们是 Django 模板语言的一部分。
Django 模板语言都需要用到 {} 花括号,块标签 {%block name %},用来包裹块内容,表示其间的内容可以自定义,name 是块的名称。块结束标签 {% endf-block%}。
上面的例子展示了如何使用 for 遍历列表对象,这一点类似 Python 的循环语句,{% for blog in blogs %} 是循环的开始,{% endfor %} 是本循环结束。
{{ blog.title }} 双层花括号的方式表示此处显示变量引用的数据。blog 是从 blogs 的 QuerySet 序列中得到的一个实例对象,blog.title 是某个实例的 title 字段,我们通过这种方式获得一片博客的标题,最后生成动态 HTML 文档。
在使用这个 HTML 页面之前,我们必须告诉 Django 在哪里可以找到我们应用程序的模板(注:如果是利用 Pycharm 创建的 Django 项目,则会自动生成 templates)。
打开myproject 目录下面的 settings.py 文件,搜索 TEMPLATES 变量,并设置 DIRS 的值为 os.path.join(BASE_DIR, 'templates'):
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
 
 创建 home 视图:
在我们完成对 home 模板创建完成后,接下来开始写 home() 函数:
blog/views.py
from django.shortcuts import render
from .models import BlogArticles
# Create your views here.
def home(request):
    blogs = BlogArticles.objects.all()
    return render(request, "home.html", {"blogs":blogs})
 
 还记得当初第三章中写 HelloWorld 页面时编写的 welcome() 函数吗?同样,home() 是在视图文件 views.py 中编写的一个函数,这种方式被称为“基于函数的视图”,这个函数就叫“视图函数”,后面还将学到“基于类的视图”。
为了响应用户请求,然后我们利用前面交互模式中使用的语句 blogs = BlogArticles.objects.all(),得到所有的 BlogArticles 类实例。
然后再以 return 结束当前函数,并返回结果。
render() 的作用是将数据渲染到指定模板,第一个参数必须是 request,然后是模板位置和所传送的数据,数据是用类字典的形式传送给模板的。
home.html 就是展示标题列表的前端页面–被称为“模板”。在每一个应用中都可以有一个专门的模板目录,这个目录的名称必须是 templates。
{"blogs": blogs} 向模板文件 home.html 中传入 blogs 变量所引用的 QuerySet 对象,其包含所有 BlogArticles 类的实例对象,即从数据库中读取所有记录,并在模板文件中以变量 blogs({"blogs": blogs})中的键 blogs 来代表。
更新 urls:
函数和模板都写好了之后,我们还需要做一项工作,就是进行 URL 配置,相信大家在学完第三章后应该知道在哪个文件中进行 URL 配置了吧,对就是 myblog/urls.py 文件中。增加如下新增代码:
myblog/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url    # 新增
from blog import views    # 新增
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^$', views.home, name='home'),    # 新增
]
 
 首页终于变了
最后在浏览器中打开 http://127.0.0.1:8000/ ,结果如下图,看到一个简单的 HTML 页面展示:

可以看到,自己创建的博客文章标题已经显示在浏览器中,相信到这一步你已经激动不已(笔者也是)。细心的读者可以会问了,只是展示了标题,可是并不能通过点击博客文章标题查看博客内容,因为没有超链接。
对,下一篇文章的任务就是带领大家完成如何查看博客文章。
希望本文能对你有所帮助,如果喜欢本文,可以点个赞或关注。
这里是宇宙之一粟,下一篇文章见!
宇宙古今无有穷期,一生不过须臾,当思奋争。
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)