如何替换django_jsonform中JSONField的内部文本输入为富文本组件?
解决django_jsonform中JSONField字符串输入替换为TinyMCE的方法
不用替换整个JSONField的组件,django_jsonform本身支持针对Schema里的特定字段指定自定义widget,专门解决这类需求:
方法1:针对单个字符串字段指定富文本组件
- 先定义适配的TinyMCE Widget(项目已配置好TinyMCE可直接用现有Widget):
from django import forms from tinymce.widgets import TinyMCE class RichTextWidget(TinyMCE): def __init__(self, *args, **kwargs): kwargs.setdefault('attrs', {}) kwargs['attrs']['cols'] = 80 kwargs['attrs']['rows'] = 10 super().__init__(*args, **kwargs)
- 在Model的JSONField Schema中,给需要富文本的string类型字段添加
"widget"参数,指定自定义Widget:
from django.db import models from django_jsonform.models.fields import JSONField MY_SCHEMA = { "type": "array", "items": { "type": "object", "properties": { "title": {"type": "string"}, # 给content字段替换为富文本输入 "content": { "type": "string", "widget": RichTextWidget } }, "required": ["title", "content"] } } class MyModel(models.Model): data = JSONField(schema=MY_SCHEMA)
方法2:全局替换所有字符串类型的组件
如果想让Schema里所有string字段都用TinyMCE,可重写django_jsonform的表单字段类,替换默认的string widget:
from django_jsonform.forms.fields import JSONFormField class CustomJSONFormField(JSONFormField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 替换所有string类型的默认widget为TinyMCE self.widget.field_widgets['string'] = RichTextWidget # 在Admin中使用自定义字段 from django.contrib import admin @admin.register(MyModel) class MyModelAdmin(admin.ModelAdmin): formfield_overrides = { JSONField: {'form_class': CustomJSONFormField} }
注意事项
- 不要直接替换JSONField的
widget参数,这会覆盖django_jsonform自带的Schema渲染组件,导致变成纯JSON文本输入,也就是你之前遇到的问题。 - 确保TinyMCE静态资源已正确加载到Admin页面,可在Admin的
Media类中引入:
class MyModelAdmin(admin.ModelAdmin): # ...其他配置 class Media: js = ('tinymce/tinymce.min.js', 'tinymce/config.js')
内容的提问来源于stack exchange,提问作者Derek Chadwell
相关产品推荐
相关产品推荐

