如何在Django后台添加pagedown

Windows系统下使用VSCode搭建高效Python开发环境全攻略 Python作为一门语法简洁、生态丰富的编程语言,其开发环境的搭建是初学者入门的关键第一步。理解Python解释器的工作原理、包管理机制和虚拟环境的概念,对于构建可维护的项目至关重要。通过配置高效的开发环境,开发者可以提升代码编写、调试和管理的效率,从而更好地应对数据分析、自动化脚本、Web开发等应用场景。本文聚焦于在Windows平台上,利用Visual Studio Code这一轻量级编辑器,结合虚拟环境和pip包管理工具,手把手指导读者完成从工具安装、项目配置到代码调试的完整流程,旨在帮助Python 阅读详情

需求描述

某公司的项目需要接入大数据,但是项目人员要求只用sql查询。经过通宵达旦的搞了一段时间,终于小有成效。然后我们又做了个大数据开发平台网站,里面放了些开发文档。以为我们队python比较熟悉,又不想在网站上浪费过多时间,选择Django后台发布文章,前端展示。添加个pagedown

如何做?

  1. 安装依赖包(因为使用pagedown,可能不需要markdown,没有测试过)
pip install markdown
pip install django_markdown
pip install django_pagedown
  1. 修改settings.py文件
INSTALLED_APPS = (
    ...
    #'django_markdown',
    'pagedown',
)
  1. urls.py修改(可能不需要)
   # url('^markdown/', include( 'django_markdown.urls')),
  1. 最重要的来了,在models.py里
...
from pagedown.widgets import AdminPagedownWidget
from django import forms
...
# Register your models here.
# 定义自己的form
class document_category( base ):
    category_name = models.CharField(max_length=200)
    insertTime = models.DateTimeField(default=timezone.now)

class categoryAdmin(admin.ModelAdmin):
    list_display = ('category_name','insertTime')
    search_fields = ['insertTime']
    # search_fields = ['name']
admin.site.register(document_category,categoryAdmin)


class api_document( lrcloud_base ):
    title =  models.CharField(max_length=200)
    content = models.TextField()
    category = models.ForeignKey(document_category)
    insertTime=models.DateTimeField( default=  timezone.now)

class ArticleForm(forms.ModelForm):
    content = forms.CharField(widget=AdminPagedownWidget())
    class Meta:
        model = api_document
        fields = '__all__'

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'content', 'insertTime',)
    search_fields = ['title']
    form = ArticleForm

#注册的时候绑定
admin.site.register(api_document,ArticleAdmin)

完成这些后,在提交代码,在服务器上执行

python manage.py runserver 0.0.0.0:8080

打开网页,看看是否成功了。

markdown文件如何渲染成html,在模版里展示呢?


