设计系统首页(文章列表渲染)
设计系统首页(文章列表渲染)
一、系统首页导航区域
1、让http://127.0.0.1:8000可以直接访问首页
添加一条urls.py配置:
urlpatterns = [
.....
re_path('^$', views.index), # 访问http://127.0.0.1:8000 可以直接访问首页
]
2、应用bootstrap快速编写index首页导航条
(1)引入bootstrap核心文件和jquery
<head>
<!-- 引入 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="/static/blog/bootstrap-3.3.7/css/bootstrap.css">
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="/static/js/jquery-3.3.1.js"></script>
<!-- 引入 Bootstrap 核心 JavaScript 文件 -->
<script src="/static/blog/bootstrap-3.3.7/js/bootstrap.js"></script> <!--依赖jquery-->
</head>
(2)拷入bootstrap导航条模板代码
拷贝这些代码到index页面的body标签内。
(3)对导航条代码做适当调整
由于我们的页面导航栏用不上,删除模板中的form标签和<li class="dropdown">标签的内容。
添加导航栏栏目,编写模板语句,判定登录和未登录两种状态下导航栏右侧显示:
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">园子 <span class="sr-only">(current)</span></a></li>
<li><a href="#">新闻</a></li>
<li><a href="#">博问</a></li>
<li><a href="#">闪存</a></li>
<li><a href="#">小组</a></li>
<li><a href="#">收藏</a></li>
<li><a href="#">招聘</a></li>
<li><a href="#">班级</a></li>
<li><a href="#">找找看</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
{% if request.user.is_authenticated %}
{# 已经登录 #}
<li><a href="#">{{ request.user.username }}</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">修改密码</a></li>
<li><a href="#">修改头像</a></li>
<li><a href="/logout/">注销</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
{% else %}
{# 还未登录 #}
<li><a href="/login/">登录</a></li>
<li><a href="/register/">注册</a></li>
{% endif %}
</ul>
</div><!-- /.navbar-collapse -->
</div>
未登录情况下显示如下:
点击登录跳转到登录页面登录,输入yuan/yuan1234和验证码后,登录成功,跳转回index首页:
(4)运用用户认证组件添加logout注销功能
首先在路由中添加logout路径:
path('logout/', views.logout),
其次在视图中编写logout视图函数:
from django.contrib import auth # 引入用户认证组件auth模块
def logout(request):
auth.logout(request) # 等同于执行request.session.flush()
return redirect("/login/")
在首页点击注销操作,页面返回到登录页面,手动访问博客首页,导航栏右侧显示登录/注册按钮。
(5)在导航栏添加小人图标
首先在用户名前添加span标签,并添加bootstrap样式
<ul class="nav navbar-nav navbar-right">
{% if request.user.is_authenticated %}
{# 已经登录 #}
<li><a href="#"><span id="user_icon" class="glyphicon glyphicon-user"></span>{{ request.user.username }}</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">修改密码</a></li>
<li><a href="#">修改头像</a></li>
<li><a href="/logout/">注销</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
{% else %}
{# 还未登录 #}
<li><a href="/login/">登录</a></li>
<li><a href="/register/">注册</a></li>
{% endif %}
</ul>
注意bootstrap的Glyphicons 字体图标使用:
调整小人图标样式:
<style>
#user_icon {
font-size: 18px; /*调整大小*/
margin-right: 10px; /*调整距离*/
vertical-align: -3px; /*调整高度*/
}
</style>
显示效果如图所示:
二、系统首页主体布局
利用bootstrap提供的栅格系统,将页面按3-6-3的比例划分:
<div class="container-fluid">
<div class="row">
<div class="col-md-3">111</div>
<div class="col-md-6">222</div>
<div class="col-md-3">333</div>
</div>
</div>
左右两个部分先不做,暂时使用bootstap的面板进行填充:
<div class="panel panel-warning">
<div class="panel-heading">Panel heading without title</div>
<div class="panel-body">
Panel content
</div>
</div>
显示效果如下所示:
三、Django的admin组件介绍及使用
admin是Django内部的一个组件:后台数据管理组件(WEB页面)。admin并不是项目必需的。
1、创建用户认证组件超级用户来登录和使用admin组件页面
(venv) MacBook-Pro:cnblog hqs$ python3 manage.py createsuperuser Username: alex Email address: Password: Password (again): Superuser created successfully.
创建好新的超级用户的账号密码:alex/alex1234,访问admin页面:
登录成功后显示如下:
2、admin注册
在cnblog/blog/admin.py里引入models,并以如下方式注册表:
from django.contrib import admin
# Register your models here.
from blog import models
admin.site.register(models.UserInfo) # 用户信息表
admin.site.register(models.Blog)
admin.site.register(models.Category)
admin.site.register(models.Tag)
admin.site.register(models.Article) # 文章表
admin.site.register(models.ArticleUpDown) # 文章点赞表
admin.site.register(models.Article2Tag)
admin.site.register(models.Comment) # 评论表
注册完成后,页面如下所示:
3、如何利用admin录入文章数据
(1)创建博客对象
创建好的博客对象如下所示:
(2)博客对象和用户绑定一对一关系
如下所示将alex绑定曹刘社区,yuan绑定yuan个人博客。
(3)在Articles表里录入文章数据
填写并保存文章,发现admin强行限制Category(分类)必须得加。
添加category对象:
文章添加成功:
四、系统首页的文章列表渲染
1、拿到当前所有文章对象传递到index首页
views.py:
from blog import models
def index(request):
# 拿到当前所有的文章
article_list = models.Article.objects.all()
return render(request, "index.html", {"article_list": article_list})
2、首页文章列表初步渲染
index.html:
<!--文章列表部分-->
<div class="col-md-6">
<div class="article_list">
{% for article in article_list %}
<div class="article-item">
<h5><a href="">{{ article.title }}</a></h5>
<div class="article-desc">
<span class="media-left">
{# 用户头像 #}
<a href=""><img width="56" height="56" src="media/{{ article.user.avatar }}" alt=""></a>
</span>
<span class="media-right">
{# 文章摘要 #}
{{ article.desc }}
</span>
</div>
</div>
<hr>
{% endfor %}
</div>
</div>
注意:
(1)浏览器访问头像路径一定要在前面拼接media别名
<div class="article-desc">
<span>
<a href=""><img width="56" height="56" src="media/{{ article.user.avatar }}" alt=""></a>
</span>
</div>
(2)获取文章摘要信息
<span class="media-right">
{# 文章摘要 #}
{{ article.desc }}
</span>
(3)利用bootstrap提供的media-left和media-right调整文章样式,添加<hr>标签分隔文章块。
显示效果如下:
3、进一步渲染文章列表详细信息
index.html:
<!--文章下方详细信息-->
<div class="small pub_info">
{# 作者 #}
<span><a href="">{{ article.user.username }}</a></span>
{# 文章发布时间 #}
<span>发布于 {{ article.create_time|date:"Y-m-d H:i" }}</span>
{# 评论数 #}
<span class="glyphicon glyphicon-comment"></span> 评论({{ article.comment_count }})
{# 点赞数 #}
<span class="glyphicon glyphicon-thumbs-up"></span> 点赞({{ article.up_count }})
</div>
注意:
(1)日期显示需要修改时区,修改settings.py中的TIME_ZONE字段
# TIME_ZONE = 'UTC'
TIME_ZONE = "Asia/Shanghai"
(2)引入bootstrap的Glyphicons字体图标显示评论图标和点赞图片
{# 评论数 #}
<span class="glyphicon glyphicon-comment">评论({{ article.comment_count }})</span>
{# 点赞数 #}
<span class="glyphicon glyphicon-thumbs-up">点赞({{ article.up_count }})</span>
(3)在这里发现模型中Article类的评论、点赞计数字典没有添加,系统报错
comment_count = models.IntegerField(default=0)
up_count = models.IntegerField(default=0)
down_count = models.IntegerField(default=0)
添加上述代码后,再次执行数据库迁移命令:
$ python3 manage.py makemigrations $ python3 manage.py migrate
(4)样式调整,给这个详情信息区域添加class="small",让字体变小外,通过CSS调整图标样式
<style>
#user_icon {
font-size: 18px; /*调整大小*/
margin-right: 10px; /*调整距离*/
vertical-align: -3px; /*调整高度*/
}
.pub_info {
margin-top: 10px;
}
.pub_info .glyphicon-comment {
vertical-align: -1px;
}
</style>
显示效果: