Kaynağa Gözat

使用json代替simplejson,修正Except,.message错误

twz915 12 yıl önce
ebeveyn
işleme
51b6e61e86

+ 41 - 0
DjangoUeditor/fields.py

@@ -0,0 +1,41 @@
+from django.db import models
+from django.contrib.admin import widgets as admin_widgets
+from DjangoUeditor.widgets import UEditorWidget, AdminUEditorWidget
+from utils import MadeUeditorOptions
+
+class UEditorField(models.TextField):
+    '''
+    百度HTML编辑器字段,初始化时,可以提供以下参数
+            initial:初始内容
+            plugins:元组
+            mode:工具按钮的配置数量,
+            toolbars:提供工具按钮列表,取值为列表,如['bold', 'italic'],取值为:mini,normal,full,代表小,一般,全部
+            imagePath:图片上传的路径,如"images/",实现上传到"{{MEDIA_ROOT}}/images"文件夹
+            filePath:附件上传的路径,如"files/",实现上传到"{{MEDIA_ROOT}}/files"文件夹
+            imageManagerPath:图片管理器显示的路径,如果不指定则默认=imagepath
+            options:其他UEditor参数,字典类型
+            css:编辑器textarea的CSS样式
+    '''
+    
+    def __init__(self, verbose_name = None, width = 600, height = 300, plugins = (), toolbars = 'normal', filePath = '', imagePath = '', scrawlPath = '', imageManagerPath = '', css = '', options = { }, **kwargs):
+        self.ueditor_options = MadeUeditorOptions(width, height, plugins, toolbars, filePath, imagePath, scrawlPath, imageManagerPath, css, options)
+        kwargs['verbose_name'] = verbose_name
+        super(UEditorField, self).__init__(**None)
+
+    
+    def formfield(self, **kwargs):
+        defaults = {
+            'widget': UEditorWidget(**None) }
+        defaults.update(kwargs)
+        if defaults['widget'] == admin_widgets.AdminTextareaWidget:
+            defaults['widget'] = AdminUEditorWidget(**None)
+        return super(UEditorField, self).formfield(**None)
+
+
+
+try:
+    from south.modelsinspector import add_ignored_fields, add_introspection_rules
+    add_introspection_rules([], [
+        '^DjangoUeditor\\.fields\\.UEditorField'])
+except:
+    pass

BIN
DjangoUeditor/fields.pyc


+ 154 - 154
DjangoUeditor/readme.txt