class Md2Html:
    def __init__(self):
        self.style = None
        self.infile = None
        print "Ready to init Parser tool!"

    def parse(self, style=None, content=None):
    #这里是css,加载风格的,可以从外部文件加载
        css = '''a {color:#4183C4;}
        a.absent {color:#cc0000;}
        a.anchor {
            display:block;
            padding-left:30px;
            margin-left:-30px;
            cursor:pointer;
            position:absolute;
            top:0;
            left:0;
            bottom:0;
        }

        p,blockquote,ol,dl,table,pre {
            margin:15px 0;
        }
        ul {
            margin:0;
        }
        hr {
            background:transparent repeat-x 0 0;
            border:0 none;
            color:#cccccc;
            height:4px;
            padding:0;
        }
        body > h2:first-child {
            margin-top:0;
            padding-top:0;
        }
        body > h1:first-child {
            margin-top:0;
            padding-top:0;
        }
        body > h1:first-child + h2 {
            margin-top:0;
            padding-top:0;
        }
        body > h3:first-child,body > h4:first-child,body > h5:first-child,body > h6:first-child {
            margin-top:0;
            padding-top:0;
        }
        a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6 {
            margin-top:0;
            padding-top:0;
        }
        h1 p,h2 p,h3 p,h4 p,h5 p,h6 p {
            margin-top:0;
        }
        li p.first {
            display:inline-block;
        }
        ul,ol {
            padding-left:30px;
        }
        ul:first-child,ol:first-child {
            margin-top:0;
        }
        ul:last-child,ol:last-child {
            margin-bottom:0;
        }
        dl {
            padding:0;
        }
        dl dt {
            font-size:14px;
            font-weight:bold;
            font-style:italic;
            padding:0;
            margin:15px 0 5px;
        }
        dl dt:first-child {
            padding:0;
        }
        dl dt >:first-child {
            margin-top:0;
        }
        dl dt >:last-child {
            margin-bottom:0;
        }
        dl dd {
            margin:0 0 15px;
            padding:0 15px;
        }
        dl dd >:first-child {
            margin-top:0;
        }
        dl dd >:last-child {
            margin-bottom:0;
        }
        blockquote {
            border-left:4px solid #dddddd;
            padding:0 15px;
            color:#777777;
        }
        blockquote >:first-child {
            margin-top:0;
        }
        blockquote >:last-child {
            margin-bottom:0;
        }
        table {
            border-collapse:collapse;
            padding:0;
        }
        table tr {
            border-top:1px solid #cccccc;
            background-color:white;
            margin:0;
            padding:0;
        }
        table tr:nth-child(2n) {
            background-color:#f8f8f8;
        }
        table tr th {
            font-weight:bold;
            border:1px solid #cccccc;
            text-align:left;
            margin:0;
            padding:6px 13px;
        }
        table tr td {
            border:1px solid #cccccc;
            text-align:left;
            margin:0;
            padding:6px 13px;
        }
        table tr th:first-child,table tr td:first-child {
            margin-top:0;
        }
        table tr th:last-child,table tr td:last-child {
            margin-bottom:0;
        }
        img {
            max-width:100%;
        }
        span.frame {
            display:block;
            overflow:hidden;
        }
        span.frame > span {
            border:1px solid #dddddd;
            display:block;
            float:left;
            overflow:hidden;
            margin:13px 0 0;
            padding:7px;
            width:auto;
        }
        span.frame span img {
            display:block;
            float:left;
        }
        span.frame span span {
            clear:both;
            color:#333333;
            display:block;
            padding:5px 0 0;
        }
        span.align-center {
            display:block;
            overflow:hidden;
            clear:both;
        }
        span.align-center > span {
            display:block;
            overflow:hidden;
            margin:13px auto 0;
            text-align:center;
        }
        span.align-center span img {
            margin:0 auto;
            text-align:center;
        }
        span.align-right {
            display:block;
            overflow:hidden;
            clear:both;
        }
        span.align-right > span {
            display:block;
            overflow:hidden;
            margin:13px 0 0;
            text-align:right;
        }
        span.align-right span img {
            margin:0;
            text-align:right;
        }
        span.float-left {
            display:block;
            margin-right:13px;
            overflow:hidden;
            float:left;
        }
        span.float-left span {
            margin:13px 0 0;
        }
        span.float-right {
            display:block;
            margin-left:13px;
            overflow:hidden;
            float:right;
        }
        span.float-right > span {
            display:block;
            overflow:hidden;
            margin:13px auto 0;
            text-align:right;
        }
        pre,code,tt {
            font-size:12px;
            font-family:Consolas,"Liberation Mono",Courier,monospace;
        }
        code,tt {
            margin:0;
            padding:0 5px;
            white-space:nowrap;
            border:1px solid #eaeaea;
            background-color:#f8f8f8;
            border-radius:3px;
        }
        pre code {
            margin:0;
            padding:0;
            white-space:pre;
            border:none;
            background:transparent;
        }
        .highlight pre {
            background-color:#f8f8f8;
            border:1px solid #cccccc;
            font-size:13px;

            line-height:19px;
            overflow:auto;
            padding:6px 10px;
            border-radius:3px;
        }
        pre {
            background-color:#cbe9ca;
            border:1px solid #cccccc;
            color:#000000;
            font-size:15px;
            line-height:19px;
            overflow:auto;
            padding:6px 10px;
            border-radius:3px;
        }
        pre code,pre tt {
            background-color:transparent;
            border:none;
        }'''

        head = """
            <style scoped>%s</style>
         """ % (css)
        try:
            content = content.decode('gbk').encode('utf-8')
        except:
            content = content
        content = markdown(content, extensions=['markdown.extensions.extra', 'markdown.extensions.codehilite'])
        return head+ content

