django-richtextfield


Namedjango-richtextfield JSON
Version 1.6.2 PyPI version JSON
download
home_pagehttps://github.com/jaap3/django-richtextfield
SummaryA Django model field and widget that renders a customizable WYSIWYG/rich text editor
upload_time2024-03-07 10:12:41
maintainer
docs_urlNone
authorJaap Roes
requires_python>=3.6
licenseMIT
keywords django-richtextfield djrichtextfield django wywiwyg field
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ======================
Django Rich Text Field
======================

.. image:: https://badge.fury.io/py/django-richtextfield.svg
    :target: https://pypi.python.org/pypi/django-richtextfield/
    :alt: Latest Version

.. image:: https://github.com/jaap3/django-richtextfield/actions/workflows/ci.yml/badge.svg?branch=main
    :target: https://github.com/jaap3/django-richtextfield/actions/workflows/ci.yml

A Django model field and widget that renders a customizable rich
text/WYSIWYG widget.

Works in Django's admin interface and "normal" forms.

Supports global `editor settings`_, reusable `editor profiles`_
and per `field & widget settings`_. There's built-in support for
pluggable server side `content sanitizers`_.

Tested with TinyMCE_ and CKEditor_. Designed to be easily extended to
use other editors.


Quickstart
----------

Install ``django-richtextfield`` and add it to your Django
project's ``INSTALLED_APPS``, ``django.contrib.admin`` must also be in ``INSTALLED_APPS``::

    INSTALLED_APPS = [
        'django.contrib.admin',
        ...
        'djrichtextfield'
    ]

Add the urls to the project's urlpatterns::

    path('djrichtextfield/', include('djrichtextfield.urls'))

Configure ``django-richtextfield`` in ``settings.py``::

    DJRICHTEXTFIELD_CONFIG = {
        'js': ['//cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js'],
        'init_template': 'djrichtextfield/init/tinymce.js',
        'settings': {
            'menubar': False,
            'plugins': 'link image',
            'toolbar': 'bold italic | link image | removeformat',
            'width': 700
        }
    }

Now you're ready to use the field in your models::

    from djrichtextfield.models import RichTextField

    class Post(models.Model):
        content = RichTextField()

or forms::

    from djrichtextfield.widgets import RichTextWidget

    class CommentForm(forms.ModelForm):
        content = forms.CharField(widget=RichTextWidget())


When using the editor outside of the admin make sure to include
``form.media`` in the ``<head>`` of the template::

    <head>
      ...
      {{ form.media }}
      ...
    </head>

Configuration
-------------

Define the ``DJRICHTEXTFIELD_CONFIG`` dictionary in your project settings.
This dictionary can have the following keys:

.. _conf_js:

Javascript souce(s)
^^^^^^^^^^^^^^^^^^^

``'js'``
    A list of required javascript files. These can be URLs to a CDN or paths
    relative to your ``STATIC_URL`` e.g.::

      'js': ['//cdn.ckeditor.com/4.14.0/standard/ckeditor.js']

    or::

      'js': ['path/to/editor.js', 'path/to/plugin.js']

.. _conf_css:

CSS souce(s)
^^^^^^^^^^^^

``'css'``
    A dictionary of CSS files required.
    These can be URLs to a CDN or paths relative to your ``STATIC_URL`` e.g.::

      'css': {
          'all': [
              'https://cdn.example.com/css/editor.css'
          ]
      }

    or::

      'css': {'all': ['path/to/editor.css', 'path/to/plugin.css']}


.. _conf_init_template:

Editor init template
^^^^^^^^^^^^^^^^^^^^

``'init_template'``
    Path to the `init template`_ for your editor. Currently
    ``django-richtextfield`` ships with two templates, either::

        'init_template': 'djrichtextfield/init/tinymce.js'

    or::

        'init_template': 'djrichtextfield/init/ckeditor.js'

.. _conf_settings:

Editor settings
^^^^^^^^^^^^^^^

``'settings'``
    A Python dictionary with the **default** configuration data for your
    editor e.g.::

      'settings': {  # TinyMCE
          'menubar': False,
          'plugins': 'link image',
          'toolbar': 'bold italic | link image | removeformat',
          'width': 700
      }

    or::

      'settings': {  # CKEditor
          'toolbar': [
              {'items': ['Format', '-', 'Bold', 'Italic', '-',
                         'RemoveFormat']},
              {'items': ['Link', 'Unlink', 'Image', 'Table']},
              {'items': ['Source']}
          ],
          'format_tags': 'p;h1;h2;h3',
          'width': 700
      }

.. _conf_profiles:

Editor profiles
^^^^^^^^^^^^^^^

``'profiles'``
  This is an **optional** configuration key. Profiles are "named" custom
  settings used to configure specific type of fields. You can configure
  profiles like this::

    'profiles': {
        'basic': {
            'toolbar': 'bold italic | removeformat'
        },
        'advanced': {
            'plugins': 'link image table code',
            'toolbar': 'formatselect | bold italic | removeformat |'
                       ' link unlink image table | code'
        }
    }

  .. note:: A profile is treated the same way as directly defined
            `field & widget settings`_. This means that
            profile settings are merged with the defaults!

.. _conf_sanitizer:

Content sanitizers
^^^^^^^^^^^^^^^^^^

``'sanitizer'``
    This is an **optional** configuration key. A sanitizer can be used to
    process submitted values before it is returned by the widget. By default no
    processing is performed on submitted values. You can configure a sanitizer
    either by providing a function or an importable path to a function, like
    so::

      'sanitizer': lambda value: '<h1>Title</h1>' + value

    or::

      'sanitizer': 'bleach.clean'

.. _conf_sanitizer_profiles:

``'sanitizer_profiles'``
    This is an **optional** configuration key. It is possible to override
    the default or configured sanitizer for each of the configured `profiles`_.
    For example to set a custom sanitizer for the ``advanced`` profile::

      'sanitizer_profiles': {
          'advanced': lambda value: value + 'This text has been sanitized.'
      }


Field & Widget settings
-----------------------

You can override the default settings per field::

    class CommentForm(forms.ModelForm):
        content = forms.CharField(widget=RichTextWidget())
        content.widget.field_settings = {'your': 'custom', 'settings': True}

or::

    class Post(models.Model):
        content = RichTextField(
            field_settings={'your': 'custom', 'settings': True},
            sanitizer='bleach.linkify'
        )

It's recommended to use `profiles`_, they make it easier to switch configs
or even editors on a later date. You use a profile like this::

    class CommentForm(forms.ModelForm):
        content = forms.CharField(widget=RichTextWidget(field_settings='basic'))

or::

    class Post(models.Model):
        content = RichTextField(field_settings='advanced')

.. note:: Fields always inherit the default settings, customs settings and
          profiles are merged with the defaults!


Custom init / Using another editor
----------------------------------

It should be fairly easy to use this project with another editor.
All that's required is to configure ``DJRICHTEXTFIELD_CONFIG`` to load the
right Javascript/CSS files and to create a custom `init template`_.

For example, to use jQuery based Summernote_ (lite) editor::

    DJRICHTEXTFIELD_CONFIG = {
        'js': [
            '//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js',
            '//cdnjs.cloudflare.com/ajax/libs/summernote/0.8.9/summernote-lite.js',
        ],
        'css': {
            'all': [
                '//cdnjs.cloudflare.com/ajax/libs/summernote/0.8.9/summernote-lite.css',
            ]
        },
        'init_template': 'path/to/init/summernote.js',
        'settings': {
            'followingToolbar': False,
            'minHeight': 250,
            'width': 700,
            'toolbar': [
                ['style', ['bold', 'italic', 'clear']],
            ],
        }
    }

