前言

上一篇已经实现在xadmin后台编辑markdown语法的文档,编辑完成之后发布博客,在前端html能把markdown语法显示出来。

主要思路是先从数据库把markdown的代码读出来,导入markdown模块,把markdown的语法转换成html语法,再嵌入到模板里面。

markdown

先使用pip按照markdown模块,用于转换markdown为html

pip install markdown

在后台页面编辑的markdown内容,markdown里面插入代码一般有两种方式:一种是把代码全部选中,然后缩进(四个空格)

第二种是代码部分用三个```包起来,后面可以跟着对应语言python,如下(这里不太好展示,前面的\要去掉)

# django 框架介绍

Django 项目是一个Python定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:

- 用于创建模型的对象关系映射
- 为最终用户设计的完美管理界面
- 一流的 URL 设计
- 设计者友好的模板语言
- 缓存系统。 # 图片展示 图片显示 ![](/media/editor/1_20190422134140555628.png) # 代码展示 \```python # 前面的\去掉
from django.db import models
from mdeditor.fields import MDTextField # 必须导入 class Blog(models.Model):
'''博客管理'''
title = models.CharField(max_length=30)
content = MDTextField() # 注意为MDTextField() def __str__(self):
return self.__doc__ + "title->" + self.title class Meta:
verbose_name = "博客发布"
verbose_name_plural = verbose_name
\``` # 前面的\去掉

views试图

在views.py中导入markdown,这里extensions里面三个参数用法,

  • markdown.extensions.extra 本身包含很多扩展
  • markdown.extensions.codehilite 是语法高亮,后面插入代码会用到
  • markdown.extensions.toc 是自动生成目录
from .models import Blog
import markdown def detail(request, id):
'''博客详情展示, 根据id读取'''
blog = Blog.objects.filter(id=int(id)).first()
blog.content = markdown.markdown(blog.content,
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc',
],
safe_mode=True,
enable_attributes=False)
context = {
"blogmd": blog
}
return render(request, 'blogmd.html', context)

templates模板

接下来把markdown的内容插入到以下模板的{{ blogmd.content | safe}} 位置,这里需加个safe参数,

Django 出于安全方面的考虑,任何的 HTML 代码在 Django 的模板中都会被转义(即显示原始的 HTML 代码,而不是经浏览器渲染后的格式)。

为了解除转义,只需在模板标签使用 safe 过滤器即可,告诉 Django,这段文本是安全的,你什么也不用做

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../static/hello/css/code.css" type="text/css">
<title>{{blogmd.title}}</title> </head> <body> <div style="margin: 5% 20%;">
<h1>{{blogmd.title}}</h1>
<br>
<div class="author">
<span class="publish-time">2019.04.22 18:28 发布</span>
<span class="wordage">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者: 上海-悠悠</span>
<span class="views-count">&nbsp;&nbsp;&nbsp;&nbsp;阅读 9999</span>
</div>
<hr> {{ blogmd.content | safe}} </div>
</body>

文件名保存为blogmd.html

urls.py设置

urls.py设置访问地址

from django.conf.urls import url
from hello import views urlpatterns = [
url(r'^blog/(.+).html$', views.detail),
]

访问地址:http://localhost:8000/blog/2.html页面效果如下

代码高亮展示

这里代码部分,默认是不会有背景的,也不会也高亮,如下图

代码高亮展示需要安装Pygments模块

pip install Pygments

接着在你的app的static目录新建一个css目录:hello/static/hello/css

打开cmd, cd到hello/static/hello/css目录,执行以下指令,会在当前目录生成一个code.css文件

pygmentize -S default -f html -a .codehilite > code.css

在模板里面引入这个css文件就可以了,在head里面加一个link

<link rel="stylesheet" href="../static/hello/css/code.css" type="text/css">

刷新页面后,就能显示高亮的代码了

python测试开发django-56.模板渲染markdown语法+代码高亮的更多相关文章

  1. python测试开发django-67.templates模板变量取值

    前言 django 的模板里面变量取值是通过句点语法来取值,就是一个点(.)符号.取值的对象也可以是字符串,int类型,list列表,字典键值对,也可以是一个类的实例对象. views视图 比如我在 ...

  2. python测试开发django-68.templates模板标签{% for %}

    前言 有些标签类似这样: {% tag %} ,需要开始和结束标签 例如:{% tag %} ...标签 内容 ... {% endtag %},一般用于循环列表对象输出内容. for 标签 {% f ...

  3. Python后台开发Django( 模板 与 值匹配 )

    模板文件(templates) 在setting.py中,设置模板存放位置 在APP中view的使用 from django.shortcuts import render #导入 def homex ...

  4. python测试开发django-2.templates模板与html页

    前言 Django 中的视图的概念是一类具有相同功能和模板的网页的集合.通俗一点来说,就是你平常打开浏览器,看到浏览器窗口展示出来的页面内容,那就是视图.前面一章通过浏览器访问http://127.0 ...

  5. python测试开发django-69.templates模板过滤器filter

    前言 templates 模板里面过滤器 filter 的作用是对变量的出来,比如小写转大写,替换一些特殊字符,对列表取值,排序等操作. 内置的过滤器有很多,本篇拿几个常用的过滤器做案例讲解下相关的功 ...

  6. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  7. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  8. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  9. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

随机推荐

  1. awk命令的用法实战

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAn8AAADvCAIAAAAM1SXGAAAgAElEQVR4nO2dz8s125XXHx9oTXMHUZ

  2. sparkStreaming消费kafka-1.0.1方式:direct方式(存储offset到zookeeper)-- 2

    参考上篇博文:https://www.cnblogs.com/niutao/p/10547718.html 同样的逻辑,不同的封装 package offsetInZookeeper /** * Cr ...

  3. Codeforces Gym100543G Virus synthesis 字符串 回文自动机 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-100543G.html 题目传送门 - CF-Gym100543G 题意 你可以对一个字符串进行以下两种操 ...

  4. 最终一致性2PC复杂场景,事务报数据库操作超时。

    稀里糊涂的,忘了开启SqlServer的is read committed snapshot on

  5. M. Subsequence 南昌邀请赛

    链接: https://nanti.jisuanke.com/t/38232 先给出一个s母串 然后给出n个子串 判断是否为母串的子序列 3000ms  2993ms过的.... 蒻鲫的代码: 建立表 ...

  6. day60 pymysql

    预知扩展内容,详见地址如下(关于数据库备份和恢复) http://www.cnblogs.com/linhaifeng/articles/7525619.html 我们一般写程序都是在py文件里面,那 ...

  7. Sumdiv POJ - 1845 (逆元/分治)

    Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S m ...

  8. Codeforces 1073C Vasya and Robot 【二分】

    <题目链接> 题目大意: 一个机器人从(0,0)出发,输入一段指令字符串,和机器人需要在指定步数后到达的终点,问如果机器人需要在指定步数内到达终点,那么需要对原指令字符串做出怎样的改变,假 ...

  9. Google Hack搜索技巧

    想了解更多搜索技巧,点击下面网站了解http://exploit-db.com/google-dorks Google Hack的一些整理 这里是google关键字的用法,要设置它为中文,则是 htt ...

  10. 可编辑DIV与移动端软键盘兼容性问题汇总

    此文复现的所有兼容性问题均为以下情况: 1. 腾讯X5内核 2. 全屏webview 问题如下: 1. IOS12 中软键盘弹出导致页面顶部截断,并且无法恢复. 解决方法:添加交互事件,调用本地方法, ...