技术标签: # 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访问的方式实在是太不友好。
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>
{% url '...' %}
是Django规定的模板解耦语法,用它可以根据我们在urlss.py
中设置的名字,反向解析到对应的url中去;关于其中的 article:article_list
的解释:
article
是在项目根目录的urls.py
中定义的app的名称;article_list
是在app中的urls.py
中定义的具体的路由地址通过这样的方法就将链接跳转的指向给配置好了,只要对应的url名称不变,url本身无论怎么变化,Django都可以解析到正确的地址,很灵活。
当然也可以直接在href
中写入url的地址,但是一旦url有变化,所有相关的链接都会失效,维护性不好。
改写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页面
了。
错误来源.\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
原文链接:这里有图有真相1.JSONObjectjsonobject的意思是对象。我们可以把万事万物都看作”对象“,比如”人“就可以作为对象。每一个对象都有很多”属性“,比如人有名字、身高、性别等,这些名字、身高、性别就是”人“这个对象的”属性“。2.JSONArrayjsonarray是数组,通常情况下,一个数组可以由多个对象构成,也就是一个jsonobject。3.关系(1)情景1:一个班级里有很多学生,每个学生都有“姓名”、“学号”,“性别”,“年龄”等属性。那么每个学生就是一个“对象”(
【题目描述】输入两个正整数a和b,试交换a、b的值(使a的值等于b,b的值等于a)。【输入】输入两个正整数a和b。【输出】输出a与b交换值后的结果。【输入样例】2 3【输出样例】3 2【参考代码】#include<bits/stdc++.h>using namespace std;int a,b,t;//a,b以及中间变量tint main(){ cin>>a>>b; t=a; a=b; b=t;//交换值方法 cout<<
报错如题所示,找不到或无法加载主类解决方法这是因为我加了多个mudle,导致找不到启动类,然后我在启动类中即主类Application中启动debug或者是run,都是可以正常运行的,编辑 Configurations 中的环境变量,如图所示:user classpath of module 参数选择启动类所在的module即可。ps:网上找的很多教程,貌似都没用… 自己比较了下两个Configurations,发现不同,改正下启动类的位置就ok了...
小李默默吐槽,被这个高斯拟合分布折磨的吐血,下面是正文首先是公式# 自定义函数 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 =
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...
Gson的基础的使用Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法,我常用的总共有5个Gson.toJson(Object);Gson.fromJson(Reader,Class);Gson.fromJson(String,Class);Gson.fromJson(Reader,Type);
Linux网络编程一步一步学-网络广播、组播与单播 这里以下图所示的网络为基础来说明网络通讯的各种方式:什么是广播?以前面的文章<Linux网络编程一步一步学-UDP方式广播通讯>为例:就是用下列命令在上图所示的主机192.168.100.xa上运行客户端程序:./clien
何为成长?成长是指自我提升,一方面是本身的个人能力,另一方面是社会对你的认可度。最终,程序员的职位和薪水都能在成长中得以体现。很多人对成长有误解,在他们眼中,随着工作年限的提高,成长是理所当然的事情,这其实是一个误区。两个程序员同时工作3年,难道他们两个的成长就完全一样吗?其实是不一样的。很多岗位在招聘的时候都要求3年以上工作经验,这个3年工作经验是指持续成长的三年,而不是指浑浑噩噩混日子的三年。下面举个通俗易懂的例子,大家一定能理解。HR眼中的你无人问津的原因1、大公司重点在校招,而非社招大公.
spring cloud事务管理 10余年软件工作经验,任职过程序员,项目经...