Django搭建个人博客--文章详情_mr无妨_贝勒里恩的博客-程序员秘密

技术标签: # python  

有了文章列表后,当然还需要详情页面,方便用户对某一篇感兴趣的文字深入阅读。

一、编写视图函数

打开article/views.py,增加文章详情页面的视图函数article_detail()

...
# 文章详情
def article_detail(request,id):
	# 取出相应的文章
	article = ArticlePost.objects.get(id=id)
	# 需要传递给模板的对象
	context = {
     'article' : article }
	# 载入模板,并返回context对象
	return render(request, 'article/detail.html', context)
  • article_detail(request, id):函数中多了id这个参数。注意我们在写model的时候并没有写叫做id的字段,这是Django自动生成的用于索引数据表的主键。有了它才有办法知道到顶应该取出哪篇文章。
  • ArticlePost.objects.get(id=id):意思是在所有文章中,取出id值相符合的唯一的一篇文章。

二、配置路由地址

打开article/urls.py,配置article-detail路由地址


# 引入path
from django.urls import path
# 引入views.py
from . import views

# 正在部署的应用的名称
app_name = 'article'

urlpatterns = [
    # path函数将url映射到视图
    path('article-list/', views.article_list, name='article_list'),
    # 文章详情
    path('article-detail/<int:id>/', views.article_detail, name='article_detail'),

]
  • <int:id>:Django2.0的path新语法用尖括号<>定义需要传递的参数。这里需要传递名叫id的整数到视图函数中去。

三、编写模板

templates/article/中新建detail.html文件,编写如下代码

<!-- extends表明此页面继承自base.html文件 -->
{
    % extends "base.html" %}
{
    % load staticfiles %}

<!-- 写入base.html中定义的title -->
{
    % block title %}
	文章详情
{
    % endblock title %}

<!-- 写入base.html中定义的content -->
{
    % block content %}

<!-- 文章详情 -->
<div class="container">
	<div class="row">
		<!-- 标题及作者 -->
		<h1 class="col-l2 mt-4 mb-4">{
    {
     article.title }}</h1>
		<div class="col-l2 alert alert-success">作者:{
    {
     article.author }}</div>
		<!-- 文章正文 -->
		<div class="col-l2">
			<p>{
    {
     article.body }}</p>
		</div>
	</div>
</div>

{
    % endblock content %}

四、查看效果

启动服务器,浏览器输入http://127.0.0.1:8000/article/article-detail/2/

在这里插入图片描述


五、优化网页入口

虽然已经实现了文章详情功能,但是通过输入url访问的方式实在是太不友好。

5.1、改写header.html

改写header.html,让用户可通过导航栏右侧的文字链接返回首页

<!-- 定义导航栏 -->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container">

        <!-- 导航栏商标 -->
        <a class="navbar-brand" href="{% url 'article:article_list' %}">我的博客</a>

        <!-- 导航入口 -->
        <div>
            <ul class="navbar-nav">
                <!-- 条目 -->
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'article:article_list' %}">文章</a>
                </li>
            </ul>
        </div>

    </div>
</nav>
  • href定义了链接跳转的地址;
  • {% url '...' %}是Django规定的模板解耦语法,用它可以根据我们在urlss.py中设置的名字,反向解析到对应的url中去;

关于其中的 article:article_list 的解释:

  • 前面的article是在项目根目录的urls.py中定义的app的名称;
  • 后面的article_list是在app中的urls.py中定义的具体的路由地址

通过这样的方法就将链接跳转的指向给配置好了,只要对应的url名称不变,url本身无论怎么变化,Django都可以解析到正确的地址,很灵活。

当然也可以直接在href中写入url的地址,但是一旦url有变化,所有相关的链接都会失效,维护性不好。

5.2、改写list.html

改写list.html,让用户可点击阅读文本进入文字详情:

<!-- extends表明此页面继承自base.html文件 -->
{% extends "base.html" %}
{% load staticfiles %}

<!-- 写入 base.html 中定义的 title  -->
{% block title %}
	首页
{% endblock title %}

<!-- 写入 base.html 中定义的content -->
{% block content %}

<!-- 定义放置文章标题的div容器 -->
<div class="container">
	<div class="row mt-2">

		{% for article in articles %}
		<!-- 文章内容 -->
		<div class="col-4 mb-4">
			<!-- 卡片容器 -->
			<div class="card h-100">
				<!-- 标题 -->
				<h4 class="card-body">{
   { article.title }}</h4>
				<!-- 摘要 -->
				<div class="card-body">
					<p class="card-text">{
   { article.body|slice:'100' }}</p>
				</div>
				<!-- 注脚 -->
				<div class="card-footer">
					<a class="btn btn-primary" href="{% url 'article:article_detail' article.id %}">阅读文本</a>
				</div>
			</div>
		</div>
		{% endfor %}

	</div>
</div>
{% endblock content %}

id传递过程解析:

  • list.html中,通过href="{% url 'article:article_detail' article.id %}",将id传递给article/urls.py
  • article/urls.py中,通过<int:id>传递给视图函数article_detail()
  • 在视图函数article_detail()中,通过形参id取得了文章的id值,并进行处理,最终定位了需要获取的文字对象;

