Table of Contents:
- Installing CKEditor
- Adding path for media files
- Setup URLs
- Change in the model
- Configuring CKEditor
- Creating model form
Installing CKEditor
The first step is to install the Django-CKEditor. You can directly
install using pip,
$ pip3 install django-ckeditor
After installation, you need to add the CKEditor to the installed_apps in settings.py
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','ckeditor', # CKEditor config'ckeditor_uploader', # CKEditor media uploader]
Here we are adding ckeditor and ckeditor_uploader to the
installed_apps for handling CKEditor and CKEditor media files.
Adding path for media files
For enabling the file upload feature you'll need to specify the place and the
path where all the media files want to be stored. In the
settings.py you can add the path and root folder for this.
MEDIA_URL = "/media/"MEDIA_ROOT = os.path.join(BASE_DIR,'media')#ckeditor upload pathCKEDITOR_UPLOAD_PATH="uploads/"
Django will create a folder media in your base directory where you can
find all the media files including images, videos, audios, etc that are
uploaded via CKEditor.
Setup URLs
In the project urls.py, we need to add two things. First is
the CKEditor URL and the path of the media files where Django can identify the
location of media files.
from django.contrib import adminfrom django.urls import path, include, re_pathfrom django.conf.urls.static import staticfrom django.conf import settingsurlpatterns = [path('admin/', admin.site.urls),path('',include('blog.urls')),re_path(r'^ckeditor/', include('ckeditor_uploader.urls')), # The CKEditor path]# Path of media filesurlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Change in the model
For our CKEditor to work in both admin and form fields, we must change the
body of the model field from the raw text field to CKEditor rich text field.
Head over to models.py and make these changes.
from django.db import modelsfrom ckeditor_uploader.fields import RichTextUploadingField# Create your models here.class Post(models.Model):title = models.CharField(max_length=255)#body = models.TextField()body = RichTextUploadingField() # CKEditor Rich Text Fielddef __str__(self):return self.title
The model has been changed from raw text field to CKEditor rich text and
uploading field. Now let's run our migrations.
run all migrations
$ python manage.py makemigrations
and migrate the changes
$ python manage.py migrate
Don't forget to add your model to admin.py else it will not show on
your Django admin panel.
Run the development server using the "python manage.py runserver" command and go to localhost:8000/admin, click on the post and you
can see the CKEditor rich text is being added in the body field.
Configuring CKEditor
The CKEditor you'll see is the default, you can add more functionalities and
extra plugins by configuring CKEditor in the settings.py. Anyway here
is the advanced CKEditor configuration.
CKEDITOR_CONFIGS = {'default': {'toolbar_Custom': [{'name': 'document', 'items': ['Source', '-', 'Save', 'NewPage', 'Preview', 'Print', '-', 'Templates']},{'name': 'clipboard', 'items': ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']},{'name': 'editing', 'items': ['Find', 'Replace', '-', 'SelectAll']},{'name': 'forms','items': ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton','HiddenField']},'/',{'name': 'basicstyles','items': ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']},{'name': 'paragraph','items': ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-','JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl','Language']},{'name': 'links', 'items': ['Link', 'Unlink', 'Anchor']},{'name': 'insert','items': ['Image', 'Youtube','Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']},'/',{'name': 'styles', 'items': ['Styles', 'Format', 'Font', 'FontSize']},{'name': 'colors', 'items': ['TextColor', 'BGColor']},{'name': 'tools', 'items': ['Maximize', 'ShowBlocks']},{'name': 'about', 'items': ['CodeSnippet']},{'name': 'about', 'items': ['About']},'/', # put this to force next toolbar on new line{'name': 'yourcustomtools', 'items': [# put the name of your editor.ui.addButton here'Preview','Maximize',]},],'toolbar': 'Custom', # put selected toolbar config here'toolbarGroups': [{ 'name': 'document', 'groups': [ 'mode', 'document', 'doctools' ] }],'height': 400,# 'width': '100%','filebrowserWindowHeight': 725,'filebrowserWindowWidth': 940,'toolbarCanCollapse': True,'mathJaxLib': '//cdn.mathjax.org/mathjax/2.2-latest/MathJax.js?config=TeX-AMS_HTML','tabSpaces': 4,'extraPlugins': ','.join(['uploadimage', # the upload image feature# your extra plugins here'div','autolink','autoembed','embedsemantic','autogrow','devtools','widget','lineutils','clipboard','dialog','dialogui','elementspath','codesnippet',]),}}
You can add these configurations to your CKEditor and it will reflect in your
admin panel.
Creating model form
So we successfully added CKEditor to our admin panel, but let's suppose you
are willing to make it public for everyone to write a post on your blog, you
can use Django forms.
In order to use Django forms, first, you need to create a forms.py file
in the blog directory, and then add the model fields inside the form just like
this:
from django.forms import ModelFormfrom.models import Postclass PostForm(ModelForm):class Meta:model = Postfields = ['title','body']
To show these form fields in your template, go to views.py and pass the
form data to the template.
from django.shortcuts import renderfrom.models import Postfrom.forms import PostFormfrom django.http import HttpResponseRedirect# Create your views here.def index(request):form = Noneif request.method == "POST":form = PostForm(request.POST)if form.is_valid():form.save()return HttpResponseRedirect('/thanks/')else:form = PostForm()return render(request, 'index.html',{'form':form})
The above function will save the form to the database and also pass the form fields to the 'index.html' template. Here we are using the POST method to send the data that needs to be stored in the database.
index.html
<!DOCTYPE html><html><head><meta charset='utf-8'><meta http-equiv='X-UA-Compatible' content='IE=edge'><title>Page Title</title><meta name='viewport' content='width=device-width, initial-scale=1'></head><body><form method="post">{% csrf_token %}<div class="form-outline">{{form.as_p}}<br></div><!--Blog Text Area-->{{form.media}}<input type="submit"></form></body></html>
After adding the forms to your template as shown above you'll see the forms field appeared on your template.