django博客開發(fā):添加富文本編輯器ckeditor

ckeditor是一個老牌的編輯器,GitHub上有一個第三方模塊django-ckeditor封裝了所有功能晚岭,把import到我們的項目里插掂,然后設置一下參數(shù),就可輕松使用了

github地址: https://github.com/django-ckeditor/django-ckeditor

開發(fā)環(huán)境: Python 3.5腥例、Django 1.10

安裝

使用pip安裝 django-ckeditorpillow辅甥,pillow用于生成縮略圖,用來在編輯器里瀏覽上傳的圖片

pip install django-ckeditor
pip install pillow

QUICK START

project/settings.py 里進行如下設置:

INSTALLED_APPS = [
    'ckeditor',
    'ckeditor_uploader',
]

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
CKEDITOR_UPLOAD_PATH = 'upload/'
CKEDITOR_IMAGE_BACKEND = 'pillow'
  1. 首先將 'ckeditor''ckeditor_uploader'加入到INSTALLED_APPS
  2. 設置 MEDIA_ROOTMEDIA_URL燎竖,CKEDITOR_UPLOAD_PATH = 'upload/'璃弄,圖片將上傳到項目下的media/upload路徑下,圖片的url是/media/upload/
  3. 設置CKEDITOR_IMAGE_BACKEND = 'pillow', 用于生成圖片縮略圖构回,在編輯器里瀏覽上傳的圖片
Paste_Image.png
  1. project/urls.py里夏块,加入 ckeditor_uploader.url
from django.conf.urls import url,include
from django.conf.urls.static import static
from django.conf import settings
from django.contrib import admin

