在xadmin中经过自定义插件,实现富文本编辑器,效果以下:javascript
一、首先,pip安装ueditor的Django版本:php
pip install DjangoUeditor
二、以后须要添加到项目的settings.py文件的INSTALLED_APPS下面html
三、在urls.py文件中加入用于处理富文本的网址:java
url(r'^ueditor/',include('DjangoUeditor.urls' ))
四、在model中使用UEditorField字段node
from DjangoUeditor.models import UEditorField class Blog(models.Model): Name=models.CharField(,max_length=100,blank=True) Content=UEditorField(u'内容 ',width=600, height=300,toolbars="full", imagePath="", filePath="",upload_settings={"imageMaxSize":1204000},settings={},command=None,event_handler=myEventHander(),blank=True)
UEditorField继承自models.TextField,所以你能够直接将model里面定义的models.TextField直接改为UEditorField便可。 定义UEditorField时除了能够直接传入models.TextField提供的参数外,还能够传入UEditorField提供的额外的参数 来控制UEditorField的外观、上传路径等。 UEditorField的参数以下:python
width,height :编辑器的宽度和高度,以像素为单位。git
toolbars :配置你想显示的工具栏,取值为mini,normal,full,表明小,通常,所有。若是默认的工具栏的按钮数量不符合您的要求,您能够在settings里面配置本身的显示按钮。参见后面介绍。github
imagePath :图片上传后保存的路径,如"images/",实现上传到"{{MEDIA_ROOT}}/images"文件夹。 注意:若是imagePath值只设置文件夹,则未尾要有"/" imagePath能够按python字符串格式化:如"images/%(basename)s_%(datetime)s.%(extname)s"。这样若是上传test.png,则文件会 被保存为"{{MEDIA_ROOT}}/images/test_20140625122399.png"。 imagePath中能够使用的变量有:ajax
filePath : 附件上传后保存的路径,设置规则与imagePath同样。django
upload_settings : 字典值, 例:upload_settings={ imagePathFormat:"images/%(basename)s_%(datetime)s.%(extname)s", imageMaxSize:323232 fileManagerListPath:"files" }
settings : 字典值,配置项与ueditor/ueditor.config.js里面的配置项一致。
command : 能够为Ueditor新增一个按钮、下拉框、对话框,例:
Description = UEditorField(u'描述', blank=True, toolbars="full",imagePath="cool/", settings={"a": 1},command=[myBtn(uiName="mybtn1", icon="d.png", title=u"1摸我",ajax_url="/ajaxcmd/"),myCombo(uiName="myCombo3",title=u"ccc",initValue="aaa")])
五、建立ueditor插件
在项目中xadmin/Plugins中建立插件ueditor.py,写入下面代码:
# -*- coding: utf-8 -*- import xadmin from django.db.models import TextField from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView from DjangoUeditor.models import UEditorField from DjangoUeditor.widgets import UEditorWidget from django.conf import settings class XadminUEditorWidget(UEditorWidget): def __init__(self, **kwargs): self.ueditor_options = kwargs self.Media.js = None super(XadminUEditorWidget, self).__init__(kwargs) class UeditorPlugin(BaseAdminPlugin): def get_fiels_style(self, attrs, db_field, style, **kwargs): """ 接收adminx中的style_fields键值对,分别赋值给db_field,style """ if style == 'ueditor': if isinstance(db_field, UEditorField): widget = db_field.formfield().widget param = {} param.update(widget.ueditor_settings) param.update(widget.attrs) return {'widget': XadminUEditorWidget(**param)} return attrs def block_extrahead(self, context, nodes): """ 在生成的页面中加入本身的js文件 """ js = '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + 'ueditor/ueditor.config.js') js += '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + 'ueditor/ueditor.all.min.js') nodes.append(js) xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView) xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)
六、将ueditor写入xadmin/Plugins/__init__.py文件中,__init__.py文件中有一个元组,存放xadmin的全部插件:
七、在某一个app的adminx.py文件中指明哪一个字段使用ueditor样式:
八、有一个问题,当咱们在富文本中写入非文本的内容时,页面不能正常显示内容:
加入了一个表情,显示的确实一段HTML代码。这是Django的CSRF防范的一种机制,它会对用户输入的字符进行转义
实际的网页源码是这样的。若是要正常显示这部分的内容,须要用到Django模板一个过滤器:
DjangoUeditor源码地址:https://github.com/zhangfisher/DjangoUeditor
参考:http://coding.imooc.com/class/78.html