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

举报
宇宙之一粟 发表于 2022/10/30 16:55:32 2022/10/30
【摘要】 前言在上一篇文章中,我们煞费苦心的利用控制台中的命令行对我们的模型进行操作——增删改查。其中,我们创建了一个超级管理员用户,而且能在浏览器中启动 http://127.0.0.1:8000/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 字段存储文章标题,那么怎么读取到它呢?通过前面学习笔记:

  1. 一种是通过 SQL 语句进行查询 – **select **语句
  2. 另一种就是通过 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 页面展示:

在这里插入图片描述

可以看到,自己创建的博客文章标题已经显示在浏览器中,相信到这一步你已经激动不已(笔者也是)。细心的读者可以会问了,只是展示了标题,可是并不能通过点击博客文章标题查看博客内容,因为没有超链接。

对,下一篇文章的任务就是带领大家完成如何查看博客文章。

希望本文能对你有所帮助,如果喜欢本文,可以点个赞或关注。

这里是宇宙之一粟,下一篇文章见!

宇宙古今无有穷期,一生不过须臾,当思奋争。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。