Init template
^^^^^^^^^^^^^

The init template is a Django template (so it should be in the template and
not in the static directory). It contains a tiny bit of Javascript that's
called to initialize each editor. For example, the init template for Summernote
would like this::

    $('#' + id).summernote(settings)

The init template has the following Javascript variables available from the
outer scope:

``field``
  DOM node of the textarea to be replaced
``id``
  The ``id`` attribute of the textarea
``default_settings``
  ``DJRICHTEXTFIELD_CONFIG['settings']`` as a JS object
``custom_settings``
  The ``field_settings`` as a JS object
``settings``
    Merge of ``default_settings`` and ``custom_settings``


Handling uploads & other advanced features
------------------------------------------

``django-richtextfield`` built to be editor agnostic. This means that it's
up to you to handle file uploads, show content previews and support
other "advanced" features.


.. _Profiles: conf_profiles_
.. _TinyMCE: https://www.tinymce.com/
.. _CKEditor: https://ckeditor.com/
.. _Summernote: https://summernote.org/


History
-------

1.6.2 (2024-03-07)
^^^^^^^^^^^^^^^^^^

- Code refresh, no functional changes
- Switch CI to GitHub actions
- Test with Django 3.2 and 4.2
- Test with Python 3.8, 3.10 and 3.12
- Drop support for older Python and Django versions

1.6.1 (2021-04-14)
^^^^^^^^^^^^^^^^^^

- Support Django 3.2 (no changes necessary)
- Test with Django main (4.0)
- Use force_str instead of force_text,
  the latter is deprecated and removed in Django 4.0


1.6 (2020-05-20)
^^^^^^^^^^^^^^^^^^

* init.js no longer depends on jQuery.
  This might a backwards incompatible change for:

  - Users that have defined their own init script that dependeds on
    the ``$e`` var. This var has been replaced by ``field`` which is
    a plain DOM node instead of a jQuery object.
  - Users that depended on the implicit load of Django's bundled
    version of jQuery now have explicitly load it themselves.

* Verified TinyMCE init/config works with TinyMCE 4 and 5

* Tested and verified to work with Django 3.1

1.5.0 (2019-12-04)
^^^^^^^^^^^^^^^^^^

* Drop support for Python 2
* Drop support for Django < 2.2
* Add support for Django 3.0


1.4.0 (2019-01-31)
^^^^^^^^^^^^^^^^^^

* NOTE: This is the final release that supports Python 2!
* Add support for plugable server side content sanitizers


1.3.0 (2018-11-05)
^^^^^^^^^^^^^^^^^^

* Allow CSS files to be included by a ``RichTextWidget``


1.2.4 (2018-09-25)
^^^^^^^^^^^^^^^^^^

* Fix display issue in Django 2.1's admin interface


1.2.3 (2018-09-11)
^^^^^^^^^^^^^^^^^^

* Add support for Django 2.1


1.2.2 (2018-06-12)
^^^^^^^^^^^^^^^^^^

* Conditionally load the (un)minified version of jquery depending on ``DEBUG``
* Load jQuery before all other scripts


1.2.1 (2018-01-18)
^^^^^^^^^^^^^^^^^^

* Add ``['admin/js/vendor/jquery/jquery.min.js', 'admin/js/jquery.init.js']``
  to ``RichTextWidget.media.js``. This makes the widget usable outside of the
  admin (but still requires ``django.contrib.admin`` to be in ``INSTALLED_APPS``)
  and prevents javascript errors inside the admin in certain edge cases.


1.2 (2017-12-04)
^^^^^^^^^^^^^^^^

* Remove support for Django < 1.11
* Add support for Django 2.0


1.1 (2016-01-14)
^^^^^^^^^^^^^^^^

* Remove support for Django < 1.8
* Tested with Django 1.8 & Django 1.9

1.0.1 (2014-11-13)
^^^^^^^^^^^^^^^^^^

