这篇教程我们一起来完成Django2个人博客系统的文章详情模板。
在定义模板内容之前,我们先完成URL配置。
示例代码:
path('detail/<int:pk>', blog_view.ArticleDetail.as_view(), name='detail'),
然后,我们开始模板的定义。
一、引入基本模板
引入基本模板之后,我们需要定义页面的标题。
使用DetailView会向模板传递一个基于Model的数据对象“object”,当然这个名称可以在视图中重写。
在模板中我们就可以通过“object.title”获取属性,另外,也可以通过类名获取属性,例如“article.title”。
示例代码:(detail.html)
{% extends 'base.html' %}
{% block title %}{{ object.title }}{% endblock %} <!--定义文章标题内容-->
{% block content %}
...此处添加后续代码...
{% endblock %}
二、定义页面内容
文章详情页面主要包含以下内容:
- 文章内容(名称、作者、日期、类别、正文)
- 文章标签
- 评论列表(评论文章、回复评论)
- 发布评论(昵称、邮箱、内容、评论目标)
1、文章内容
示例代码:
<div>
<h3>{{ object.title }}</h3>
<p>作者:{{ object.author }} 日期:{{ object.pub_time }} 类别:<a
href="{% url 'category' article.category.id %}">{{ article.category }}</a></p>
{{ object.content | safe }} <!--过滤器safe能够让文章内容中的HTML标签生效-->
</div>
2、文章标签
一篇文章可能具有多个标签,所以需要对文章的所有标签进行遍历,并呈现在页面中。
另外,标签之间通过“|”进行分隔。
示例代码:
<div>
<h3>标签</h3>
{% for tag in object.tag.all %} <!--遍历所有标签-->
{{ tag }} <!--显示标签到页面-->
{% if not forloop.last %} <!--如果不是循环的最后一项-->
| <!--显示一条竖线-->
{% endif %}
{% endfor %}
</div>
3、评论列表
评论列表需要按顶级评论分块。
因为HTML的列表标签“<ul>…</ul>”是成对的,每一组评论内容都要写在这两个标签中间,所以要注意标签的闭合。
这里存在一些逻辑。
如果不是第一条顶级评论,需要在评论内容前面加上“</ul>”标签,让前一组评论的标签闭合。
如果是顶级评论,需要在评论内容前加上“<ul>”标签。
如果不是顶级评论,需要在评论中加上“>>>”,表示对哪一个评论人的回复。
如果是最后一条评论,需要在评论内容末尾加上“</ul>”标签,让当前一组标签闭合。
示例代码:
<div>
<h3>评论</h3>
{% for comment in comment_list %} <!--遍历评论数据列表-->
{% if comment.reply == None %} <!--如果没有回复目标(即顶级评论)-->
{% if not forloop.first %} <!--如果不是循环遍历的第一项-->
</ul>
{% endif %}
<ul class="list-group"> <!--顶级评论-->
<li class="list-group-item active">{{ comment.name }}:{{ comment.content }} ({{ comment.publish }})
<a href="#publish" onclick="reply('{{ comment.name }}',{{ comment.id }})"
style="color: white;align-self: right">[回复]</a>
<!--onclick的属性中调用了一个js函数 函数的参数为评论人和评论id 此函数在之后实现-->
</li> <!--class的属性值“active”能够让列表项样式为蓝色-->
{% else %}
<li class="list-group-item"> <!--回复评论-->
{{ comment.name }} >>> {{ comment.reply.name }}:{{ comment.content }} ({{ comment.publish }})
<a href="#publish" onclick="reply('{{ comment.name }}',{{ comment.id }})">[回复]</a>
<!--“#publish”能够让页面滚动到发表评论的位置-->
</li>
{% endif %}
{% if forloop.last %} <!--如果是循环遍历的最后一项-->
</ul>
{% endif %}
{% empty %} <!--如果数据列表是空的-->
暂无评论!
{% endfor %}
</div>
4、发表评论
发表评论中主要是表单元素以及样式的设置。

示例代码:
<div>
<h3 id="publish">发表评论</h3>
<input type="hidden" id="reply" name="reply" value="0"> <!--隐藏元素 用于记录回复的目标-->
<div class="input-group"> <!--class中调用Bootstrap文本框组的样式-->
<span class="input-group-addon glyphicon glyphicon-user"></span>{{ comment_form.name }}
<!--span标签的class属性中调用Bootstrap文本框组的样式以及文字图标-->
<!--span标签的后方通过表单字段生成页面元素-->
</div>
<div class="input-group" style="margin-top: 10px"> <!--样式的作用是设置和上方的元素间隔-->
<span class="input-group-addon glyphicon glyphicon-envelope"></span>{{ comment_form.email }}
</div>
<div class="input-group" style="margin-top: 10px">
<span class="input-group-addon glyphicon glyphicon-edit"></span>{{ comment_form.content }}
</div>
<button id="submit_comment" type="button" class="btn btn-default" style="margin-top: 10px"><span
class="glyphicon glyphicon-hand-up"></span> 回复
</button> <!--button标签的class属性中调用Bootstrap按钮样式并通过span标签添加了文字图标-->
<label id="comment_message" hidden style="margin-top: 10px;vertical-align: middle;color: green"></label>
<!--label标签用于显示评论的提示 默认隐藏 样式中定义了与上方元素的间距 与左侧按钮的垂直对齐方式 还有默认文字颜色-->
</div>
到这里,我们的文章详情页就能够正常的显示内容了。
大家可以在Django自带的后台中添加一些评论内容,检验评论是否显示正常。
转载请注明:魔力Python » Django2练习项目:开发个人博客系统(9)