Django markdown 实现

news/2024/11/18 11:36:01/文章来源:https://www.cnblogs.com/shenbojun/p/18199296

一、安装markdown插件

pip install django-mdeditor
pip install markdown

二、在 settings 配置文件 INSTALLED_APPS 中添加 mdeditor:

    INSTALLED_APPS = [...'mdeditor',]

三、插入图片没有地址,针对django3.0+修改 frame 配置,settings.py设置如下:

X_FRAME_OPTIONS = 'SAMEORIGIN' # 上传图片时,防止跨域 # django 3.0 + 默认为 deny

四、在 settings 中添加媒体文件的路径配置:

MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
MEDIA_URL = '/media/'

在你项目根目录下创建 uploads/editor 目录,用于存放上传的图片。

五、在你项目的根 urls.py 中添加扩展url和媒体文件url:

我的django版本是4.2.5,设置如下

from django.conf import settings
from django.urls import include
from django.conf.urls.static import static...urlpatterns = [...path("mdeditor/", include('mdeditor.urls')),
]# 配置静态文件,这个很重要,不然上传的图片和文件无法被访问到,必须要引入blog/settings里面的debug,因为globle的debug是Falseif settings.DEBUG:urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

六、编写一个测试demo—model:

from django.db import models
from mdeditor.fields import MDTextFieldclass Content(models.Model):"""文章"""title = models.CharField(max_length=100)content = MDTextField()create_time = models.DateTimeField(auto_now_add=True)update_time = models.DateTimeField(auto_now=True)class Meta:db_table = '文章'verbose_name = '文章'verbose_name_plural = '文章'ordering = ['-create_time']def __str__(self):return self.title

七、向admin中注册model

from django.contrib import admin
from markdownx.admin import MarkdownxModelAdmin
from .models import Contentclass ContentAdmin(MarkdownxModelAdmin):# 显示哪些字段list_display = ('id', 'title', 'create_time', 'update_time')# 排序字段ordering = ("-create_time",)# 显示哪些字段可以点击跳转list_display_links = ("id", "title")# 搜索字段search_fields = ("title", "content")# 设置每页显示多少条数据list_per_page = 15admin.site.register(Content, ContentAdmin)

八、创建好Django admin 超级管理员账号python manage.py createsuperuser

然后运行 python manage.py makemigrationspython manage.py migrate 来创建你的model 数据库表.
登录 django admin后台,点击 '添加'操作,你会看到如下界面。

九、在前端中使用Markdown 编辑器,首先创建ModelForm类

from app.models import Content
from django.forms import ModelForm
from django import formsclass MDEditorModleForm(forms.ModelForm):class Meta:model = Contentfields = '__all__'def add(request):forms = MDEditorModleForm()if request.method == 'POST':forms = MDEditorModleForm(request.POST)if forms.is_valid():forms.save()return redirect('/index')else:print(forms.errors)return render(request, 'add.html', {'forms': forms})
前端代码:
{% load static %}
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>添加文章</title>
</head>
<body><h3>添加文章</h3><form method="post">{% csrf_token %}{{ forms.media }}{{ forms.as_p }}<p><input type="submit" value="立即保存"></p></form>
</body>
</html>
运行效果:

十、django-mdeditor官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708214.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款基于C#开发的通讯调试工具(支持Modbus RTU、MQTT调试)

前言 今天大姚给大家分享一款基于C#、WPF、Prism、MaterialDesign、HandyControl开发的通讯调试工具(支持Modbus RTU、MQTT调试,界面色彩丰富):Wu.CommTool。 工具特点工具界面色彩丰富。 支持Modbus RTU、MQTT服务器、MQTT客户端。 Modbus RTU自动解析数据帧。 智能防粘包…

20240518模拟赛

C240518A. 传送门(portal) 构造一个图使得点\(1\)到\(2\)的最短路正好有\(k\)条,使构造出的图点的个数\(N\le n_5\) 考虑\(k=2^t\)那么可以轻松构造出如下的图对于其他的情况可以考虑二进制拆分,如\(k=10\)时为了,使最短路长度固定加入点\(9\)对\(k=10^9\),只需构造\(80\)个…

『手撕Vue-CLI』添加帮助和版本号

前言 经过上一篇『手撕Vue-CLI』编码规范检查之后,手撕 Vue-CLI 已经进阶到了代码规范检查这一步,已经将基本的工程搭建好了,然后代码规范约束也已经加入了,并且将 nue-cli 指令绑定到了全局当中,可以在任何地方使用了。 正文 接下来这篇文章呢,就要来实现一下大多数的命…

ASE180N08-ASEMI低压N沟道MOS管ASE180N08

ASE180N08-ASEMI低压N沟道MOS管ASE180N08编辑:ll ASE180N08-ASEMI低压N沟道MOS管ASE180N08 型号:ASE180N08 品牌:ASEMI 批号:2024+ 沟道:N沟道 导通内阻RDS(ON)Max:4.0mΩ 启动电压:2V-4V 最大漏源电流(Id):180A 漏源击穿电压(VRM):80V 正向电压:1.3V 特性:低…

垂直关系转化思维导图

线线、线面、面面垂直关系转化思维导图前言 使用方法:如果想得到更好的显示效果,可以点击全屏按钮,已经实现电脑端、手机端的适配,效果很好;电视端没有实现适配,Ipad端的适配没有测试; 思维结构图全屏 相关说明 内容继续编辑完善中,源文件存放在 draw.io 上。

C++学习----make

基本规则:touch main.c add.c sub.c add.h sub.h #新建以上文件 main函数: int main(void) {return 0; } Makefile文件: main:main.o add.o sub.ogcc -Wall -g main.o add.o sub.o -o main main.o:main.cgcc -Wall -g -c main.c -o main.o add.o:add.c add.hgcc -Wall -g -c …

logstash

遇到的问题:环境: 配置:input {beats {port=>5044codec=>plain{charset=>"UTF-8"}} }filter {mutate {remove_field => ["host","input","@timestamp","ecs","tags","agent","@ve…

2024.5.18 杂题

2024.5.18 杂题 「SMOI-R1」Apple 两个操作,修改元素,求子集和。 高位前缀和不会。考虑朴素 dp 转移 设 \(f[i]\) 表示二进制下长度为 \(n\) 的数前 \(i\) 位为 \(1\),后边为 \(0\) 的子集和。理论来说可以转移,但是比较麻烦,考虑优化状态,\(f[i][j]\) 表示前 \(\frac{n}…

【日记】母亲生日,我在跟数字人民币 Battle(612 字)

正文昨天跟奇安信 Battle,今天跟数字人民币 Battle。鬼知道数字人民币客户端怎么写的,我弄了一天,隐藏 Root,禁止读取应用列表,权限开放,用另一个手机或 iPad 登陆,都不行。全在提示 “检测到环境异常,暂无法提供数字人民币服务”。最后给我逼急了,用另外两个同事手机…

【工具使用】【Arthas】平时经常使用到的命令

1 前言 Arthas,应该大家都用过吧,比如我最近项目 uat 的时候,要查看某些请求比较耗时,查看耗时在哪些地方,再比如一些配置变量值配置的对不对尤其跟一些第三方交互的时候,配置的对不对需要实时查看校验下等,都可以通过Arthas 查看。 Arthas 地址:使用文档 Arthas 的下…

C++学习----gcc

gcc编译步骤 静态库使用步骤 hello_fn.h #ifndef _HELLO_FN_H #define _HELLO_FN_Hvoid hello(const char* name);#endif hello_fn.c #include <stdio.h> #include "hello_fn.h"void hello(const char* name) {printf("hello %S!!!\n", name); } ma…