Django搭建博客网站(四)
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地址看了一下.
- Get the code: pip install django-pagedown
- Add pagedown to your INSTALLED_APPS
- 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搭建博客网站(四)的更多相关文章
- Django搭建博客网站(三)
Django搭建博客网站(三) 第三篇主要记录view层的逻辑和template. Django搭建博客网站(一) Django搭建博客网站(二) 结构 网站结构决定我要实现什么view. 我主要要用 ...
- Django搭建博客网站(二)
Django搭建自己的博客网站(二) 这里主要讲构建系统数据库Model. Django搭建博客网站(一) model 目前就只提供一个文章model和一个文章分类标签model,在post/mode ...
- Django搭建博客网站(一)
Django搭建自己的博客网站(一) 简介 这个系列主要是通过使用Django这个python web框架实现一个简单的个人博客网站.对Django有疑问可以上Django官网查文档. 功能 后台管理 ...
- 使用django搭建博客并部署
2017/8/31 18:27:59 为了以后参考的方便,在这里总结一下django搭建博客网站的主要步骤.以下大部分的内容,参考自Django中文文档 - 看云. 需要强调的是,这里使用的djang ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(四)-使用Travis自动部署Hexo(2)
前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...
- Django搭建博客记(一)
这里记录一些 Django 搭建博客遇到的一些问题 参考书籍为 Django by Example, 这里记录与书籍内容不包含的内容. 搭建环境: 阿里云 ECS + CentOS7 一开始搭建的时候 ...
- Hexo系列(一) 搭建博客网站
写在前面的话:本系列文章主要参考 Hexo官方说明文档,同时结合自己在使用过程中的一些心得体会,撷取下来,和大家分享分享.好,下面闲话不多说,马上开始我们的 Hexo 之旅吧 温馨提醒:博主使用的操作 ...
- Django 系列博客(四)
Django 系列博客(四) 前言 本篇博客介绍 django 如何和数据库进行交互并且通过 model 进行数据的增删查改 ORM简介 ORM全称是:Object Relational Mappin ...
- 部署项目到服务器 & 搭建博客网站
搭建博客网站 作为名程序员,或者是网络编程爱好者,拥有一个自己的博客网站再好不过,本篇文章手把手教你部署自己的网站
随机推荐
- tinyxml的封装与使用(转载)
tinyxml是个高效精简的xml解析开源代码. 针对tinyxml直接使用对于对xml不是很熟悉的入门新手来说,有些概念难以理解,因此我将其封装后,供大家使用. 头文件: #include &quo ...
- java中JFrame类中函数addWindowListener(new WindowAdapter)
转自:http://blog.csdn.net/datouniao1/article/details/46984987:侵删. 在java编写的过程中常常遇到样的一段代码: frame.addWind ...
- 实例说明optimize table在优化MySQL时很重要
今天在看CU的时候,发现有人问有关optimize来表优化的问题,当年因为这个问题,困扰我很长一段时间,今天有空我把这个问题,用实际数据来展示出来,让大家可以亲眼来看看,optimize table的 ...
- 您是不是奇怪为什么 <script> 标签中没有 type="text/javascript" 属性?
在 HTML5 中该属性不是必需的.JavaScript 是 HTML5 以及所有现代浏览器中的默认脚本语言!
- maven pom.xml 详细
一.什么是POM Project Object Model,项目对象模型.通过xml格式保存的pom.xml文件.作用类似ant的build.xml文件,功能更强大.该文件用于管理:源代码.配置文件. ...
- ABB中断设定
简介: 中断是程序定义事件,通过中断编号识别.中断发生在中断条件为真时.中断不同于其他错误,前者与特定消息号位置无直接关系(不同步).中断会导致正常程序执行过程暂停,跳过控制,进入软中断程序. 即使机 ...
- 2017-06-29(cat tac more less head tail)
cat 查看文件内容 cat -A 相当于-vET的整合参数,可列出一些特殊的字符,而不是空白而已 -b 列出行号,空白行不标号 -E 将结尾的断行字符 $ 显示出来 -n 列出行号,空 ...
- python3 第十八章 - 迭代器与生成器
1.迭代器(Iterator) 迭代是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器 ...
- 前端开发人员需要了解的CSS原理
转自http://web.jobbole.com/10011/ 一.浏览器的发展与CSS 网页浏览器主要通过HTTP协议连接网页服务器而取得网页,HTTP容许网页浏览器送交资料到网页服务器并且获取网页 ...
- sitemesh网页布局
看项目时发现对应页面下找不到侧栏部分代码,仔细观察后发现页面引入了sitemesh标签,查了下资料原来是页面用了sitemesh框架解!耦!了! 以前多个模块包含相同模块时总是include jsp文 ...