urlpatterns = [
    url(r'', include('ckeditor_uploader.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #沒有這一句無法顯示上傳的圖片

NOTICE:在開發(fā)環(huán)境里debug模式下疏咐,static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
這句是必不可少了,沒有的話脐供,你上傳的圖片將無法顯示浑塞。將這段代碼Python shell里運行一下,會發(fā)現(xiàn)其實就是解析了media_url


當我們在服務器部署時政己,需要用nginx來配置靜態(tài)資源酌壕,在nginx的配置文件里

location /media {
                alias /path-to/media;
        }
  1. blog/models.py的Post類,讓正文字段使用 RichTextUploadingField()
from ckeditor_uploader.fields import RichTextUploadingField

class Post(models.Model):
    content = RichTextUploadingField(verbose_name='正文')
  1. 最后還是不要忘了遷移數(shù)據(jù)庫
pyhton manage.py makemigrations
python manage.py migrate

進入admin后臺去添加文章歇由,就會發(fā)現(xiàn)編輯器已經(jīng)在那里了卵牍,是不是很開心啊

其他可選配置

CKEDITOR_ALLOW_NONIMAGE_FILES = False 不允許非圖片文件上傳,默認為True
CKEDITOR_BROWSE_SHOW_DIRS = True 在編輯器里瀏覽上傳的圖片時沦泌,圖片會以路徑分組糊昙,日期排序
CKEDITOR_RESTRICT_BY_USER = True 限制用戶瀏覽圖片的權(quán)限,只能瀏覽自己上傳的圖片谢谦,圖片會傳到以用戶名命名的文件夾下释牺,超級管理員依舊可以看所有圖片

NOTICE:django-ckeditor默認的只允許管理員(staff member)上傳圖片,當普通用戶使用編輯器時(比如評論區(qū)回挽、留言板船侧、發(fā)帖子),如果要使他們上傳圖片的話厅各,需要對django-ckeditor的源碼進行修改

ckeditor_uploader/urls.py里镜撩,它的uploadbrowse方法用了staff_member_required裝飾器,把它換成login_required裝飾器即可

if django.VERSION >= (1, 8):
    urlpatterns = [
        url(r'^upload/', login_required(views.upload), name='ckeditor_upload'),
        url(r'^browse/', never_cache(login_required(views.browse)), name='ckeditor_browse'),
    ]

自定義編輯器

如果想要自定義編輯器队塘,添加或刪除一些按鈕的話袁梗,需要在settings.py里設置 CKEDITOR_CONFIGS

CKEDITOR_CONFIGS = {
    # 配置名是default時,django-ckeditor默認使用這個配置
    'default': {
        # 使用簡體中文
        'language':'zh-cn',
        # 編輯器的寬高請根據(jù)你的頁面自行設置
        'width':'730px',
        'height':'150px',
        'image_previewText':' ',
        'tabSpaces': 4,
        'toolbar': 'Custom',
        # 添加按鈕在這里
        'toolbar_Custom': [
            ['Bold', 'Italic', 'Underline', 'Format', 'RemoveFormat'],
            ['NumberedList', 'BulletedList'],
            ['Blockquote', 'CodeSnippet'],
            ['Image', 'Link', 'Unlink'],
            ['Maximize']
        ],
        # 插件
        'extraPlugins': ','.join(['codesnippet','uploadimage','widget','lineutils',]),
    }
}

當配置名稱是 'default'憔古,django-ckeditor會默認使用這個配置遮怜,CKEDITOR_CONFIGS里可以添加多個配置,比如

CKEDITOR_CONFIGS = {
    # 配置名是default時鸿市,django-ckeditor默認使用這個配置
    'default': {

    }  
    # 名為custom的配置  
    'custom': {

    }
}

當需要使用非默認配置是锯梁,需要在 RichTextUploadingField() 里指定該配置名稱

class Post(models.Model):
    content = RichTextUploadingField(config_name='custom')

添加代碼功能

寫技術(shù)博客的話,我們的編輯器自然需要添加代碼塊的功能焰情。需要用到插件codesnippet陌凳,ckeditor的插件放在了ckeditor/static/ckeditor/ckeditor/plugins/路徑下。
當我們添加一個功能插件時内舟,需要在CKEDITOR_CONFIGS里的extraPlugins對應的value里添加該插件的名字(名字字母小寫)合敦,如果該插件還有相對應的按鈕,則在toolbar對應的value里添加名字(首字母大寫)验游,以codesnippet為例充岛,在下面代碼的第16行和21行分別添加了 'CodeSnippet''codesnippet'
NOTICE:在21行的extraPlugins里還添加了 'uploadimage'保檐,這個插件的作用是允許用戶直接在編輯器里粘貼(ctrl + v)圖片

CKEDITOR_CONFIGS = {
    # 配置名是default時,django-ckeditor默認使用這個配置
    'default': {
        # 使用簡體中文
        'language':'zh-cn',
        # 編輯器的寬高請根據(jù)你的頁面自行設置
        'width':'730px',
        'height':'150px',
        'image_previewText':' ',
        'tabSpaces': 4,
        'toolbar': 'Custom',
        # 添加按鈕在這里
        'toolbar_Custom': [
            ['Bold', 'Italic', 'Underline', 'Format', 'RemoveFormat'],
            ['NumberedList', 'BulletedList'],
            ['Blockquote', 'CodeSnippet'],
            ['Image', 'Link', 'Unlink'],
            ['Maximize']
        ],
        # 插件
        'extraPlugins': ','.join(['codesnippet','uploadimage','widget','lineutils',]),
    }
}

代碼高亮崔梗、代碼行數(shù)

從ckeditor官網(wǎng)下載 插件prism(點這里直接下載)夜只,然后將其解壓到ckeditor/static/ckeditor/ckeditor/plugins路徑下,同樣的我們需要在CKEDITOR_CONFIGS里將extraPlugins對應的value里加入插件 'prism' 和另外兩個插件'lineutils'蒜魄,'widget'扔亥,這兩個插件無須下載,在django-ckeditor中已經(jīng)有了

'extraPlugins': ','.join(['codesnippet','uploadimage','prism','widget','lineutils',]),

去prismjs官網(wǎng)下載css文件http://prismjs.com/download.html权悟,選擇你喜歡的主題,勾選支持的語言推盛,以及別忘選擇line-numbers功能峦阁,下載后把他解壓到static/blog/css




然后在模板中引用靜態(tài)文件

<script src="{% static 'ckeditor/ckeditor/plugins/prism/lib/prism/prism_patched.min.js' %}"></script>
<link rel="stylesheet" href="{% static 'blog/css/prism.css' %}">

在admin以外的地方使用django-ckeditor

如果在admin以外的地方使用django-ckeditor,比如添加評論功能耘成,在渲染表單的那個頁面需要引入ckeditor-init.jsckeditor.js兩個文件榔昔,否則編輯器無法顯示

{% load static %}
<script type="text/javascript" src="{% static "ckeditor/ckeditor-init.js" %}"></script>
<script type="text/javascript" src="{% static "ckeditor/ckeditor/ckeditor.js" %}"></script>

原文鏈接:http://www.aaron-zhao.com/post/1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘪菌,隨后出現(xiàn)的幾起案子撒会,更是在濱河造成了極大的恐慌,老刑警劉巖师妙,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诵肛,死亡現(xiàn)場離奇詭異,居然都是意外死亡默穴,警方通過查閱死者的電腦和手機怔檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓄诽,“玉大人薛训,你說我怎么就攤上這事÷胤眨” “怎么了乙埃?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锯岖。 經(jīng)常有香客問我介袜,道長,這世上最難降的妖魔是什么出吹? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任米酬,我火速辦了婚禮,結(jié)果婚禮上趋箩,老公的妹妹穿的比我還像新娘赃额。我一直安慰自己加派,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布跳芳。 她就那樣靜靜地躺著芍锦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飞盆。 梳的紋絲不亂的頭發(fā)上娄琉,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音吓歇,去河邊找鬼孽水。 笑死,一個胖子當著我的面吹牛城看,可吹牛的內(nèi)容都是我干的女气。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼测柠,長吁一口氣:“原來是場噩夢啊……” “哼炼鞠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轰胁,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤谒主,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赃阀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霎肯,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年榛斯,在試婚紗的時候發(fā)現(xiàn)自己被綠了姿现。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡肖抱,死狀恐怖备典,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情意述,我是刑警寧澤提佣,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站荤崇,受9級特大地震影響拌屏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜术荤,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一倚喂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦端圈、人聲如沸焦读。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矗晃。三九已至,卻和暖如春宴倍,著一層夾襖步出監(jiān)牢的瞬間张症,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工鸵贬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俗他,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓阔逼,卻偏偏與公主長得像兆衅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颜价,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容