Django搭建博客网站(四)

最后一篇主要讲讲在后台文章编辑加入markdown,已经在文章详情页对markdown的解析.

Django搭建博客网站(一)

Django搭建博客网站(二)

Django搭建博客网站(三)

要用到的package

  • django-pagedown
  • markdown2

django-pagedown用来在后台生成markdown编辑器,markdown2则是用来将markdown解析成html显示在网页上.

install

$ pip install django-pagedown
$ pip install markdown2

后台markdown编辑器

使用django-pagedown之前,去它的github地址看了一下.

  1. Get the code: pip install django-pagedown
  2. Add pagedown to your INSTALLED_APPS
  3. Make sure to collect the static files: python manage.py collectstatic --noinput (and if you are working in a development environment, make sure you are properly serving your static files)

    可以知道安装了package,还要将django-pagedown安装到项目中:
# settings.py
INSTALLED_APPS = [
'pagedown',
'post.apps.PostConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

但是运行上面第三点里面的命令,出现了错误,最后上stackoverflow查了一下,原来是在settings.py里面还得添加设置:

# settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.normpath(os.path.join(BASE_DIR, 'staticfiles'))
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)

此时再运行python manage.py collectstatic --noinput 就没问题了.

接下啦自然就是在后台添加markdown编辑器了,其实只需要让文章的内容部分支持markdown就行了,也就是post这个model里的post_content,修改admin.py文件就够了:

# admin.py
from django.contrib import admin
from .models import Post, PostTag
from pagedown.widgets import AdminPagedownWidget
from django import forms class PostForm(forms.ModelForm):
post_content = forms.CharField(widget=AdminPagedownWidget(show_preview=True)) class Meta:
model=Post
fields='__all__' class PostAdmin(admin.ModelAdmin):
form = PostForm
filter_horizontal = ('posttag',) admin.site.register(Post,PostAdmin)
admin.site.register(PostTag)

show_preview设置成True会在编辑的时候显示预览.

此时运行项目再进后台,就能使用markdown编辑文章内容了.

markdown解析

当后台使用markdown编辑后,存入数据库的文章内容是markdown代码,直接传到网页上显示的话,也是显示的markdown代码.

在django里面允许每个app为模板添加过滤器.

这里就可以通过过滤器来实现使用markdown2对markdown的解析.

django的过滤器功能,在每个app的templatetags文件夹下面,需要自行创建,注意创建的时候是一个package,而不是dictionary,也就是包含一个__init__.py文件.

然后,在templatetags文件夹下面创建一个djangomarkdown.py:

# post/templatetags/djangomarkdown.py
import markdown2 from django import template
from django.template.defaultfilters import stringfilter
from django.utils.safestring import mark_safe register = template.Library() @register.filter(is_safe=True)
@stringfilter
def djangomarkdown(value):
return mark_safe(markdown2.markdown(value,
extras=["fenced-code-blocks", "cuddled-lists", "metadata","tables", "spoiler"]))

既然创建了一个过滤器,那么要怎么用呢?

其实是直接在html文件里边就可以用的,不过要先在html文件里面加载(以post.html为例):

{% extends 'post/base.html' %}
{% load djangomarkdown %}
{% block title %}
<title>{{ post.post_title }}</title>
{% endblock %}
{% block content %}
<div class="container">
<div class="page-header"><h1>{{ post.post_title }}</h1></div>
<div class="description">
<span class="col-md-2"><a href="{% url 'post:user' 'Chain' %}">Chain</a></span><span
class="col-md-2">{{ post.pub_date }}</span>
{% if post.pub_date < post.change_date %}
<span class="col-md-4">last change:{{ post.change_date }}</span>
{% endif %}
</div>
<br>
<hr>
<div class="content">
{{ post.post_content|djangomarkdown }}
</div>
<br>
<hr>
<div class="btn-group" role="group" aria-label="...">
{% for tag in post.posttag.all %}
<a href="{% url 'post:tag' tag.tag_name %}">
<button type="button" class="btn btn-info">#{{ tag.tag_name }}</button>
</a>
{% endfor %}
</div>
</div>
{% endblock %}