@@ -1,155 +1,155 @@
-Ueditor HTML编辑器是百度开源的HTML编辑器,
-
-本模块帮助在Django应用中集成百度Ueditor HTML编辑器。
-安装包中已经集成Ueditor v1.3.6
-
-使用Django-Ueditor非常简单,方法如下:
-
-1、安装方法
-	
-	**方法一:下载安装包,在命令行运行:
-		python setup.py install
-	**方法二:使用pip工具在命令行运行(推荐):
-   		pip install DjangoUeditor
-
-2、在INSTALL_APPS里面增加DjangoUeditor app,如下:
-     
-		INSTALLED_APPS = (
-			#........
-    		'DjangoUeditor',
-		)
-
-
-3、在urls.py中增加:
-
-	url(r'^ueditor/',include('DjangoUeditor.urls' )),
-
-4、在models中这样定义:
-	
-	from DjangoUeditor.models import UEditorField
-	class Blog(models.Model):
-    	Name=models.CharField(,max_length=100,blank=True)
-    	Content=UEditorField('内容	',height=100,width=500,default='test',imagePath="uploadimg/",imageManagerPath="imglib",toolbars='mini',options={"elementPathEnabled":True},filePath='upload',blank=True)
-
-	说明:
-	UEditorField继承自models.TextField,因此你可以直接将model里面定义的models.TextField直接改成UEditorField即可。
-	UEditorField提供了额外的参数:
-        toolbars:配置你想显示的工具栏,取值为mini,normal,full,besttome, 代表小,一般,全部,涂伟忠贡献的一种样式。如果默认的工具栏不符合您的要求,您可以在settings里面配置自己的显示按钮。参见后面介绍。
-        imagePath:图片上传的路径,如"images/",实现上传到"{{MEDIA_ROOT}}/images"文件夹
-        filePath:附件上传的路径,如"files/",实现上传到"{{MEDIA_ROOT}}/files"文件夹
-        scrawlPath:涂鸦文件上传的路径,如"scrawls/",实现上传到"{{MEDIA_ROOT}}/scrawls"文件夹,如果不指定则默认=imagepath
-        imageManagerPath:图片管理器显示的路径,如"imglib/",实现上传到"{{MEDIA_ROOT}}/imglib",如果不指定则默认=imagepath。
-        options:其他UEditor参数,字典类型。参见Ueditor的文档ueditor_config.js里面的说明。
-        css:编辑器textarea的CSS样式
-        width,height:编辑器的宽度和高度,以像素为单位。
-
-5、在表单中使用非常简单,与常规的form字段没什么差别,如下:
-	
-	class TestUeditorModelForm(forms.ModelForm):
-    	class Meta:
-        	model=Blog
-	***********************************
-	如果不是用ModelForm,可以有两种方法使用:
-
-	1: 使用forms.UEditorField
-
-	from  DjangoUeditor.forms import UEditorField
-	class TestUEditorForm(forms.Form):
-	    Description=UEditorField("描述",initial="abc",width=600,height=800)
-	
-	2: widgets.UEditorWidget
-
-	from  DjangoUeditor.widgets import UEditorWidget
-	class TestUEditorForm(forms.Form):
-		Content=forms.CharField(label="内容",widget=UEditorWidget(width=800,height=500, imagePath='aa', filePath='bb',toolbars={}))
-	
-	widgets.UEditorWidget和forms.UEditorField的输入参数与上述models.UEditorField一样。
-
-6、Settings配置
-     
-      在Django的Settings可以配置以下参数:
-            UEDITOR_SETTINGS={
-                "toolbars":{           #定义多个工具栏显示的按钮,允行定义多个
-                    "name1":[[ 'source', '|','bold', 'italic', 'underline']],
-                    "name2",[]
-                },
-                "images_upload":{
-                    "allow_type":"jpg,png",    #定义允许的上传的图片类型
-                    "max_size":"2222kb"        #定义允许上传的图片大小,0代表不限制
-                },
-                "files_upload":{
-                     "allow_type":"zip,rar",   #定义允许的上传的文件类型
-                     "max_size":"2222kb"       #定义允许上传的文件大小,0代表不限制
-                 },,
-                "image_manager":{
-                     "location":""         #图片管理器的位置,如果没有指定,默认跟图片路径上传一样
-                },
-            }
-7、在模板里面:
-
-    <head>
-        ......
-        {{ form.media }}        #这一句会将所需要的CSS和JS加进来。
-        ......
-    </head>
-    注:运行collectstatic命令,将所依赖的css,js之类的文件复制到{{STATIC_ROOT}}文件夹里面。
-
-8、高级运用:
-
-     ****************
-     动态指定imagePath、filePath、scrawlPath、imageManagerPath
-     ****************
-     这几个路径文件用于保存上传的图片或附件,您可以直接指定路径,如:
-          UEditorField('内容',imagePath="uploadimg/")
-     则图片会被上传到"{{MEDIA_ROOT}}/uploadimg"文件夹,也可以指定为一个函数,如:
-
-      def getImagePath(model_instance=None):
-          return "abc/"
-      UEditorField('内容',imagePath=getImagePath)
-      则图片会被上传到"{{MEDIA_ROOT}}/abc"文件夹。
-     ****************
-     使上传路径(imagePath、filePath、scrawlPath、imageManagerPath)与Model实例字段值相关
-     ****************
-        在有些情况下,我们可能想让上传的文件路径是由当前Model实例字值组名而成,比如:
-        class Blog(Models.Model):
-            Name=models.CharField('姓名',max_length=100,blank=True)
-            Description=UEditorField('描述',blank=True,imagePath=getUploadPath,toolbars="full")
-
-     id  |   Name    |       Description
-     ------------------------------------
-     1   |   Tom     |       ...........
-     2   |   Jack    |       ...........
-
-      我们想让第一条记录上传的图片或附件上传到"{{MEDIA_ROOT}}/Tom"文件夹,第2条记录则上传到"{{MEDIA_ROOT}}/Jack"文件夹。
-      该怎么做呢,很简单。
-      def getUploadPath(model_instance=None):
-          return "%s/" % model_instance.Name
-      在Model里面这样定义:
-      Description=UEditorField('描述',blank=True,imagePath=getUploadPath,toolbars="full")
-      这上面model_instance就是当前model的实例对象。
-      还需要这样定义表单对象:
-      from  DjangoUeditor.forms import UEditorModelForm
-      class UEditorTestModelForm(UEditorModelForm):
-            class Meta:
-                model=Blog
-      特别注意:
-         **表单对象必须是继承自UEditorModelForm,否则您会发现model_instance总会是None。
-         **同时在Admin管理界面中,此特性无效,model_instance总会是None。
-         **在新建表单中,model_instance由于还没有保存到数据库,所以如果访问model_instance.pk可能是空的。因为您需要在getUploadPath处理这种情况
-
-
-class UEditorTestModelForm(UEditorModelForm):
-    class Meta:
-        model=Blog
-
-
-
-
-8、其他事项:
-
-    **本程序版本号采用a.b.ccc,其中a.b是本程序的号,ccc是ueditor的版本号,如1.2.122,1.2是DjangoUeditor的版本号,122指Ueditor 1.2.2.
-    **本程序安装包里面已经包括了Ueditor,不需要再额外安装。
-    **目前暂时不支持ueditor的插件
-    **别忘记了运行collectstatic命令,该命令可以将ueditor的所有文件复制到{{STATIC_ROOT}}文件夹里面
-    **Django默认开启了CSRF中间件,因此如果你的表单没有加入{% csrf_token %},那么当您上传文件和图片时会失败
+Ueditor HTML编辑器是百度开源的HTML编辑器,
+
+本模块帮助在Django应用中集成百度Ueditor HTML编辑器。
+安装包中已经集成Ueditor v1.3.6
+
+使用Django-Ueditor非常简单,方法如下:
+
+1、安装方法
+	
+	**方法一:下载安装包,在命令行运行:
+		python setup.py install
+	**方法二:使用pip工具在命令行运行(推荐):
+   		pip install DjangoUeditor
+
+2、在INSTALL_APPS里面增加DjangoUeditor app,如下:
+     
+		INSTALLED_APPS = (
+			#........
+    		'DjangoUeditor',
+		)
+
+
+3、在urls.py中增加:
+
+	url(r'^ueditor/',include('DjangoUeditor.urls' )),
+
+4、在models中这样定义:
+	
+	from DjangoUeditor.models import UEditorField
+	class Blog(models.Model):
+    	Name=models.CharField(,max_length=100,blank=True)
+    	Content=UEditorField('内容	',height=100,width=500,default='test',imagePath="uploadimg/",imageManagerPath="imglib",toolbars='mini',options={"elementPathEnabled":True},filePath='upload',blank=True)
+
+	说明:
+	UEditorField继承自models.TextField,因此你可以直接将model里面定义的models.TextField直接改成UEditorField即可。
+	UEditorField提供了额外的参数:
+        toolbars:配置你想显示的工具栏,取值为mini,normal,full,besttome, 代表小,一般,全部,涂伟忠贡献的一种样式。如果默认的工具栏不符合您的要求,您可以在settings里面配置自己的显示按钮。参见后面介绍。
+        imagePath:图片上传的路径,如"images/",实现上传到"{{MEDIA_ROOT}}/images"文件夹
+        filePath:附件上传的路径,如"files/",实现上传到"{{MEDIA_ROOT}}/files"文件夹
+        scrawlPath:涂鸦文件上传的路径,如"scrawls/",实现上传到"{{MEDIA_ROOT}}/scrawls"文件夹,如果不指定则默认=imagepath
+        imageManagerPath:图片管理器显示的路径,如"imglib/",实现上传到"{{MEDIA_ROOT}}/imglib",如果不指定则默认=imagepath。
+        options:其他UEditor参数,字典类型。参见Ueditor的文档ueditor_config.js里面的说明。
+        css:编辑器textarea的CSS样式
+        width,height:编辑器的宽度和高度,以像素为单位。
+
+5、在表单中使用非常简单,与常规的form字段没什么差别,如下:
+	
+	class TestUeditorModelForm(forms.ModelForm):
+    	class Meta:
+        	model=Blog
+	***********************************
+	如果不是用ModelForm,可以有两种方法使用:
+
+	1: 使用forms.UEditorField
+
+	from  DjangoUeditor.forms import UEditorField
+	class TestUEditorForm(forms.Form):
+	    Description=UEditorField("描述",initial="abc",width=600,height=800)
+	
+	2: widgets.UEditorWidget
+
+	from  DjangoUeditor.widgets import UEditorWidget
+	class TestUEditorForm(forms.Form):
+		Content=forms.CharField(label="内容",widget=UEditorWidget(width=800,height=500, imagePath='aa', filePath='bb',toolbars={}))
+	
+	widgets.UEditorWidget和forms.UEditorField的输入参数与上述models.UEditorField一样。
+
+6、Settings配置
+     
+      在Django的Settings可以配置以下参数:
+            UEDITOR_SETTINGS={
+                "toolbars":{           #定义多个工具栏显示的按钮,允行定义多个
+                    "name1":[[ 'source', '|','bold', 'italic', 'underline']],
+                    "name2",[]
+                },
+                "images_upload":{
+                    "allow_type":"jpg,png",    #定义允许的上传的图片类型
+                    "max_size":"2222kb"        #定义允许上传的图片大小,0代表不限制
+                },
+                "files_upload":{
+                     "allow_type":"zip,rar",   #定义允许的上传的文件类型
+                     "max_size":"2222kb"       #定义允许上传的文件大小,0代表不限制
+                 },,
+                "image_manager":{
+                     "location":""         #图片管理器的位置,如果没有指定,默认跟图片路径上传一样
+                },
+            }
+7、在模板里面:
+
+    <head>
+        ......
+        {{ form.media }}        #这一句会将所需要的CSS和JS加进来。
+        ......
+    </head>
+    注:运行collectstatic命令,将所依赖的css,js之类的文件复制到{{STATIC_ROOT}}文件夹里面。
+
+8、高级运用:
+
+     ****************
+     动态指定imagePath、filePath、scrawlPath、imageManagerPath
+     ****************
+     这几个路径文件用于保存上传的图片或附件,您可以直接指定路径,如:
+          UEditorField('内容',imagePath="uploadimg/")
+     则图片会被上传到"{{MEDIA_ROOT}}/uploadimg"文件夹,也可以指定为一个函数,如:
+
+      def getImagePath(model_instance=None):
+          return "abc/"
+      UEditorField('内容',imagePath=getImagePath)
+      则图片会被上传到"{{MEDIA_ROOT}}/abc"文件夹。
+     ****************
+     使上传路径(imagePath、filePath、scrawlPath、imageManagerPath)与Model实例字段值相关
+     ****************
+        在有些情况下,我们可能想让上传的文件路径是由当前Model实例字值组名而成,比如:
+        class Blog(Models.Model):
+            Name=models.CharField('姓名',max_length=100,blank=True)
+            Description=UEditorField('描述',blank=True,imagePath=getUploadPath,toolbars="full")
+
+     id  |   Name    |       Description
+     ------------------------------------
+     1   |   Tom     |       ...........
+     2   |   Jack    |       ...........
+
+      我们想让第一条记录上传的图片或附件上传到"{{MEDIA_ROOT}}/Tom"文件夹,第2条记录则上传到"{{MEDIA_ROOT}}/Jack"文件夹。
+      该怎么做呢,很简单。
+      def getUploadPath(model_instance=None):
+          return "%s/" % model_instance.Name
+      在Model里面这样定义:
+      Description=UEditorField('描述',blank=True,imagePath=getUploadPath,toolbars="full")
+      这上面model_instance就是当前model的实例对象。
+      还需要这样定义表单对象:
+      from  DjangoUeditor.forms import UEditorModelForm
+      class UEditorTestModelForm(UEditorModelForm):
+            class Meta:
+                model=Blog
+      特别注意:
+         **表单对象必须是继承自UEditorModelForm,否则您会发现model_instance总会是None。
+         **同时在Admin管理界面中,此特性无效,model_instance总会是None。
+         **在新建表单中,model_instance由于还没有保存到数据库,所以如果访问model_instance.pk可能是空的。因为您需要在getUploadPath处理这种情况
+
+
+class UEditorTestModelForm(UEditorModelForm):
+    class Meta:
+        model=Blog
+
+
+
+
+8、其他事项:
+
+    **本程序版本号采用a.b.ccc,其中a.b是本程序的号,ccc是ueditor的版本号,如1.2.122,1.2是DjangoUeditor的版本号,122指Ueditor 1.2.2.
+    **本程序安装包里面已经包括了Ueditor,不需要再额外安装。
+    **目前暂时不支持ueditor的插件
+    **别忘记了运行collectstatic命令,该命令可以将ueditor的所有文件复制到{{STATIC_ROOT}}文件夹里面
+    **Django默认开启了CSRF中间件,因此如果你的表单没有加入{% csrf_token %},那么当您上传文件和图片时会失败
    

+ 26 - 18
DjangoUeditor/views.py

@@ -2,17 +2,24 @@
 from django.http import HttpResponse
 import settings as USettings
 import os
-from django.utils import simplejson
-from  utils import GenerateRndFilename
+import json
+from utils import GenerateRndFilename
 from django.views.decorators.csrf import csrf_exempt
 
+class MyException(Exception):
+    def _get_message(self): 
+        return self._message
+    def _set_message(self, message): 
+        self._message = message
+    message = property(_get_message, _set_message)
+	
 #保存上传的文件
 def SaveUploadFile(PostFile,FilePath):
     try:
         f = open(FilePath, 'wb')
         for chunk in PostFile.chunks():
             f.write(chunk)
-    except Exception,E:
+    except MyException,E:
         f.close()
         return u"写入文件错误:"+ E.message
     f.close()
@@ -21,11 +28,12 @@ def SaveUploadFile(PostFile,FilePath):
 #上传附件
 @csrf_exempt
 def UploadFile(request,uploadtype,uploadpath):
-    if not request.method=="POST": return  HttpResponse(simplejson.dumps( u"{'state:'ERROR'}"),mimetype="Application/javascript")
+    if not request.method=="POST": 
+        return  HttpResponse(json.dumps( u"{'state:'ERROR'}"),content_type="application/javascript")
     state="SUCCESS"
     file=request.FILES.get("upfile",None)
     #如果没有提交upfile则返回错误
-    if file is None:return  HttpResponse(simplejson.dumps(u"{'state:'ERROR'}") ,mimetype="Application/javascript")
+    if file is None:return  HttpResponse(json.dumps(u"{'state:'ERROR'}") ,content_type="application/javascript")
     #取得上传的文件的原始名称
     original_name,original_ext=os.path.splitext(file.name)
     original_ext=original_ext[1:]
@@ -72,18 +80,18 @@ def UploadFile(request,uploadtype,uploadpath):
     if uploadtype=="scrawlbg":#上传涂鸦背景
         return HttpResponse(u"<script>parent.ue_callback('%s','%s');</script>" % (rInfo["url"],rInfo["state"]))
     else:#上传文件与图片
-        return HttpResponse(simplejson.dumps(rInfo),mimetype="application/javascript")
+        return HttpResponse(json.dumps(rInfo),content_type="application/javascript")
 
 #图片文件管理器
 def ImageManager(request,imagepath):
-    if not request.method!="GET": return  HttpResponse(simplejson.dumps(u"{'state:'ERROR'}") ,mimetype="Application/javascript")
+    if not request.method!="GET": return  HttpResponse(json.dumps(u"{'state:'ERROR'}") ,content_type="application/javascript")
     #取得动作
     action=request.GET.get("action","get")
     if action=="get":
         TargetPath=os.path.join(USettings.gSettings.MEDIA_ROOT,os.path.dirname(imagepath)).replace("//","/")
         if not os.path.exists(TargetPath):
             os.makedirs(TargetPath)
-        return HttpResponse(ReadDirImageFiles(TargetPath),mimetype="Application/javascript")
+        return HttpResponse(ReadDirImageFiles(TargetPath),content_type="application/javascript")
 
 #遍历所有文件清单
 def ReadDirImageFiles(path):
@@ -102,16 +110,16 @@ def ReadDirImageFiles(path):
 def RemoteCatchImage(request,imagepath):
     upfile_url=request.POST.get("upfile",None)
     if upfile_url is None:
-        return HttpResponse(simplejson.dumps("{'state:'ERROR'}"),mimetype="Application/javascript")
+        return HttpResponse(json.dumps("{'state:'ERROR'}"),content_type="application/javascript")
     import urllib
     from urlparse import urlparse
 
     #读取远程图片文件
     try:
         CatchFile=urllib.urlopen(upfile_url)
-    except Exception,E:
+    except MyException,E:
         tip=u"抓取图片错误:%s" % E.message
-        return HttpResponse(simplejson.dumps("{'tip:'%s'}" % tip),mimetype="Application/javascript")
+        return HttpResponse(json.dumps("{'tip:'%s'}" % tip),content_type="application/javascript")
 
     #取得目标抓取的文件名称
     OutFile=os.path.basename(urlparse(CatchFile.geturl()).path)
@@ -119,7 +127,7 @@ def RemoteCatchImage(request,imagepath):
     OutFileExt=os.path.splitext(OutFile)[1][1:]
     if not (OutFileExt!="" and OutFileExt in USettings.UEditorSettings['images_upload']['allow_type']):
         tip=u"不允许抓取%s类型的图片错误" % OutFileExt
-        return HttpResponse(simplejson.dumps(u"{'tip:'%s'}" % tip),mimetype="Application/javascript")
+        return HttpResponse(json.dumps(u"{'tip:'%s'}" % tip),content_type="application/javascript")
 
     #将抓取到的文件写入文件
     try:
@@ -132,10 +140,10 @@ def RemoteCatchImage(request,imagepath):
             'tip'   :u'远程图片抓取成功!'           #'状态提示'
         }
 
-        return HttpResponse(simplejson.dumps(rInfo),mimetype="Application/javascript")
-    except Exception,E:
+        return HttpResponse(json.dumps(rInfo),content_type="application/javascript")
+    except MyException,E:
         tip=u"写入图片文件错误:" % E.message
-        return HttpResponse(simplejson.dumps(u"{'tip:'%s'}" % tip),mimetype="Application/javascript")
+        return HttpResponse(json.dumps(u"{'tip:'%s'}" % tip),content_type="application/javascript")
 
 
 #搜索视频
@@ -151,7 +159,7 @@ def SearchMovie(request):
     try:
         htmlcontent=urllib.urlopen(u'http://api.tudou.com/v3/gw?method=item.search&appKey=myKey&format=json&kw=%s&pageNo=1&pageSize=20&channelId=%s&inDays=7&media=v&sort=s' % (Searchkey,Searchtype))
         return HttpResponse(htmlcontent)
-    except Exception,E:
+    except MyException,E:
         return HttpResponse(E.message)
 
 #涂鸦功能上传
@@ -175,10 +183,10 @@ def scrawlUp(request,uploadpath):
             f.write(base64.decodestring(content))
             f.close()
             state="SUCCESS"
-        except Exception,E:
+        except MyException,E:
             state="ERROR:"
         rInfo={
             "url":OutputFile,
             "state":state
         }
-        return HttpResponse(simplejson.dumps(rInfo),mimetype="application/javascript")
+        return HttpResponse(json.dumps(rInfo),content_type="application/javascript")

+ 4 - 4
DjangoUeditor/widgets.py

@@ -6,7 +6,7 @@ from django.template.loader import render_to_string
 from django.utils.safestring import mark_safe
 from django.utils.html import  conditional_escape
 from django.utils.encoding import  force_unicode
-from django.utils import simplejson
+import json
 
 from utils import MadeUeditorOptions
 import settings as USettings
@@ -22,13 +22,13 @@ class UEditorWidget(forms.Textarea):
         #取得工具栏设置
         try:
             if type(self.ueditor_options['toolbars'])==list:
-                tbar=simplejson.dumps(self.ueditor_options['toolbars'])
+                tbar=json.dumps(self.ueditor_options['toolbars'])
             else:
                 if getattr(USettings,"TOOLBARS_SETTINGS",{}).has_key(str(self.ueditor_options['toolbars'])):
                     if self.ueditor_options['toolbars'] =="full":
                         tbar=None
                     else:
-                        tbar=simplejson.dumps(USettings.TOOLBARS_SETTINGS[str(self.ueditor_options['toolbars'])])
+                        tbar=json.dumps(USettings.TOOLBARS_SETTINGS[str(self.ueditor_options['toolbars'])])
                 else:
                     tbar=None
         except:
@@ -40,7 +40,7 @@ class UEditorWidget(forms.Textarea):
             "name":name,
             "value":conditional_escape(force_unicode(value)),
             "toolbars":tbar,
-            "options":simplejson.dumps(self.ueditor_options['options'])[1:-1]
+            "options":json.dumps(self.ueditor_options['options'])[1:-1]
                 #str(self.ueditor_options['options'])[1:-1].replace("True","true").replace("False","false").replace("'",'"')
         })
         context = {