Django博客--4.开发博客文章详情页

文章目录

    • 0.思路引导
    • 1.设计文章详情页的 URL
    • 2.获取文章的URL
    • 3.编写 detail 视图函数
    • 4.编写详情页模板
    • 5.更改主页中跳转详情页的地址链接
    • 6.模板继承--抽取base.html
    • 7.模板继承--修改 index.html使其继承base.html
    • 8.模板继承--修改detail.html使其继承base.html
    • 9.结果展示

0.思路引导

情景:博客首页展示的是所有文章的列表,当用户看到感兴趣的文章时,点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容。
实现方式:首先配置 URL,即把相关的 URL 和视图函数绑定在一起,然后实现视图函数,编写模板并让视图函数渲染模板。
逻辑总结
1)用户进入博客首页时,根据blog/urls.py中路由的地址,调用视图函数中views.py的index()函数,此步骤一方面从后端获取全部文章的数据(注意每篇文章都有一个pk,也即文章id),另一方面将数据返回到index.html并展示给用户;
在这里插入图片描述2)用户点击对内容感兴趣的博客(点击文章标题或者“继续阅读”)时,调用models.py中的get_absolute_url()函数;
在这里插入图片描述在这里插入图片描述
目的是返回用户点击文章的pk,推送给路由中‘blog:datail’指定的视图,即views.py中的detail()函数;

在这里插入图片描述
在这里插入图片描述3)detail()函数根据文章的pk,从后台数据库中获取数据,将数据推送到detail.html并展示给用户。

1.设计文章详情页的 URL

文件位置:blog/urls.py

from django.urls import pathfrom . import viewsapp_name = 'blog'
urlpatterns = [path('', views.index, name='index'),path('posts/<int:pk>/', views.detail, name='detail'),
]

此外我们通过 app_name=‘blog’ 告诉 django 这个 urls.py 模块是属于 blog 应用的

2.获取文章的URL

文件位置:blog/models.py


from django.contrib.auth.models import User
from django.db import models
from django.urls import reverse
from django.utils import timezoneclass Post(models.Model):...def __str__(self):return self.title# 自定义 get_absolute_url 方法# 记得从 django.urls 中导入 reverse 函数def get_absolute_url(self):return reverse('blog:detail', kwargs={'pk': self.pk})

3.编写 detail 视图函数

文件位置:blog/views.py

from django.shortcuts import render, get_object_or_404
from .models import Postdef index(request):# ...def detail(request, pk):post = get_object_or_404(Post, pk=pk)return render(request, 'blog/detail.html', context={'post': post}

4.编写详情页模板

从下载的博客模板中,把 single.html 拷贝到 templates\blog 目录下(和 index.html 在同一级目录),然后改名为 detail.html

5.更改主页中跳转详情页的地址链接

文件位置:templates/blog/index.html

<article class="post post-{{ post.pk }}"><header class="entry-header"><h1 class="entry-title"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h1>...</header><div class="entry-content clearfix">...<div class="read-more cl-effect-14"><a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav"></span></a></div></div>
</article>
{% empty %}<div class="no-post">暂时还没有发布的文章!</div>
{% endfor %}

在这里更改两个位置,第一个是文章标题处:

<h1 class="entry-title"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
</h1>

第二处修改的是继续阅读按钮的链接:

<a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav"></span>
</a>

6.模板继承–抽取base.html

首先在 templates\ 目录下新建一个 base.html 文件,可以看到 index.html 文件和 detail.html 文件除了 main 标签包裹的部分不同外,其它地方都是相同的,我们可以把相同的部分抽取出来,放到 base.html 里;

把 index.html 的内容全部拷贝到 base.html 文件里,然后删掉 main 标签包裹的内容,替换成如下的内容:

...
<main class="col-md-8">{% block main %}{% endblock main %}
</main>
<aside class="col-md-4">{% block toc %}{% endblock toc %}...
</aside>
...

这里的 {% block main %}{% endblock main %} 是一个占位框,main 是我们给这个 block 取的名字。

同时我们也在 aside 标签下加了一个 {% block toc %}{% endblock toc %} 占位框,因为 detail.html 中 aside 标签下会多一个目录栏。

当 {% block toc %}{% endblock toc %} 中没有任何内容时,{% block toc %}{% endblock toc %} 在模板中不会显示。但当其中有内容是,模板就会显示 block 中的内容。

7.模板继承–修改 index.html使其继承base.html

在 index.html 里,我们在文件最顶部使用 {% extends ‘base.html’ %} 继承 base.html,这样就把 base.html 里的代码继承了过来,另外在 {% block main %}{% endblock main %} 包裹的地方填上 index 页面应该显示的内容:

文件位置:templates/blog/index.html