先在文件开头加载自定义的过滤器,然后html里面就可以直接使用了.

Django搭建博客网站(四)的更多相关文章

  1. Django搭建博客网站(三)

    Django搭建博客网站(三) 第三篇主要记录view层的逻辑和template. Django搭建博客网站(一) Django搭建博客网站(二) 结构 网站结构决定我要实现什么view. 我主要要用 ...

  2. Django搭建博客网站(二)

    Django搭建自己的博客网站(二) 这里主要讲构建系统数据库Model. Django搭建博客网站(一) model 目前就只提供一个文章model和一个文章分类标签model,在post/mode ...

  3. Django搭建博客网站(一)

    Django搭建自己的博客网站(一) 简介 这个系列主要是通过使用Django这个python web框架实现一个简单的个人博客网站.对Django有疑问可以上Django官网查文档. 功能 后台管理 ...

  4. 使用django搭建博客并部署

    2017/8/31 18:27:59 为了以后参考的方便,在这里总结一下django搭建博客网站的主要步骤.以下大部分的内容,参考自Django中文文档 - 看云. 需要强调的是,这里使用的djang ...

  5. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(四)-使用Travis自动部署Hexo(2)

    前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...

  6. Django搭建博客记(一)

    这里记录一些 Django 搭建博客遇到的一些问题 参考书籍为 Django by Example, 这里记录与书籍内容不包含的内容. 搭建环境: 阿里云 ECS + CentOS7 一开始搭建的时候 ...

  7. Hexo系列(一) 搭建博客网站

    写在前面的话:本系列文章主要参考 Hexo官方说明文档,同时结合自己在使用过程中的一些心得体会,撷取下来,和大家分享分享.好,下面闲话不多说,马上开始我们的 Hexo 之旅吧 温馨提醒:博主使用的操作 ...

  8. Django 系列博客(四)

    Django 系列博客(四) 前言 本篇博客介绍 django 如何和数据库进行交互并且通过 model 进行数据的增删查改 ORM简介 ORM全称是:Object Relational Mappin ...

  9. 部署项目到服务器 & 搭建博客网站

    搭建博客网站 作为名程序员,或者是网络编程爱好者,拥有一个自己的博客网站再好不过,本篇文章手把手教你部署自己的网站

随机推荐

  1. cesium编程入门(一)cesium简介

    cesium编程入门 cesium是什么 Cesium 是一个跨平台.跨浏览器的展示三维地球和地图的 javascript 库. Cesium 使用WebGL 来进行硬件加速图形,使用时不需要任何插件 ...

  2. Element类型知识大全

    Element类型 除了Document类型之外,Element类型就要算是Web编程中最常用的类型了.Element类型用于表现XML或HTML元素,提供了对元素标签名.子节点及特性的访问.   要 ...

  3. 从零开始学习前端开发 — 17、CSS3背景与渐变

    一.css3背景切割: background-clip:border-box|padding-box|content-box; 作用: 用来设置背景的可见区域 a) border-box 默认值,背景 ...

  4. WdatePicker设置时间区间时,对开始时间和结束时间限制

    <input id="startDate" name="startDate"  type="text" readonly=" ...

  5. linux利用sendmail发送邮件的方法

    Linux利用sendmail发送邮件, 方法1 安装sendmail即可使用, mail -s "test" user@sohu.com bin/mail会默认使用本地sendm ...

  6. dedecms首页调用软件下载地址

    这段时间利用dedecms开发一个软件下载的网站,应客户需求,需要在网站首页调用软件下载地址.在网上查找了一些资料,都没有很好的解决这个问题,后来自己研究了一下,就将自己的方法跟大家共享一下.有不好的 ...

  7. Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean

    问题描述: 一月 15, 2014 3:43:13 下午 org.springframework.context.support.AbstractApplicationContext prepareR ...

  8. FORTH 安装使用

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. Java基础——反射 reflect

    什么是反射 (1)Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...

  10. python_如何修改装饰器中参数?

    案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改t ...