从外部调用函数后,返回的是html的一个字符串,然后再模板里,吧这些东东放进去。

def show_document(request):
    documentId = request.GET['id']
    doc = api_document.objects.get(id=documentId)
    p = Md2Html.Parser()
    ret = p.parse('', doc.content)
    c = Context({"content": ret})
    t = loader.get_template('apis.html')
    html = t.render(c)
    response = HttpResponse(html)

在模板文件apis.html里,要这样使用

{{ content | safe }}

一定要加safe,否则…你懂得吧,试试就知道了~

pagedown-extra, 用于下行的Markdown 额外插件.zip pagedown-extra, 用于下行的Markdown 额外插件 #Overview这是一组 Pagedown插件插件,支持额外语法。 打开 demo/demo.html 以自己尝试。 若要运行测试,只需在浏览器中打开 spec/SpecRunner.html 。 或者,要比 travis-ci更少地 立即下载

相关推荐

Qt6导入QtChart绘制图表(添加组件)

我在按照大佬们的说明添加QtChart时发现,我的电脑上并不能正确的添加QtChart并编译通过,所以在综合了两位大佬的说明又自己探索了一番后,正确编译通过,分享出来,以便同志们节省一些时间。

Nuaa0719301zyx的博客 2951

python实现自动翻页代码_python实现模拟按键,自动翻页看u17漫画

python适用于windows平台使用 win32gui,win32api,win32con 包simu_read.py复制代码 代码如下:#-*- coding=utf-8 -*-'''模拟按键翻页Usage:python simu_read.py 10 1.510表示翻10页,1.5表示在一页中按pgdn的时间间隔为1.5s一页pgdn 3 次,之后按→翻到下一页把浏览器打开到u17要看的漫...

weixin_39992660的博客 512

带有验证码的爆破(包含Burp suite工具爆破)

关于含有验证码爆破的一些总结!

weixin_43960066的博客 8696

终极Cap高级配置指南:如何自定义难度、样式和用户体验

Cap作为一款注重隐私的自托管验证码解决方案,让网站管理员能够完全掌控验证码系统。本文将分享三个核心配置技巧,帮助你根据自身需求调整Cap的难度、样式和用户体验,打造既安全又友好的验证系统。 ## 一、精准调整难度:平衡安全性与用户体验 Cap的难度设置直接影响安全性和用户体验的平衡。通过调整难度参数,你可以根据网站的安全需求灵活配置验证强度。 ### 1.1 基础难度设置 在Cap中,难

gitblog_00942的博客 726

保姆级教程:用CellOracle 0.10.13从单细胞数据构建基因调控网络(附完整代码)

本文提供了一份详细的CellOracle 0.10.13使用指南,帮助用户从单细胞数据构建基因调控网络。通过Python接口,即使是生物信息学新手也能快速掌握数据准备、KNN插补、GRN计算及可视化等关键步骤。文章包含完整代码和实用技巧,助力单细胞转录组数据分析。

weixin_42563415的博客 724

RK3588+TRL8367s 四网口千兆交换机配置与优化实战

本文详细介绍了基于RK3588高性能SoC与TRL8367s千兆交换芯片构建四网口交换机的完整实战流程。内容涵盖硬件连接、设备树配置、内核驱动加载、性能优化及常见问题排查,重点解析了RGMII时序调试、DSA架构配置等关键步骤,为嵌入式网络设备开发提供实用指南。