{% extends 'base.html' %}{% block main %}{% for post in post_list %}<article class="post post-1">...</article>{% empty %}<div class="no-post">暂时还没有发布的文章!</div>{% endfor %}<!-- 简单分页效果<div class="pagination-simple"><a href="#">上一页</a><span class="current">6/11</span><a href="#">下一页</a></div>--><div class="pagination">...</div>
{% endblock main %}

8.模板继承–修改detail.html使其继承base.html

在 {% block main %}{% endblock main %} 里填充 detail.html 页面应该显示的内容,以及在 {% block toc %}{% endblock toc %} 中填写 base.html 中没有的目录部分的内容。

文件位置:templates/blog/detail.html


{% extends 'base.html' %}{% block main %}<article class="post post-1">...</article><section class="comment-area">...</section>
{% endblock main %}
{% block toc %}<div class="widget widget-content"><h3 class="widget-title">文章目录</h3><ul><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></div>
{% endblock toc %}

并修改上述文件中, article 标签下的一些内容为模板变量,让其显示文章的实际数据:

<article class="post post-{{ post.pk }}"><header class="entry-header"><h1 class="entry-title">{{ post.title }}</h1><div class="entry-meta"><span class="post-category"><a href="#">{{ post.category.name }}</a></span><span class="post-date"><a href="#"><time class="entry-date"datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span><span class="post-author"><a href="#">{{ post.author }}</a></span><span class="comments-link"><a href="#">4 评论</a></span><span class="views-count"><a href="#">588 阅读</a></span></div></header><div class="entry-content clearfix">{{ post.body }}</div>
</article>

9.结果展示

再次从首页点击一篇文章的标题或者继续阅读按钮跳转到详情页面,可以看到效果如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10、并发容器,ConcurrentHashMap

Java 提供了不同层面的线程安全支持。在传统集合框架内部&#xff0c;除了 Hashtable 等同步容器&#xff0c;还提供了所谓的同步包装器&#xff08;Synchronized Wrapper&#xff09;&#xff0c;我们可以调用 Collections 工具类提供的包装方法&#xff0c;来获取一个同步的包…

程序员的本质

Computers are useless. They can only give you answers. – Picasso计算机没有什么作用。他们只能告诉你答案。——毕加索很多人&#xff08;包括我岳母&#xff09;认为计算机变得如此智能&#xff0c;所以在不久的未来将不再需要程序员。另外一些人认为程序员是天才&#x…

剖析管理所有大数据组件的可视化利器:Hue

欢迎关注大数据和人工智能技术文章发布的微信公众号&#xff1a;清研学堂&#xff0c;在这里你可以学到夜白&#xff08;作者笔名&#xff09;精心整理的笔记&#xff0c;让我们每天进步一点点&#xff0c;让优秀成为一种习惯&#xff01; 日常的大数据使用都是在服务器命令行中…

Django博客--5.让博客支持 Markdown 语法和代码高亮

文章目录0.前言1.安装 Python Markdown2.在 detail 视图中解析 Markdown3.safe 标签4.代码高亮5.效果展示0.前言 Markdown 是一种 HTML 文本标记语言&#xff0c;只要遵循它约定的语法格式&#xff0c;Markdown 的解析工具就能够把 Markdown 文档转换为标准的 HTML 文档&#…

Diango博客--6.Markdown 文章自动生成目录

文章目录0.思路引导1.在文中插入目录2.在页面的任何地方插入目录3.美化标题的锚点 URL0.思路引导 Markdown 在解析内容的同时还可以自动提取整个内容的目录结构&#xff0c;本文内容将从以下几个方面展开&#xff1a; 1&#xff09;在文中插入目录&#xff1b; 2&#xff09;在…

Java中对象和引用的理解

2019独角兽企业重金招聘Python工程师标准>>> 偶然想起Java中对象和引用的基本概念&#xff0c;为了加深下对此的理解和认识&#xff0c;特地整理一下相关的知识点&#xff0c;通过具体实例从两者的概念和区别两方面去更形象的认识理解&#xff0c;再去记忆。12一、对…

android怎样封装,如何封装属于自己的博客网站安卓APP 源码家园

说实话我今天在写这个文章的时候是我使用易语言(E4A\易安卓)的第一天&#xff0c;我也是易小白&#xff0c;但是的确可以用&#xff01;我为什么写这个文章呢&#xff1f;因为之前我也想封装自己的网站&#xff0c;然后去网上找的在线封装生成APP&#xff0c;果然能封装好了&am…

Diango博客--7.自动生成文章摘要

文章目录0.思路引导1.方法一&#xff1a;覆写 save 方法2.方法二&#xff1a;使用 truncatechars 模板过滤器0.思路引导 博客文章的模型有一个 excerpt 字段&#xff0c;这个字段用于存储文章的摘要。 若在 django admin 后台手动为文章输入摘要&#xff0c;每次手动输入摘要…

特斯拉股价暴跌,疯狂烧钱是否真的能够带来高额回报?

