前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python Django个人网站搭建5-编写文章详情页面并支持markdown语法

Python Django个人网站搭建5-编写文章详情页面并支持markdown语法

作者头像
zifan
发布2021-12-14 12:24:11
4150
发布2021-12-14 12:24:11
举报

作者: zifanwang  发布于2020-05-09

1. 编写视图函数

打开article/views.py增加文章详情页函数article_detail():

代码语言:javascript
复制
# 文章详情
def article_detail(request, id):
   article = ArticlePost.objects.get(id=id)
   context = {'article': article}
   # 载入模板,并返回context对象
   return render(request, 'article/detail.html', context) 
2. 编写article/urls.py,配置路由地址:
代码语言:javascript
复制
# 引入path
from django.urls import path
from . import views
# 正在部署的应用的名称
app_name = 'article'
urlpatterns = [
    # path函数将url映射到视图
    path('list/', views.article_list, name='article_list'),
    path('article-detail/<int:id>/', views.article_detail, name='article_detail'),
]
3.编写模板article/detail.html

在templates/article 文件夹里新建detail.html,并输入:

代码语言:javascript
复制
{% extends "base.html" %}
{% load static %}
{% block title %}
    article
{% endblock title %}
{% block content %}
<div class="container">
    <div class="row">
        <h2 class="col-12 mt-4 mb-4">{{ article.title }}</h2>
        <div class="col-12 alert alert-success">author: {{ article.author }}</div>
        <div class="col-12">
            <p>{{ article.body }}</p>
        </div>
    </div>
</div>
{% endblock content %}

然后运行服务器(python manage.py runserver),在浏览器中输入 http://127.0.0.1:8000/article/article-detail/1/ 查看第一篇文章了:

4.优化网页入口

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

代码语言:javascript
复制
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
  <div class="container">
    <a class="navbar-brand" href="#">My Site</a>
    <div>
      <ul class="navbar-nav">
        <li class="nav-item">
          <a class="nav-link" href="{% url 'article:article_list' %}">Article</a>
        </li>
      </ul>
    </div>
  </div>
</nav>

这样点击Article链接就能直接返回首页 同样修改read的按钮链接templates/article/list.html:

代码语言:javascript
复制
{% extends "base.html" %}
{% load static %}
{% block title %}
    Article
{% endblock title %}
{% block content %}
<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-header">{{ article.title }}</h4>
                <div class="card-body">
                    <p class="card-text">{{ article.body|slice:'100' }}...</p>
                </div>
                <div class="card-footer">
                    <a href="{% url 'article:article_detail' article.id %}" class="btn btn-primary">read</a>
                </div>
            </div>
        </div>
        {% endfor %}
    </div>
</div>
{% endblock content %}

这样点击read就能直接进入文章详情页了。

5.令其支持markdown语法

首先安装markdown

代码语言:javascript
复制
pip install markdown

然后修改article/views.pyarticle_detail()

代码语言:javascript
复制
import markdown

. . .

# 文章详情
def article_detail(request, id):
    article = ArticlePost.objects.get(id=id)
    article.body = markdown.markdown(article.body,
                                     extensions=[
                                         'markdown.extensions.extra',
                                         # 语法高亮扩展
                                         'markdown.extensions.codehilite',
                                     ])
    context = {'article': article}
    return render(request, 'article/detail.html', context)

修改templates/article/detail.html

代码语言:javascript
复制
{% extends "base.html" %}
{% load static %}
{% block title %}
    article
{% endblock title %}
{% block content %}
    <div class="container">
        <div class="row">
            <h1 class="col-12 mt-4">{{ article.title }}</h1>
            <div class="col-12 alert alert-success">author: {{ article.author }}</div>
            <div class="col-12">
                <p>{{ article.body|safe }}</p>
            </div>
        </div>
    </div>
{% endblock content %}

Django出于安全的考虑,会将输出的HTML代码进行转义, 这使得article.body中渲染的HTML文本无法正常显示。 管道符|是Django中过滤器的写法,而**|safe就类似给article.body贴了一个标签, 表示这一段字符不需要进行转义了。 修改完成后,在admin后台添加markdown语法的文章:

6.代码高亮设置

static目录中新建一个目录md_css/,用于放置代码高亮的样式文件 打开命令行:安装Pygments

代码语言:javascript
复制
pip install Pygments

进入static/md_css目录中输入Pygments指令:

代码语言:javascript
复制
pygmentize -S monokai -f html -a .codehilite > monokai.css

如果后面的代码高亮无效,很可能是这里出了问题。 完成后可以看见文件夹中多出来一个css文件

之后我们修改base.html文件

代码语言:javascript
复制
{% load static %}
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'md_css/monokai.css' %}">
</head>
<body>
    {% include 'header.html' %}
    {% block content %}{% endblock content %}
    {% include 'footer.html' %}
    <script src="{% static 'jquery/jquery-3.3.1.js' %}"></script>
    <script src="{% static 'popper/popper-1.14.4.js' %}"></script>
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
</body>
</html>

保存后我们查看文章详情:

可以看见支持markdown语法并且代码已经高亮显示

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 编写article/urls.py,配置路由地址:
  • 3.编写模板article/detail.html
  • 4.优化网页入口
  • 5.令其支持markdown语法
  • 6.代码高亮设置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档