weixin_29266647的博客 675

python实现模拟按键,自动翻页看u17漫画

python  适用于windows平台 使用 win32gui,win32api,win32con 包 simu_read.py #-*- coding=utf-8 -*- ''' 模拟按键翻页 Usage:python simu_read.py 10 1.5 10表示翻10页,1.5表示在一页中按pgdn的时间间隔为1.5s 一页pgdn 3 次,之后按→翻到下一页 把浏览器打开到

yzl11的博客 1535

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

清影的博客 6283

Python-flask 使用Markdown和Flask-PageDown支持富文本文章

Python-flask 使用Markdown和Flask-PageDown支持富文本文章 导入库 from flask_pagedown import PageDown from flask_pagedown.fields import PageDownField 初始化 pagedown = PageDown() app = Flask(__name__) pagedown.ini...

weixin_46250708的博客 846

TSMaster二次开发实战:如何用Python搞定CAN/CANFD事件回调(附完整代码)

本文详细介绍了如何利用Python进行TSMaster二次开发,实现CAN/CANFD事件回调功能。通过实战代码演示,讲解了预发送与后处理回调的核心区别、注册流程、资源管理及性能优化技巧,帮助工程师高效构建自动化测试与数据监控应用。

star的博客 668

C#上位机通信层封装:西门子S7NetPlus库的优雅使用

支持S7-1200/1500(机架号0,槽号1)、S7-300/400(机架号/槽号需根据实际配置);支持位(Bit)、字节(Byte)、字(Word)、双字(DWord)、浮点数(Float/Double)等数据类型的读写;支持DB块、输入寄存器(I)、输出寄存器(Q)、内存寄存器(M)、定时器(T)、计数器(C)的操作;轻量无依赖,兼容.NET 5+。首先定义核心枚举和常量,统一规范参数类型,避免硬编码。/// 西门子PLC型号(对应不同的机架/槽号默认配置)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1085

python函数调用键盘热键_Python自定义快捷键,热键,HotKey

HotKey自定义快捷键实现Home、End、PageUp、PageDown等功能。自以为最大的作用是,避免右手在键盘上的左右移动,提高码字的质量。当然你也可以实现其他功能功能处理热键对应的事件space + i 上(up),以下省略space+ k 下(down)+ j 左(left)+ l 右(right)+ a 行首(Home)+ f 行尾(End)+ u 左删除(Backspace)+ o...

weixin_39613637的博客 2081

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Django-Pagedown 使用教程

Django-Pagedown 使用教程 项目概述 Django-Pagedown 是一个专为 Django 框架设计的扩展,它提供了 Markdown 编辑器的功能,使得用户可以方便地在 Web 应用中输入丰富文本,通过Markdown语法,然后转换成HTML显示。该项目利用了 PageDown 原生JavaScript库,确保在前端提供顺滑的编辑体验。 1. 目录结构及介绍 以下是 djang...

gitblog_00001的博客 684

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

用django框架做自己的blog

说明:我的系统环境是ubuntu 14.10版本的,整理这篇博客,主要是自己记性太不好了,老忘东西,教训一下自己。哈哈 参考文章 createing blog 1,part-1-creating-blog 2,part-2-creating-blog 3,part-3-creating-blog django framework application django fra...

ddo99962的博客 154

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

django1.8下的markdown、highlight、pagedown解决

写作说明: 在看完python3的基本与法后,为了巩固自己对语言的掌握就使用django1.8写了个人博客的小程序。在对博客文章进行markdown处理的时候遇到了几个问题,希望这篇文章能够帮助到其他人。 markdown markdown是一个很多程序员都喜欢的标记性语言,很多知名博客和网站都支持采用了这一编辑器。例如:segmentf...

weixin_34334744的博客 301

【django】搭建博客教程(3)——markdown以及highlight

