如何利用 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)