* Fix unicode error

1.0 (2014-09-30)
^^^^^^^^^^^^^^^^

* First release

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/jaap3/django-richtextfield",
    "name": "django-richtextfield",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": "",
    "keywords": "django-richtextfield,djrichtextfield django wywiwyg field",
    "author": "Jaap Roes",
    "author_email": "jaap.roes@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/b8/13/75336f29fc675192ed8a247025327d591898e9c7ac7df39952c2eab896b7/django-richtextfield-1.6.2.tar.gz",
    "platform": null,
    "description": "======================\nDjango Rich Text Field\n======================\n\n.. image:: https://badge.fury.io/py/django-richtextfield.svg\n    :target: https://pypi.python.org/pypi/django-richtextfield/\n    :alt: Latest Version\n\n.. image:: https://github.com/jaap3/django-richtextfield/actions/workflows/ci.yml/badge.svg?branch=main\n    :target: https://github.com/jaap3/django-richtextfield/actions/workflows/ci.yml\n\nA Django model field and widget that renders a customizable rich\ntext/WYSIWYG widget.\n\nWorks in Django's admin interface and \"normal\" forms.\n\nSupports global `editor settings`_, reusable `editor profiles`_\nand per `field & widget settings`_. There's built-in support for\npluggable server side `content sanitizers`_.\n\nTested with TinyMCE_ and CKEditor_. Designed to be easily extended to\nuse other editors.\n\n\nQuickstart\n----------\n\nInstall ``django-richtextfield`` and add it to your Django\nproject's ``INSTALLED_APPS``, ``django.contrib.admin`` must also be in ``INSTALLED_APPS``::\n\n    INSTALLED_APPS = [\n        'django.contrib.admin',\n        ...\n        'djrichtextfield'\n    ]\n\nAdd the urls to the project's urlpatterns::\n\n    path('djrichtextfield/', include('djrichtextfield.urls'))\n\nConfigure ``django-richtextfield`` in ``settings.py``::\n\n    DJRICHTEXTFIELD_CONFIG = {\n        'js': ['//cdn.tiny.cloud/1/no-api-key/tinymce/5/tinymce.min.js'],\n        'init_template': 'djrichtextfield/init/tinymce.js',\n        'settings': {\n            'menubar': False,\n            'plugins': 'link image',\n            'toolbar': 'bold italic | link image | removeformat',\n            'width': 700\n        }\n    }\n\nNow you're ready to use the field in your models::\n\n    from djrichtextfield.models import RichTextField\n\n    class Post(models.Model):\n        content = RichTextField()\n\nor forms::\n\n    from djrichtextfield.widgets import RichTextWidget\n\n    class CommentForm(forms.ModelForm):\n        content = forms.CharField(widget=RichTextWidget())\n\n\nWhen using the editor outside of the admin make sure to include\n``form.media`` in the ``<head>`` of the template::\n\n    <head>\n      ...\n      {{ form.media }}\n      ...\n    </head>\n\nConfiguration\n-------------\n\nDefine the ``DJRICHTEXTFIELD_CONFIG`` dictionary in your project settings.\nThis dictionary can have the following keys:\n\n.. _conf_js:\n\nJavascript souce(s)\n^^^^^^^^^^^^^^^^^^^\n\n``'js'``\n    A list of required javascript files. These can be URLs to a CDN or paths\n    relative to your ``STATIC_URL`` e.g.::\n\n      'js': ['//cdn.ckeditor.com/4.14.0/standard/ckeditor.js']\n\n    or::\n\n      'js': ['path/to/editor.js', 'path/to/plugin.js']\n\n.. _conf_css:\n\nCSS souce(s)\n^^^^^^^^^^^^\n\n``'css'``\n    A dictionary of CSS files required.\n    These can be URLs to a CDN or paths relative to your ``STATIC_URL`` e.g.::\n\n      'css': {\n          'all': [\n              'https://cdn.example.com/css/editor.css'\n          ]\n      }\n\n    or::\n\n      'css': {'all': ['path/to/editor.css', 'path/to/plugin.css']}\n\n\n.. _conf_init_template:\n\nEditor init template\n^^^^^^^^^^^^^^^^^^^^\n\n``'init_template'``\n    Path to the `init template`_ for your editor. Currently\n    ``django-richtextfield`` ships with two templates, either::\n\n        'init_template': 'djrichtextfield/init/tinymce.js'\n\n    or::\n\n        'init_template': 'djrichtextfield/init/ckeditor.js'\n\n.. _conf_settings:\n\nEditor settings\n^^^^^^^^^^^^^^^\n\n``'settings'``\n    A Python dictionary with the **default** configuration data for your\n    editor e.g.::\n\n      'settings': {  # TinyMCE\n          'menubar': False,\n          'plugins': 'link image',\n          'toolbar': 'bold italic | link image | removeformat',\n          'width': 700\n      }\n\n    or::\n\n      'settings': {  # CKEditor\n          'toolbar': [\n              {'items': ['Format', '-', 'Bold', 'Italic', '-',\n                         'RemoveFormat']},\n              {'items': ['Link', 'Unlink', 'Image', 'Table']},\n              {'items': ['Source']}\n          ],\n          'format_tags': 'p;h1;h2;h3',\n          'width': 700\n      }\n\n.. _conf_profiles:\n\nEditor profiles\n^^^^^^^^^^^^^^^\n\n``'profiles'``\n  This is an **optional** configuration key. Profiles are \"named\" custom\n  settings used to configure specific type of fields. You can configure\n  profiles like this::\n\n    'profiles': {\n        'basic': {\n            'toolbar': 'bold italic | removeformat'\n        },\n        'advanced': {\n            'plugins': 'link image table code',\n            'toolbar': 'formatselect | bold italic | removeformat |'\n                       ' link unlink image table | code'\n        }\n    }\n\n  .. note:: A profile is treated the same way as directly defined\n            `field & widget settings`_. This means that\n            profile settings are merged with the defaults!\n\n.. _conf_sanitizer:\n\nContent sanitizers\n^^^^^^^^^^^^^^^^^^\n\n``'sanitizer'``\n    This is an **optional** configuration key. A sanitizer can be used to\n    process submitted values before it is returned by the widget. By default no\n    processing is performed on submitted values. You can configure a sanitizer\n    either by providing a function or an importable path to a function, like\n    so::\n\n      'sanitizer': lambda value: '<h1>Title</h1>' + value\n\n    or::\n\n      'sanitizer': 'bleach.clean'\n\n.. _conf_sanitizer_profiles:\n\n``'sanitizer_profiles'``\n    This is an **optional** configuration key. It is possible to override\n    the default or configured sanitizer for each of the configured `profiles`_.\n    For example to set a custom sanitizer for the ``advanced`` profile::\n\n      'sanitizer_profiles': {\n          'advanced': lambda value: value + 'This text has been sanitized.'\n      }\n\n\nField & Widget settings\n-----------------------\n\nYou can override the default settings per field::\n\n    class CommentForm(forms.ModelForm):\n        content = forms.CharField(widget=RichTextWidget())\n        content.widget.field_settings = {'your': 'custom', 'settings': True}\n\nor::\n\n    class Post(models.Model):\n        content = RichTextField(\n            field_settings={'your': 'custom', 'settings': True},\n            sanitizer='bleach.linkify'\n        )\n\nIt's recommended to use `profiles`_, they make it easier to switch configs\nor even editors on a later date. You use a profile like this::\n\n    class CommentForm(forms.ModelForm):\n        content = forms.CharField(widget=RichTextWidget(field_settings='basic'))\n\nor::\n\n    class Post(models.Model):\n        content = RichTextField(field_settings='advanced')\n\n.. note:: Fields always inherit the default settings, customs settings and\n          profiles are merged with the defaults!\n\n\nCustom init / Using another editor\n----------------------------------\n\nIt should be fairly easy to use this project with another editor.\nAll that's required is to configure ``DJRICHTEXTFIELD_CONFIG`` to load the\nright Javascript/CSS files and to create a custom `init template`_.\n\nFor example, to use jQuery based Summernote_ (lite) editor::\n\n    DJRICHTEXTFIELD_CONFIG = {\n        'js': [\n            '//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js',\n            '//cdnjs.cloudflare.com/ajax/libs/summernote/0.8.9/summernote-lite.js',\n        ],\n        'css': {\n            'all': [\n                '//cdnjs.cloudflare.com/ajax/libs/summernote/0.8.9/summernote-lite.css',\n            ]\n        },\n        'init_template': 'path/to/init/summernote.js',\n        'settings': {\n            'followingToolbar': False,\n            'minHeight': 250,\n            'width': 700,\n            'toolbar': [\n                ['style', ['bold', 'italic', 'clear']],\n            ],\n        }\n    }\n\nInit template\n^^^^^^^^^^^^^\n\nThe init template is a Django template (so it should be in the template and\nnot in the static directory). It contains a tiny bit of Javascript that's\ncalled to initialize each editor. For example, the init template for Summernote\nwould like this::\n\n    $('#' + id).summernote(settings)\n\nThe init template has the following Javascript variables available from the\nouter scope:\n\n``field``\n  DOM node of the textarea to be replaced\n``id``\n  The ``id`` attribute of the textarea\n``default_settings``\n  ``DJRICHTEXTFIELD_CONFIG['settings']`` as a JS object\n``custom_settings``\n  The ``field_settings`` as a JS object\n``settings``\n    Merge of ``default_settings`` and ``custom_settings``\n\n\nHandling uploads & other advanced features\n------------------------------------------\n\n``django-richtextfield`` built to be editor agnostic. This means that it's\nup to you to handle file uploads, show content previews and support\nother \"advanced\" features.\n\n\n.. _Profiles: conf_profiles_\n.. _TinyMCE: https://www.tinymce.com/\n.. _CKEditor: https://ckeditor.com/\n.. _Summernote: https://summernote.org/\n\n\nHistory\n-------\n\n1.6.2 (2024-03-07)\n^^^^^^^^^^^^^^^^^^\n\n- Code refresh, no functional changes\n- Switch CI to GitHub actions\n- Test with Django 3.2 and 4.2\n- Test with Python 3.8, 3.10 and 3.12\n- Drop support for older Python and Django versions\n\n1.6.1 (2021-04-14)\n^^^^^^^^^^^^^^^^^^\n\n- Support Django 3.2 (no changes necessary)\n- Test with Django main (4.0)\n- Use force_str instead of force_text,\n  the latter is deprecated and removed in Django 4.0\n\n\n1.6 (2020-05-20)\n^^^^^^^^^^^^^^^^^^\n\n* init.js no longer depends on jQuery.\n  This might a backwards incompatible change for:\n\n  - Users that have defined their own init script that dependeds on\n    the ``$e`` var. This var has been replaced by ``field`` which is\n    a plain DOM node instead of a jQuery object.\n  - Users that depended on the implicit load of Django's bundled\n    version of jQuery now have explicitly load it themselves.\n\n* Verified TinyMCE init/config works with TinyMCE 4 and 5\n\n* Tested and verified to work with Django 3.1\n\n1.5.0 (2019-12-04)\n^^^^^^^^^^^^^^^^^^\n\n* Drop support for Python 2\n* Drop support for Django < 2.2\n* Add support for Django 3.0\n\n\n1.4.0 (2019-01-31)\n^^^^^^^^^^^^^^^^^^\n\n* NOTE: This is the final release that supports Python 2!\n* Add support for plugable server side content sanitizers\n\n\n1.3.0 (2018-11-05)\n^^^^^^^^^^^^^^^^^^\n\n* Allow CSS files to be included by a ``RichTextWidget``\n\n\n1.2.4 (2018-09-25)\n^^^^^^^^^^^^^^^^^^\n\n* Fix display issue in Django 2.1's admin interface\n\n\n1.2.3 (2018-09-11)\n^^^^^^^^^^^^^^^^^^\n\n* Add support for Django 2.1\n\n\n1.2.2 (2018-06-12)\n^^^^^^^^^^^^^^^^^^\n\n* Conditionally load the (un)minified version of jquery depending on ``DEBUG``\n* Load jQuery before all other scripts\n\n\n1.2.1 (2018-01-18)\n^^^^^^^^^^^^^^^^^^\n\n* Add ``['admin/js/vendor/jquery/jquery.min.js', 'admin/js/jquery.init.js']``\n  to ``RichTextWidget.media.js``. This makes the widget usable outside of the\n  admin (but still requires ``django.contrib.admin`` to be in ``INSTALLED_APPS``)\n  and prevents javascript errors inside the admin in certain edge cases.\n\n\n1.2 (2017-12-04)\n^^^^^^^^^^^^^^^^\n\n* Remove support for Django < 1.11\n* Add support for Django 2.0\n\n\n1.1 (2016-01-14)\n^^^^^^^^^^^^^^^^\n\n* Remove support for Django < 1.8\n* Tested with Django 1.8 & Django 1.9\n\n1.0.1 (2014-11-13)\n^^^^^^^^^^^^^^^^^^\n\n* Fix unicode error\n\n1.0 (2014-09-30)\n^^^^^^^^^^^^^^^^\n\n* First release\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A Django model field and widget that renders a customizable WYSIWYG/rich text editor",
    "version": "1.6.2",
    "project_urls": {
        "Homepage": "https://github.com/jaap3/django-richtextfield"
    },
    "split_keywords": [
        "django-richtextfield",
        "djrichtextfield django wywiwyg field"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4ddc96a1f25ff2270c807c0e3ad242ea96f40561ad10c066d1a1741367e188f4",
                "md5": "7af5fd71ca7d891f3a20a1602d6b8cb0",
                "sha256": "56b7404f52ae9a313bcbdb4c47aea16e5fa26a48539c1221e3de39186ee839bf"
            },
            "downloads": -1,
            "filename": "django_richtextfield-1.6.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "7af5fd71ca7d891f3a20a1602d6b8cb0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 11574,
            "upload_time": "2024-03-07T10:12:38",
            "upload_time_iso_8601": "2024-03-07T10:12:38.340819Z",
            "url": "https://files.pythonhosted.org/packages/4d/dc/96a1f25ff2270c807c0e3ad242ea96f40561ad10c066d1a1741367e188f4/django_richtextfield-1.6.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b81375336f29fc675192ed8a247025327d591898e9c7ac7df39952c2eab896b7",
                "md5": "9d81f96dce807ac02adec03cb3f0ad14",
                "sha256": "7efe9c397437922ed6ca3071b7a54db5bf8ebfa4ced7172dfb0b7472df66b0c4"
            },
            "downloads": -1,
            "filename": "django-richtextfield-1.6.2.tar.gz",
            "has_sig": false,
            "md5_digest": "9d81f96dce807ac02adec03cb3f0ad14",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 16570,
            "upload_time": "2024-03-07T10:12:41",
            "upload_time_iso_8601": "2024-03-07T10:12:41.137883Z",
            "url": "https://files.pythonhosted.org/packages/b8/13/75336f29fc675192ed8a247025327d591898e9c7ac7df39952c2eab896b7/django-richtextfield-1.6.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-07 10:12:41",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jaap3",
    "github_project": "django-richtextfield",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "django-richtextfield"
}
        
Elapsed time: 0.24660s