“疯狂烧钱”并不能成为公司持续亏损的理由&#xff0c;反而可能成为公司升级转型的关键所在。 上周三&#xff0c;特斯拉发布第四季度财报&#xff0c;其后特斯拉CEO马斯克在电话会议上表示&#xff0c;特斯拉亏损收窄&#xff0c;营收同比增长88%&#xff0c;但与此同时其首…

Diango博客--8.解锁博客侧栏

文章目录0.思路引导1.[最新文章] 模板标签2.[归档] 模板标签3.[分类] 模板标签4.[标签云] 模板标签5.使用自定义的模板标签0.思路引导 博客侧边栏有四项内容&#xff1a;最新文章、归档、分类和标签云&#xff0c;效果展示如下&#xff1a; 这些内容相对比较固定和独立&…

十五、详述 IntelliJ IDEA 插件的安装及使用方法

正文 首先&#xff0c;进入插件安装界面&#xff1a; Mac&#xff1a;IntelliJ IDEA -> Preferences -> Plugins;Windows&#xff1a;File -> Settings -> Plugins.标注 1&#xff1a;显示 IntelliJ IDEA 的插件分类&#xff0c; All plugins&#xff1a;显示 Inte…

面向数据流的设计方法

面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。 在软件工程的需求分析阶段&#xff0c;信息流是一个关键考虑。通常用数据流图描绘信息在系统中加工和流动的 情况。面向数据流的设计方法定义了一些不同的“映射”&#xff0c;利用这些映射可以把数据流图…

AI研究的盲点:无解的神经网络内在逻辑

论人工神经网络内在逻辑的研究历史及现状。 伴随着大数据&#xff0c;人工智能&#xff08;AI&#xff09;在沉寂了多年之后&#xff0c;又迎来了新的高潮。在这场涉及大部分科学的革命中&#xff0c;人工神经网络释放了人工智能&#xff08;AI&#xff09;。但科学家们发现&a…

Diango博客--9.归档、分类和标签页

文章目录0.思路引导1.回顾2.归档页面3.分类页面4.标签页面0.思路引导 侧边栏已经正确地显示了最新文章列表、归档、分类、标签等信息&#xff0c;现在来完善归档、分类和标签功能。 当用户点击归档下的某个日期、分类栏目下的某个分类或者标签栏目下的某个标签时&#xff0c;…

android studio1.2.6,1.2.2 使用Android Studio开发Android APP | 菜鸟教程

写在前面本节将介绍如何使用Android Studio开发Android APP&#xff0c;和前面Eclipse ADT SDK搭建Android开发环境一样&#xff0c;本节也只是介绍一些基本东西&#xff0c;深入的&#xff0c;比如快捷键&#xff0c;小技巧等会再另一篇文章中详细地介绍&#xff01;1.下载A…

UPS开始尝试“货车+无人机”的投递方式,不必再担心快递员离职了

继亚马逊“空中仓库”&#xff0c;无人机送货再现新形式。 作为世界上最大的快递承运商与包裹递送公司&#xff0c;UPS当然也没有放过“送货无人机”这一新颖业务。与亚马逊推出“空中仓库”的理念类似&#xff0c;UPS并没有选择让无人机从仓库直接起飞&#xff0c;而是将之与…

Diango博客--10.交流的桥梁“评论功能”

文章目录0.思路引导1.创建"评论"应用2.设计"评论"的数据库模型3.注册"评论"模型到 admin4.设计“评论”表单5.展示评论表单6.“评论”视图函数7.绑定 URL8.向读者发送是否“评论”成功的状态9.详情页底部显示“评论”内容0.思路引导 本文将创建…

python与android交互,Android客户端与Python服务器端的简单通信

最近在做一个APP&#xff0c;需要与服务器通信&#xff0c;一点一点的尝试&#xff0c;记录一下。本文使用了OkHttp和Flask框架。Android客户端&#xff1a;实现功能输入完点击OK按钮后会toast成功的信息。Python服务端&#xff1a;各部分代码如下&#xff1a;activity_main.xm…

云栖科技评论第48期:前沿科技对世界的改造 我们这代人只完成了1%

1、数字经济版图呈中美双分趋势 日本IT行业为前景担忧 数字经济版图呈中美双分趋势 日本IT行业为前景担忧 【新闻摘要】《日本经济新闻》日前刊文称&#xff0c;数字经济的势力版图呈现中国和美国两强双分的趋势明显&#xff0c;这意味着日本可能不得不使用中美的技术&#xff…

CentOS下添加Root权限用户‘超级用户’方法(xxx is not in the sudoers file.This incident will be reported.的解决方法)

文章目录1.添加普通用户2.添加sudo文件的写权限3.编辑sudoers文件4.撤销sudoers文件写权限1.添加普通用户 [rootserver ~]# useradd fxd //添加一个名为fxd的用户 [rootserver ~]# passwd fxd //修改密码 Changing password for user chenjiafa. New UNIX password: //在这里输…