一.工作环境ubuntu14.04python2.7 + django1.8二.markdown你的文章1.安装markdown2#首先安装markdown2 pip install markdown22.应用markdown2a. 进入应用的目录,执行下面操作:$ mkdir templatetags $ touch __init__.py $ touch custom_markdown.pyb.

jiange_zh的博客 1906

Django搭建博客网站(四)

Django搭建博客网站(四) 最后一篇主要讲讲在后台文章编辑加入markdown,已经在文章详情页对markdown的解析. Django搭建博客网站(一) Django搭建博客网站(二) Django搭建博客网站(三) 要用到的package django-pagedown markdown2 django-pagedown用来在后台生成markdown编辑器,markdown2...

115

Django搭建博客网站(一)

Django搭建自己的博客网站(一) 简介 这个系列主要是通过使用Django这个python web框架实现一个简单的个人博客网站.对Django有疑问可以上Django官网查文档. 功能 后台管理文章发布,修改,删除 分标签管理 依赖 除了使用Django以外,网页排版部分使用了Bootstrap框架,文章编辑器和解析器分别使用django-pagedown和mar

轻舞日记 641

Django1.11 添加markdown语法支持

pip install markdown 在view.py 的视图界面:导入,圈起来的那两个包 对post进行处理, models.py 详情如下 测试,效果如图 转载于:https://www.cnblogs.com/deen-/p/7119539.html...

weixin_30532759的博客 87

换掉那个丑炸天的界面(django博客搭建)

在做界面之前我们先给我们文章的显示加上了markdown,至于声明时markdown可以自行百度,至于怎么加上markdown我们在这就不做讨论了,博主就直接贴出教程地址吧~django1.8下的markdown,highlight, pagedown解决好啦 现在就开始给我们的博客主页改头换面首先,我们在我们myblog/article/templates/目录下新建一个b...

weixin_34364135的博客 226

如何使用Mezzanine

Mezzanine是著名的开源、基于Django的CMS系统 (content management system)。其实任何一个网站都可以看作是一个特定的内容管理系统,只不过每个网站发布和管理的具体内容不一样。携程发布的是航班、酒店和用户的订单信息,淘宝发布的商品和用户的订单信息。所以大量的网站都说基于Mezzanine来构造的。1 安装Mezzanine安装虚拟环境virtual Env推荐使用

taneijia的专栏 1万+

Mezzanine汉化

1、编辑/path/to/projectname/projectname下的setting.pyALLOWED_HOSTS = ['www.xxx.com'] 为了使用域名来访问TIME_ZONE = 'Asia/Shanghai' 2、使用中文USE_MODELTRANSLATION = TrueLANGUAGE_CODE = "zh-hans"# Supported languagesLAN...

weixin_30799995的博客 343

QuantJourney Backtester 订单模式实战:市价、限价、Bracket到OCO的8种订单类型全清单

QuantJourney Backtester 是一款 Python 原生的量化回测框架,它的 **订单模式(Order Mode)** 支持市价、限价、止损、止损限价、移动止损、移动止损限价、OCO 与 Bracket 共 **8 种订单类型**,并内置滑点、手续费与逐笔成交模拟。本文面向新手,把这 8 种订单类型逐一拆解,并给出可直接运行的示例策略路径。 [![QuantJourney Ba

gitblog_00048的博客 400

PersistentWindows Webpage Commander 解析:Alt+W 唤起的单字符浏览器快捷命令系统

PersistentWindows 在窗口位置持久化之外,内置了一个名为 **Webpage commander** 的网页浏览加速功能:在任何主流浏览器中按下热键 **Alt + W**,一个跟随光标的微型命令窗口被唤起,随后你用左手即可击打的**单字符快捷键**(设计思路类似 vi 编辑器)会被翻译成浏览器标准的鼠标+键盘组合操作,如选标签页、换标签、滚动页面、前进后退等。本文以仓库根目录的

gitblog_00826的博客 295
上一篇: Rabbitmq HTTP-API
下一篇: Django 在iframe里跳转顶层url
猫影
博客等级 码龄10年 31粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值