Metadata-Version: 2.1
Name: django-ckeditor
Version: 6.7.2
Summary: Django admin CKEditor integration.
Home-page: https://github.com/django-ckeditor/django-ckeditor
Author: Shaun Sephton & Piotr Malinski
Author-email: riklaunim@gmail.com
Project-URL: Documentation, https://django-ckeditor.readthedocs.io/en/latest/
Project-URL: Source, https://github.com/django-ckeditor/django-ckeditor
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Framework :: Django
Classifier: Framework :: Django :: 3.2
Classifier: Framework :: Django :: 4.1
Classifier: Framework :: Django :: 4.2
Classifier: Framework :: Django :: 5.0
Classifier: Intended Audience :: Developers
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Requires-Python: >=3.8
License-File: LICENSE
Requires-Dist: Django>=3.2
Requires-Dist: django-js-asset>=2.0
Deprecation notice
==================
I do not recommend using this package anymore since the open source version of CKEditor 4 has unfixed security issues. More on this in `my blog post `__. Alternatives are listed `here on Django Packages `__. I personally am using `django-prose-editor `__. Thanks!
Django CKEditor
===============
.. image:: https://img.shields.io/pypi/v/django-ckeditor.svg
:target: https://pypi.python.org/pypi/django-ckeditor
.. image:: https://img.shields.io/pypi/pyversions/django-ckeditor.svg
:target: https://pypi.org/project/django-ckeditor/
.. image:: https://img.shields.io/pypi/djversions/django-ckeditor.svg
:target: https://pypi.org/project/django-ckeditor/
.. image:: https://github.com/django-ckeditor/django-ckeditor/workflows/Tests/badge.svg
:target: https://github.com/django-ckeditor/django-ckeditor/actions
.. image:: https://readthedocs.org/projects/django-ckeditor/badge/?version=latest&style=flat
:target: https://django-ckeditor.readthedocs.io/en/latest/
**Django admin CKEditor integration.**
Provides a ``RichTextField``, ``RichTextUploadingField``, ``CKEditorWidget`` and ``CKEditorUploadingWidget`` utilizing CKEditor with image uploading and browsing support included.
This version also includes:
#. support to django-storages (works with S3)
#. updated ckeditor to version 4.18.0
#. included all ckeditor language and plugin files to make everyone happy! ( `only the plugins maintained by the ckeditor develops team `__ )
.. contents:: Contents
:depth: 5
Installation
------------
Required
~~~~~~~~
#. Install or add django-ckeditor to your python path.
::
pip install django-ckeditor
#. Add ``ckeditor`` to your ``INSTALLED_APPS`` setting.
#. Run the ``collectstatic`` management command: ``$ ./manage.py collectstatic``. This will copy static CKEditor required media resources into the directory given by the ``STATIC_ROOT`` setting. See `Django's documentation on managing static files `__ for more info.
#. CKEditor needs to know where its assets are located because it loads them
lazily only when needed. The location is determined in the ``ckeditor-init.js``
script. and defaults to ``static/ckeditor/ckeditor/``. This does not work all
the time, for example when using ``ManifestStaticFilesStorage``, any asset
packaging pipeline or whatnot. django-ckeditor is quite good at automatically
detecting the correct place even then, but sometimes you have to hardcode
``CKEDITOR_BASEPATH`` somewhere. This can be hardcoded in settings, i.e.::
CKEDITOR_BASEPATH = "/my_static/ckeditor/ckeditor/"
It is possible to override
the ``admin/change_form.html`` template with your own if you really need to do
this, i.e.::
{% extends "admin/change_form.html" %}
{% block extrahead %}
{{ block.super }}
{% endblock %}
Of course, you should adapt this snippet to your needs when using
CKEditor outside the admin app.
Required for using widget with file upload
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#. Add ``ckeditor_uploader`` to your ``INSTALLED_APPS`` setting.
#. Add a ``CKEDITOR_UPLOAD_PATH`` setting to the project's ``settings.py`` file. This setting specifies a relative path to your CKEditor media upload directory. CKEditor uses Django's storage API. By default, Django uses the file system storage backend (it will use your ``MEDIA_ROOT`` and ``MEDIA_URL``) and if you don't use a different backend you have to have write permissions for the ``CKEDITOR_UPLOAD_PATH`` path within ``MEDIA_ROOT``, i.e.::
CKEDITOR_UPLOAD_PATH = "uploads/"
When using default file system storage, images will be uploaded to "uploads" folder in your ``MEDIA_ROOT`` and urls will be created against ``MEDIA_URL`` (``/media/uploads/image.jpg``).
If you want to be able to have control over filename generation, you have to add a custom filename generator to your settings::
# utils.py
def get_filename(filename, request):
return filename.upper()
::
# settings.py
CKEDITOR_FILENAME_GENERATOR = 'utils.get_filename'
CKEditor has been tested with django FileSystemStorage and S3BotoStorage.
There are issues using S3Storage from django-storages.
#. For the default filesystem storage configuration, ``MEDIA_ROOT`` and ``MEDIA_URL`` must be set correctly for the media files to work (like those uploaded by the ckeditor widget).
#. Add CKEditor URL include to your project's ``urls.py`` file::
path('ckeditor/', include('ckeditor_uploader.urls')),
#. Note that by adding those URLs you add views that can upload and browse through uploaded images. Since django-ckeditor 4.4.6, those views are decorated using ``@staff_member_required``. If you want a different permission decorator (``login_required``, ``user_passes_test`` etc.) then add views defined in ``ckeditor.urls`` manually to your urls.py.
Optional - customizing CKEditor editor
--------------------------------------
#. Add a CKEDITOR_CONFIGS setting to the project's ``settings.py`` file. This specifies sets of CKEditor settings that are passed to CKEditor (see CKEditor's `Setting Configurations `__), i.e.::
CKEDITOR_CONFIGS = {
'awesome_ckeditor': {
'toolbar': 'Basic',
},
}
The name of the settings can be referenced when instantiating a RichTextField::
content = RichTextField(config_name='awesome_ckeditor')
The name of the settings can be referenced when instantiating a CKEditorWidget::
widget = CKEditorWidget(config_name='awesome_ckeditor')
By specifying a set named ``default`` you'll be applying its settings to all RichTextField and CKEditorWidget objects for which ``config_name`` has not been explicitly defined ::
CKEDITOR_CONFIGS = {
'default': {
'toolbar': 'full',
'height': 300,
'width': 300,
},
}
It is possible to create a custom toolbar ::
CKEDITOR_CONFIGS = {
'default': {
'toolbar': 'Custom',
'toolbar_Custom': [
['Bold', 'Italic', 'Underline'],
['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
['Link', 'Unlink'],
['RemoveFormat', 'Source']
]
}
}
If you want or need plugins which are not part of django-ckeditor's
plugin set you may specify assets and plugins as follows::
text = RichTextField(
config_name='forum-post',
# CKEDITOR.config.extraPlugins:
extra_plugins=['someplugin'],
# CKEDITOR.plugins.addExternal(...)
external_plugin_resources=[(
'someplugin',
'/static/.../path-to-someplugin/',
'plugin.js',
)],
)
Alternatively, those settings can also be provided through
``CKEDITOR_CONFIGS``.
Optional for file upload
~~~~~~~~~~~~~~~~~~~~~~~~
#. All uploaded files are slugified by default. To disable this feature, set ``CKEDITOR_UPLOAD_SLUGIFY_FILENAME`` to ``False``.
#. Set the ``CKEDITOR_RESTRICT_BY_USER`` setting to ``True`` in the project's ``settings.py`` file (default ``False``). This restricts access to uploaded images to the uploading user (e.g. each user only sees and uploads their own images). Upload paths are prefixed by the string returned by ``get_username``. If ``CKEDITOR_RESTRICT_BY_USER`` is set to a string, the named property is used instead. Superusers can still see all images. **NOTE**: This restriction is only enforced within the CKEditor media browser.
#. Set the ``CKEDITOR_BROWSE_SHOW_DIRS`` setting to ``True`` to show directories on the "Browse Server" page. This enables image grouping by directory they are stored in, sorted by date.
#. Set the ``CKEDITOR_RESTRICT_BY_DATE`` setting to ``True`` to bucked uploaded files by year/month/day.
#. You can set a custom file storage for CKEditor uploader by defining it under ``CKEDITOR_STORAGE_BACKEND`` variable in settings.
#. You can set ``CKEDITOR_IMAGE_BACKEND`` to one of the supported backends to enable thumbnails in ckeditor gallery.
By default, no thumbnails are created and full-size images are used as preview.
Supported backends:
- ``ckeditor_uploader.backends.PillowBackend``: Uses Pillow
#. With the ``PillowBackend`` backend, you can change the thumbnail size with the ``CKEDITOR_THUMBNAIL_SIZE`` setting (formerly ``THUMBNAIL_SIZE``).
Default value: (75, 75)
#. With the ``PillowBackend`` backend, you can convert and compress the uploaded images to jpeg, to save disk space.
Set the ``CKEDITOR_FORCE_JPEG_COMPRESSION`` setting to ``True`` (default ``False``)
You can change the ``CKEDITOR_IMAGE_QUALITY`` setting (formerly ``IMAGE_QUALITY``), which is passed to Pillow:
The image quality, on a scale from 1 (worst) to 95 (best). The default is 75. Values above 95
should be avoided; 100 disables portions of the JPEG compression algorithm and results in
large files with hardly any gain in image quality.
This feature is disabled for animated images.
Usage
-----
Field
~~~~~
The quickest way to add rich text editing capabilities to your models is to use the included ``RichTextField`` model field type. A CKEditor widget is rendered as the form field but in all other regards the field behaves like the standard Django ``TextField``. For example::
from django.db import models
from ckeditor.fields import RichTextField
class Post(models.Model):
content = RichTextField()
**For file upload support** use ``RichTextUploadingField`` from ``ckeditor_uploader.fields``.
Widget
~~~~~~
Alternatively, you can use the included ``CKEditorWidget`` as the widget for a formfield. For example::
from django import forms
from django.contrib import admin
from ckeditor.widgets import CKEditorWidget
from post.models import Post
class PostAdminForm(forms.ModelForm):
content = forms.CharField(widget=CKEditorWidget())
class Meta:
model = Post
fields = '__all__'
class PostAdmin(admin.ModelAdmin):
form = PostAdminForm
admin.site.register(Post, PostAdmin)
**For file upload support** use ``CKEditorUploadingWidget`` from ``ckeditor_uploader.widgets``.
**Overriding widget template**
In Django >=1.11 for overriding ``ckeditor/widget.html`` you have three ways:
#. Place ``ckeditor/widget.html`` in ``BASE_DIR/templates``
- Change ``FORM_RENDERER`` to ``TemplateSettings``.
::
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
- Include ``templates`` folder in ``DIRS``
::
TEMPLATES = [{
...
'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
...
}]
- Add ``'django.forms'`` to ``INSTALLED_APPS``.
#. Place ``ckeditor/widget.html`` in ``your_app/templates`` and place ``'your_app'`` **before** ``'ckeditor'`` and ``'ckeditor_uploader'`` in ``INSTALLED_APPS``.
#. Inherit from ``CKEditorWidget`` and override ``template_name`` with a custom template available in TEMPLATES DIRS as defined settings.py.
::
class MyCustomCKEditorWidget(CKEditorWidget):
template_name = "templates/custom_ckeditor/widget.html"
Outside of django admin
~~~~~~~~~~~~~~~~~~~~~~~
When you are rendering a form outside the admin panel, you'll have to make sure all form media is present for the editor to work. One way to achieve this is like this::
or you can load the media manually as it is done in the demo app::
{% load static %}
When you need to render ``RichTextField``'s HTML output in your templates safely, just use ``{{ content|safe }}``, `Django's safe filter `_
Management Commands
~~~~~~~~~~~~~~~~~~~
Included is a management command to create thumbnails for images already contained in ``CKEDITOR_UPLOAD_PATH``. This is useful to create thumbnails when using django-ckeditor with existing images. Issue the command as follows::
$ ./manage.py generateckeditorthumbnails
**NOTE**: If you're using custom views remember to include ckeditor.js in your form's media either through ``{{ form.media }}`` or through a ``