Django整合markdown编辑器

文章目录

添加相关库

我们把Markdown用于两个地方
后台admin写文章时,需要一个Markdown编辑器
在前端网页显示的时候,需要把Markdown的内容转换成HTML
这是两个不同的功能,我们添加两个新的库

pip install django-mdeditor  # 用于后台编辑
pip install markdown # 用于前端显示

后台编辑

这部分用django-mdeditor来实现

在项目 settings.pyINSTALLED_APPS 中添加 ’mdeditor’

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog', # 应用:博客功能
    'comments', # 应用:评论功能
    + 'mdeditor', # Markdown 编辑器
]

+ 表示加上这行代码

添加路径到 settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')  #uploads必须存在,且在项目目录下
MEDIA_URL = '/media/'   #你上传的文件和图片会默认存在/uploads/editor下

添加设置到你的 url.py

from django.conf.urls import url, include
from django.contrib import admin
from blog.feeds import AllPostsRssFeed
+ from django.conf.urls.static import static
+ from django.conf import settings

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include('blog.urls')),
    url(r'', include('comments.urls')),
    url(r'^all/rss/$', AllPostsRssFeed(), name='rss'),
    + url(r'mdeditor/', include('mdeditor.urls')),
]

+ if settings.DEBUG:
    # static files (images, css, javascript, etc.)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

models.py中修改你需要Markdown的关键词

class Post(models.Model):  

    # 文章标题
    title = models.CharField(max_length=70)

    # 文章正文
    body = MDTextField()  #修改这个类型

这里把文章正文body用于Markdown

记得在Blog/admin.py中注册,就是把这个功能,放到admin里面

from django.contrib import admin
from .models import Post, Category, Tag

class PostAdmin(admin.ModelAdmin):
    list_display = ['title', 'created_time', 'modified_time', 'category', 'author']

admin.site.register(Post, PostAdmin)
admin.site.register(Category)
admin.site.register(Tag)

此时,打开后台admin,编辑界面如下。body部分有了一个Markdown编辑器

image

前端显示

pip install markdown

Markdown 格式的文本渲染成 HTML 文本非常简单,只需调用这个库的 markdown 方法即可。

我们书写的博客文章内容存在 Postbody 属性里,回到我们的详情页视图函数,对 postbody 的值做一下渲染,把 Markdown 文本转为 HTML 文本再传递给模板:

import markdown
from django.shortcuts import render, get_object_or_404
from .models import Post
 
def detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    # 记得在顶部引入 markdown 模块
    post.body = markdown.markdown(post.body,
                                  extensions=[
                                     'markdown.extensions.extra',
                                     'markdown.extensions.codehilite',
                                     'markdown.extensions.toc',
                                  ])
    return render(request, 'blog/detail.html', context={'post': post})

  • markdown.extensions.extra:用于标题、表格、引用这些基本转换
  • markdown.extensions.codehilite:用于语法高亮
  • markdown.extensions.toc:用于生成目录

替换网页模板

在模板中找到展示博客文章主体的 {{ post.body }} 部分,加上 safe过滤器,改为{{ post.body|safe }}

<div>
    {{ post.body|safe }}
</div>

代码高亮

要实现代码高亮,我们需要一个样式文件。自己写太艰难了,所以我们用现成的。安装Pygments

pip install Pygments

Pygments自带很多好看的高亮格式

在项目的 blog\static\blog\css\highlights\ 目录下应该能看到很多 .css 样式文件,
这些文件是用来提供代码高亮样式的。
选择一个你喜欢的样式文件,在 templates/base.html 引入即可。
比如引入 default.css 样式

{% load staticfiles %}

...
<link rel="stylesheet" href="{% static 'blog/css/pace.css' %}">
<link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">
...
+ <link rel="stylesheet" href="{% static 'blog/css/highlights/default.css' %}">

换行

在需要换行的位置,输入<br/>即可

关于图片上传

我们在admin编辑器中,可以很方便的插入图片

image

文中刚刚提到了,可以直接上传本地图片,但是更推荐直接上传图片链接,加载速度更快

这里推荐一个免费的七牛云云存储服务器,
具体操作可以点这里用Python把图片上传到七牛云

修改图片大小和位置

上传图片的时候,经常因为图片过大,影响电脑端和手机端显示。

上传的时候,在图片格式后面,加上{:width="100%" align=center}

比如:
![图片介绍](http://pxpfco2u1.bkt.clouddn.com/markdown20190921144356.png){:width="100%" align=center}

这里定义了图片的宽度width100%匹配于显示,你也可以设置高度。也可以直接设置大小,比如{:width="900"}

align表示图片位置,center表示居中

修改字体和位置

如果你嫌弃默认的Markdown格式不好看,你可以在.css文件里面进行修改(一劳永逸型)

比如自定义标题字号

            .box.post h2 {
                font-size: 3.25em;
                line-height: 1.25em;
            }
            
            .box.post h3 {
                font-size: 2.25em;
                line-height: 1.25em;
            }


或者直接在文章里改(每次自己改)

<font face="微软雅黑" color="red" size="6">字体及字体颜色和大小</font>
<font face="微软雅黑" color="red" size="6">字体及字体颜色和大小</font>
<p align="left">居左文本</p>
<p align="center">居中文本</p>
<p align="right">居右文本</p>

参考

  1. ConnorLin:Markdown的常用语法(个人总结)
  2. 追梦人物:支持 Markdown 语法和代码高亮
  3. 史浩的专栏:Django2.0整合markdown编辑器并实现代码高亮
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容