小酌Django4——博客文章展示
文章列表页
已发布的文章列表展示页面,展示文章标题;
交互模式下的数据读取
blog/models.py中创建数据模型后,Django会自动提供数据库抽象的API(ORM),进行增删改查操作;
使用命令python manage.py shell
进入交互模式,进行数据库操作练习:
- 该指令可以将Django环境引入到当前交互模式;
$ python manage.py shell
Python 3.7.2 (default, Dec 29 2018, 00:00:04)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: <
继续编写代码:
- 引入User(Django默认的)、BlogArticles(blog/models.py中编写的)对象;
- 获取User数据模型的username字段为baby_hua的对象(也可以说是 auth_user表中,username='baby_hua’的那条记录);
- 赋值后的user是一个包含多个字段值的对象实例(可以理解为User类的一个实例);类似的操作对BlogArticles同样有效;
- 查询方式如代码中实现的;对查询结果,在Django中被称为QuerySet;
In [1]: from django.contrib.auth.models import User
In [2]: from blog.models import BlogArticles
In [3]: user = User.objects.get(username="baby_hua")
In [4]: user.username
Out[4]: 'baby_hua'
In [5]: user.id
Out[5]: 1
In [6]: user.password
Out[6]: 'pbkdf2_sha256$180000$f1G0ToF5qCJ1$yc+vGbCio5qIF3BsZTbYZw2OC5+Dv9tbTL0XxvKkCKw='
In [7]: user.email
Out[7]: 'hua_qiang_work@163.com'
In [8]: type(user)
Out[8]: django.contrib.auth.models.User
In [9]: blogs = BlogArticles.objects.all()
In [10]: blogs
Out[10]: <QuerySet [<BlogArticles: 这是一篇简单的博客5>, <BlogArticles: 这是一篇简单的博客4>, <BlogArticles: 这是一篇简单的博客3>, <BlogArticles: 这是一篇简单的博客2>, <BlogArticles: 这是一篇简单的博客1>]>
In [11]: for blog in blogs:
...: print(blog.title)
...:
这是一篇简单的博客5
这是一篇简单的博客4
这是一篇简单的博客3
这是一篇简单的博客2
这是一篇简单的博客1
In [12]: exit()
应用视图中的数据读取
如读取文章标题,可以写一个函数blog_title()
进行实现,该函数通常被写在blog/views.py
文件中;views.py是视图文件,在其中实现的类似blog_title()
的函数,我们称之为“视图函数”,视图就变成“基于函数的视图
”(后续还有“基于类的视图
”的编写方式);
from django.shortcuts import render
# Create your views here.
from .models import BlogArticles
def blog_title(request):
blogs = BlogArticles.objects.all()
return render(request, "blog/titles.html", {"blogs": blogs})
blog_title()
函数:
- 这是一个响应用户请求的函数;
- 第一参数request,负责响应所接收到的请求;根据需求还可以增加其他参数;
render()
函数:可以将数据渲染到指定模板上:
- 第一参数必须是request,然后是模板位置 和 所传送的数据,传送的数据使用类字典的形式;
- 该函数与
render_to_response()
效果相同,区别在于render()
作为快捷方式,会自动使用RequestContext
;
编写模板
- 模板位置
blog/titles.html
是标题列表在前端展示的页面,一般被称为模板; - 每个应用都可以有一个专门的模板目录:
templates
templates
目录是Django默认存放当前应用所需模板的目录;Django会在运行时自动查找render()函数中指定的模板;- 在
blog
目录下新建子目录templates
,结构规范如下;
templates
base.html
blog
titles.html
templates/base.html
基础模板代码示例:
- 所有模板中的公共部分;这样其他文件中只需要编写个性部分代码;表现出“继承”的特性;
- Django模板中,
{% block name %}
表示这是一个名为name的块标签
,用来包裹自定义内容;结束标签为{% endblock %}
;
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="http://necolas.github.io/normalize.css/">
<link rel="stylesheet" href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css">
</head>
<body>
<div class="container">
{% block content %}
{% endblock %}
</div>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
</body>
</html>
templates/blog/titles.html
标题列表模板代码示例:
{% extends "base.html" %}
<!-- 重写title块标签所表示的内容 -->
{% block title %}
blog titles
{% endblock %}
<!-- 重写content块标签所表示的内容 -->
{% block content %}
<div class="row text-center vertical-middle-sm">
<h1>我的博客</h1>
</div>
<div class="row">
<div class="col-xs-12 col-md-8">
<ul>
<!-- 这里blogs是 blog_title()函数响应请求时传入的blogs变量,引入的是QuerySet对象:包含了所有BlogArticles类的实例对象; -->
{% for blog in blogs %}
<!-- 双花括号 表示对变量的引用 -->
<li>{{ blog.title }}</li>
{% endfor %}
</ul>
</div>
<div class="col-xs-6 col-md-4">
<h2>广告</h2>
<p>读书笔记</p>
<img width="200px"
src="https://i0.hdslb.com/bfs/face/a0d8a470a7b7b1175c9cc43a88ee4adcd9a97851.jpg@68w_68h.webp">
</div>
</div>
{% endblock %}
配置URL
函数和模板编写好,再配置URL,就可以通过网页访问了:
- 目的是在浏览器访问类似
http://127.0.0.1:8000/blog/
的地址时,通过URL配置,将此请求转向blog
应用的urls.py
: - 第一步:先在
mysite1/urls.py
中配置应用的URL(这个文件顶部注释介绍了如何配置应用的URL); - 第二步:再在某个应用的
urls.py
中配置该应用具体的URL;(没有urls.py文件则创建下)
mysite1/urls.py
中配置:
"""mysite1 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("blog/", include("blog.urls")),
]
blog/urls.py
中配置:
from django.conf.urls import url
from . import views
urlpatterns = [
# r"^$" :表示访问当前应用的根目录,对应:http://127.0.0.1:8000/blog/
# views.blog_title :声明了响应这个请求的函数对象
url(r"^$", views.blog_title, name="blog_title"),
]
文章标题列表显示
现在,访问http://127.0.0.1:8000/blog/
,可以看到如下界面: