前不久在一个项目中遇到了一个问题,客户要求把django的admin后台的某些field变成文本编辑框,也就是把文本编辑器集成到admin后台, 开始在网上查了一下,发现大部分人都是重写了admin后台,但是从我的项目来看,要是这样做的话工作量很大,而且都是些重复的工作。看了一下 django关于field那块的源码,发现django的所有field都是继承一个Filed基类,然后自己定义不同field的功能,同时包括在 admin后台的显示。所以就有了自己定义field的想法,给项目节省了不少时间。具体如下:
在项目中下加了个python包,包名叫mymodels(自己起名),这个包下包含__init__.py 和forms.py两个文件,文件内容如下:
__init__.py:
forms.py:
这里我用的FCKeditor文本编辑器。
这样你只要在apps中的model中这样定义field:rich_text = mymodels.RichTextField() ,在admin后台这个field就会是继承有文本编辑器的文本编辑域,非常方便。
同时要注意,我这里写发会带来一个问题,如果一个model中包含多个这样的域,FCKeditor就会被加载多次,所以那段初始化FCKeditor的js代码可以写在别的地方来解决这个问题。至于放哪,自己想想吧。
在项目中下加了个python包,包名叫mymodels(自己起名),这个包下包含__init__.py 和forms.py两个文件,文件内容如下:
__init__.py:
python 代码
- from django.db import models
- import forms
- class RichTextField(models.TextField):
- def get_internal_type(self):
- return "TextField"
- def get_manipulator_field_objs(self):
- return [forms.RichTextField]
forms.py:
python 代码
- import django.forms as djangoforms
- class RichTextField(djangoforms.LargeTextField):
- def render(self,data):
- return djangoforms.LargeTextField.render(self,data) + """
- <script></script>
- <script>
- window.οnlοad=function(){
- var sBasePath="/media/FCKeditor/";
- var oFCKeditor=new FCKeditor("%s",500,400,"Pic","500");
- oFCKeditor.BasePath=sBasePath;oFCKeditor.ReplaceTextarea();
- }
- </script>""" % self.field_name
这里我用的FCKeditor文本编辑器。
这样你只要在apps中的model中这样定义field:rich_text = mymodels.RichTextField() ,在admin后台这个field就会是继承有文本编辑器的文本编辑域,非常方便。
同时要注意,我这里写发会带来一个问题,如果一个model中包含多个这样的域,FCKeditor就会被加载多次,所以那段初始化FCKeditor的js代码可以写在别的地方来解决这个问题。至于放哪,自己想想吧。