六、查看效果

接下来就可以在list页面中通过点击阅读文本进入detail页面,通过点击文章返回list页面了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Mr_robot_strange/article/details/109712675

智能推荐

keil出现错误declaration is incompatible_kobesdu的博客-程序员秘密

错误来源.\ECAT\inc\STM32appl.h(38): error: #147: declaration is incompatible with "unsigned shortnPdInputSize" (declared at line 396 of ".\ECAT\inc\ecatslv.h")  extern UINT16 nPdInputSize;.\ECAT\inc

什么是JSONArray?什么是JSONObject?_城南蝈蝈的博客-程序员秘密

原文链接:这里有图有真相1.JSONObjectjsonobject的意思是对象。我们可以把万事万物都看作”对象“,比如”人“就可以作为对象。每一个对象都有很多”属性“,比如人有名字、身高、性别等,这些名字、身高、性别就是”人“这个对象的”属性“。2.JSONArrayjsonarray是数组,通常情况下,一个数组可以由多个对象构成,也就是一个jsonobject。3.关系(1)情景1:一个班级里有很多学生,每个学生都有“姓名”、“学号”,“性别”,“年龄”等属性。那么每个学生就是一个“对象”(

信息学奥赛一本通题库2064 交换值_乔伟宸的博客-程序员秘密

【题目描述】输入两个正整数a和b,试交换a、b的值(使a的值等于b,b的值等于a)。【输入】输入两个正整数a和b。【输出】输出a与b交换值后的结果。【输入样例】2 3【输出样例】3 2【参考代码】#include&lt;bits/stdc++.h&gt;using namespace std;int a,b,t;//a,b以及中间变量tint main(){ cin&gt;&gt;a&gt;&gt;b; t=a; a=b; b=t;//交换值方法 cout&lt;&lt

IDEA错误: 找不到或无法加载主类解决方法_idea debugger找不到启动类_采坑先锋的博客-程序员秘密

报错如题所示,找不到或无法加载主类解决方法这是因为我加了多个mudle,导致找不到启动类,然后我在启动类中即主类Application中启动debug或者是run,都是可以正常运行的,编辑 Configurations 中的环境变量,如图所示:user classpath of module 参数选择启动类所在的module即可。ps:网上找的很多教程,貌似都没用… 自己比较了下两个Configurations,发现不同,改正下启动类的位置就ok了...

用python对数据进行高斯拟合分布_python 拟合高斯分布_ltjszmrx的博客-程序员秘密

小李默默吐槽,被这个高斯拟合分布折磨的吐血,下面是正文首先是公式# 自定义函数 def func(x, a, u, sig): return a*(np.exp(-(x - u) ** 2 / (2 * sig ** 2)))然后就是横纵坐标,画图 x = np.array(dist) y = np.array(probability_dist) popt, pcov = curve_fit(func, x, y, p0=[2, 2, 2], maxfev=500000) a =

Mac下使用Oh my zsh_ohmyzsh mac_xiliuhu的博客-程序员秘密

1.安装zshmac下自带zsh,但不是最新。查看zsh版本:zsh --version可以通过brew安装最新版,brew install zsh2.安装oh-my-zshcd ~ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh ~目录下没有.zshrc 3.1 touch .zshrc 3.2 cp ~/.zshrc ~/.zshrc.orig 创建zsh配置文件cp ~/.oh...

随便推点

Android只json数据的处理-Gson_android gson tojson 过滤null_xh_4215的博客-程序员秘密

Gson的基础的使用Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法,我常用的总共有5个Gson.toJson(Object);Gson.fromJson(Reader,Class);Gson.fromJson(String,Class);Gson.fromJson(Reader,Type);

Linux网络编程一步一步学-网络广播、组播与单播_f5key的博客-程序员秘密

Linux网络编程一步一步学-网络广播、组播与单播 这里以下图所示的网络为基础来说明网络通讯的各种方式:什么是广播?以前面的文章<Linux网络编程一步一步学-UDP方式广播通讯>为例:就是用下列命令在上图所示的主机192.168.100.xa上运行客户端程序:./clien

手把手教你5G时代Webview的正确使用姿势,分享一点面试小经验_赵是水瓶座的博客-程序员秘密

何为成长?成长是指自我提升,一方面是本身的个人能力,另一方面是社会对你的认可度。最终,程序员的职位和薪水都能在成长中得以体现。很多人对成长有误解,在他们眼中,随着工作年限的提高,成长是理所当然的事情,这其实是一个误区。两个程序员同时工作3年,难道他们两个的成长就完全一样吗?其实是不一样的。很多岗位在招聘的时候都要求3年以上工作经验,这个3年工作经验是指持续成长的三年,而不是指浑浑噩噩混日子的三年。下面举个通俗易懂的例子,大家一定能理解。HR眼中的你无人问津的原因1、大公司重点在校招,而非社招大公.

视频教程-spring cloud事务管理-Java_weixin_28837705的博客-程序员秘密

spring cloud事务管理 10余年软件工作经验,任职过程序员,项目经...

推荐文章

热门文章

相关标签