首页 > 其他分享 >Django markdown 实现

Django markdown 实现

时间:2024-05-18 14:51:45浏览次数:23  
标签:markdown settings 实现 django forms models import Django mdeditor

一、安装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是False

if 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 MDTextField

class 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 Content

class 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 = 15

admin.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 forms

class MDEditorModleForm(forms.ModelForm):
    class Meta:
        model = Content
        fields = '__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官方文档

标签:markdown,settings,实现,django,forms,models,import,Django,mdeditor
From: https://www.cnblogs.com/shenbojun/p/18199296

相关文章

  • django中使用celery
    通用方案将自定义的celery的包拉到django项目根目录在celery.py文件内导入django的环境变量这样才能正常启动worker或者beatfromceleryimportCeleryimporttimeimportos#必须要将django的环境变量加进去(在manage.py中复制)os.environ.setdefault('DJANGO_SETTINGS_M......
  • 使用django_celery_beat在admin后台配置计划任务
    使用步骤安装包pipinstalldjango-celery-beatapp注册app注册INSTALLED_APPS=[....'django_celery_beat',]配置文件:屏蔽原来的调度器CELERY_BEAT_SCHEDULER='django_celery_beat.schedulers.DatabaseScheduler'设置时区LANGUAGE_CODE='z......
  • 一对一视频聊天源码,水印功能实现方案不容错过
    一对一视频聊天源码,水印功能实现方案不容错过一、基于原图生成水印图片(后端)这种方案就是将原图片添加水印之后生成了新图片,后续在一对一视频聊天源码前端页面进行展示是后端接口不返回原图片,而是返回带有水印的图片即可。这种方式最大的优点就是安全,因为水印图......
  • 一对一视频源码,实现限流对优化系统性能尤为重要
    一对一视频源码,实现限流对优化系统性能尤为重要,主要内容为滑动日志,令牌桶,漏桶三种限流算法的Java实现获取连接许可的接口一、滑动日志用一个有序集合来存储所有请求的时间戳,以空间换时间的方式来简化计算二、令牌桶利用延迟计算来维护令牌数量三、漏桶漏桶算法原理类似......
  • Asp-Net-Core开发笔记:使用ActionFilterAttribute实现非侵入式的参数校验
    前言在现代应用开发中,确保API的安全性和可靠性至关重要。面向切面编程(AOP)通过将横切关注点(如验证、日志记录、异常处理)与核心业务逻辑分离,极大地提升了代码的模块化和可维护性。在ASP.NETCore中,利用ActionFilterAttribute可以方便地实现AOP的理念,能够以简洁、高效的方式进行自......
  • R语言中小数点如何实现进位
     001、round,四舍五入>a<-5.345##舍去>round(a)[1]5>b<-5.824##进位>round(b)[1]6 002、round,四舍五入指定小数位数>a<-8.426532>round(a,1)##保留一位小数,四舍五入[1]8.4>round(a,2)##保......
  • 92. 递归实现指数型枚举
    传送锚点:https://www.acwing.com/problem/content/94/从1∼n这n个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本......
  • 【Delphi 开箱即用 1】简单实现拖拽文件到窗口
    当今,大多数个人小程序都普遍具备拖拽功能,因为拖拽操作极其便捷。毕竟,相比于传统的浏览文件夹方式打开目标文件,拖拽操作简直是一种解放。在这里,我们无需依赖任何第三方控件,单纯通过代码实现拖拽功能。目录1.最终效果图2.部分核心代码3.完整Demo源码下载1.最终效果图2.部分......
  • flutter动画— —Hero +photo_view 实现微信朋友圈图片预览
    photo_view预览单张图片依赖photo_view:^0.14.0#微信图片单张图片的预览//PhotoView(//imageProvider://NetworkImage(widget.arguments["imageUrl"]),//)classHeroPageextendsStatefulWidget{finalMaparguments;constHeroPage({super.key,req......
  • 利用three.js七步实现VR看房
    这里我用的是vue框架:首先下载安装three.js=>npminstallthree;然后import*asTHREEfrom'three'导入组件中;接下来就可以在组件中编写我们的three.js代码创建场景:constscene=newTHREE.Scene()创建相机:constcamera=newTHREE.PerspectiveCamera( 70,//视角度......