Simply integrate Summernote editor with Django project.

Overview

django-summernote

Build Status Coverage Status

Summernote is a simple WYSIWYG editor.

django-summernote allows you to embed Summernote into Django very handy. Support admin mixins and widgets.

django-summernote

SETUP

  1. Install django-summernote to your python environment.

    pip install django-summernote
    
  2. Add django_summernote to INSTALLED_APPS in settings.py.

    INSTALLED_APPS += ('django_summernote', )
    
  3. Add django_summernote.urls to urls.py.

    • For Django 1.x

      urlpatterns = [
          ...
          url(r'^summernote/', include('django_summernote.urls')),
          ...
      ]
      
    • For Django 2.x

      from django.urls import include
      # ...
      urlpatterns = [
          ...
          path('summernote/', include('django_summernote.urls')),
          ...
      ]
      
  4. Be sure to set proper MEDIA_URL for attachments.

    • The following is an example test code:

      MEDIA_URL = '/media/'
      MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
      
    • When debug option is enabled(DEBUG=True), DO NOT forget to add urlpatterns as shown below:

      from django.conf import settings
      from django.conf.urls.static import static
      
      if settings.DEBUG:
          urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
      
    • Please, read the official v3.0 documentation for more details on file uploads.

  5. Run database migration for preparing attachment model.

    python manage.py migrate
    

USAGE

Django admin site

Apply summernote to all TextField in model

In admin.py,

from django_summernote.admin import SummernoteModelAdmin
from .models import SomeModel

# Apply summernote to all TextField in model.
class SomeModelAdmin(SummernoteModelAdmin):  # instead of ModelAdmin
    summernote_fields = '__all__'

admin.site.register(SomeModel, SomeModelAdmin)

Apply summernote only to specific TextField in model

Although Post model has several TextField, only content field will have SummernoteWidget.

In admin.py,

from django_summernote.admin import SummernoteModelAdmin
from .models import Post

class PostAdmin(SummernoteModelAdmin):
    summernote_fields = ('content',)

admin.site.register(Post, PostAdmin)

Form

In forms,

from django_summernote.widgets import SummernoteWidget, SummernoteInplaceWidget

# Apply summernote to specific fields.
class SomeForm(forms.Form):
    foo = forms.CharField(widget=SummernoteWidget())  # instead of forms.Textarea

# If you don't like <iframe>, then use inplace widget
# Or if you're using django-crispy-forms, please use this.
class AnotherForm(forms.Form):
    bar = forms.CharField(widget=SummernoteInplaceWidget())

And for ModelForm,

class FormFromSomeModel(forms.ModelForm):
    class Meta:
        model = SomeModel
        widgets = {
            'foo': SummernoteWidget(),
            'bar': SummernoteInplaceWidget(),
        }

Last, please don't forget to use safe templatetag while displaying in templates.

{{ foobar|safe }}

Warning: Please mind, that the widget does not provide any escaping. If you expose the widget to external users without taking care of this, it could potentially lead to an injection vulnerability. Therefore you can use the SummernoteTextFormField or SummernoteTextField, which escape all harmful tags through mozilla's package bleach:

In forms,

from django_summernote.fields import SummernoteTextFormField, SummernoteTextField

class SomeForm(forms.Form):
    foo = SummernoteTextFormField()

And for ModelForm,

class FormForSomeModel(forms.ModelForm):
    foo = SummernoteTextField()

THEMES

django-summernote is served with Bootstrap3 by default, but you can choose other options. You can change the theme by setting SUMMERNOTE_THEME = '<theme_name>' in settings.py.

SUMMERNOTE_THEME accepts the following values:

  • bs3: Bootstrap3 theme
  • bs4: Bootstrap4 theme
  • lite: Lite UI theme (without Bootstrap)

In settings.py

SUMMERNOTE_THEME = 'bs4'  # Show summernote with Bootstrap4

OPTIONS

Support customization via settings. Put SUMMERNOTE_CONFIG into your settings file.

In settings.py,

SUMMERNOTE_CONFIG = {
    # Using SummernoteWidget - iframe mode, default
    'iframe': True,

    # Or, you can set it to `False` to use SummernoteInplaceWidget by default - no iframe mode
    # In this case, you have to load Bootstrap/jQuery sources and dependencies manually.
    # Use this when you're already using Bootstrap/jQuery based themes.
    'iframe': False,

    # You can put custom Summernote settings
    'summernote': {
        # As an example, using Summernote Air-mode
        'airMode': False,

        # Change editor size
        'width': '100%',
        'height': '480',

        # Use proper language setting automatically (default)
        'lang': None,

        # Toolbar customization
        # https://summernote.org/deep-dive/#custom-toolbar-popover
        'toolbar': [
            ['style', ['style']],
            ['font', ['bold', 'underline', 'clear']],
            ['fontname', ['fontname']],
            ['color', ['color']],
            ['para', ['ul', 'ol', 'paragraph']],
            ['table', ['table']],
            ['insert', ['link', 'picture', 'video']],
            ['view', ['fullscreen', 'codeview', 'help']],
        ],

        # Or, explicitly set language/locale for editor
        'lang': 'ko-KR',
        ...

        # You can also add custom settings for external plugins
        'print': {
            'stylesheetUrl': '/some_static_folder/printable.css',
        },
        'codemirror': {
            'mode': 'htmlmixed',
            'lineNumbers': 'true',
            # You have to include theme file in 'css' or 'css_for_inplace' before using it.
            'theme': 'monokai',
        },
    },

    # Require users to be authenticated for uploading attachments.
    'attachment_require_authentication': True,

    # Set `upload_to` function for attachments.
    'attachment_upload_to': my_custom_upload_to_func(),

    # Set custom storage class for attachments.
    'attachment_storage_class': 'my.custom.storage.class.name',

    # Set custom model for attachments (default: 'django_summernote.Attachment')
    'attachment_model': 'my.custom.attachment.model', # must inherit 'django_summernote.AbstractAttachment'

    # You can completely disable the attachment feature.
    'disable_attachment': False,

    # Set to `True` to return attachment paths in absolute URIs.
    'attachment_absolute_uri': False,

    # test_func in summernote upload view. (Allow upload images only when user passes the test)
    # https://docs.djangoproject.com/en/2.2/topics/auth/default/#django.contrib.auth.mixins.UserPassesTestMixin
    ```
    def example_test_func(request):
        return request.user.groups.filter(name='group_name').exists()
    ```
    'test_func_upload_view': example_test_func,

    # You can add custom css/js for SummernoteWidget.
    'css': (
    ),
    'js': (
    ),

    # You can also add custom css/js for SummernoteInplaceWidget.
    # !!! Be sure to put {{ form.media }} in template before initiate summernote.
    'css_for_inplace': (
    ),
    'js_for_inplace': (
    ),

    # Codemirror as codeview
    # If any codemirror settings are defined, it will include codemirror files automatically.
    'css': (
        '//cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/theme/monokai.min.css',
    ),

    # Lazy initialization
    # If you want to initialize summernote at the bottom of page, set this as True
    # and call `initSummernote()` on your page.
    'lazy': True,

    # To use external plugins,
    # Include them within `css` and `js`.
    'js': {
        '/some_static_folder/summernote-ext-print.js',
        '//somewhere_in_internet/summernote-plugin-name.js',
    },
}

You can style the editor via widget's attributes. These adhoc styling will override settings from SUMMERNOTE_CONFIG.

# Apply adhoc style via attributes
class SomeForm(forms.Form):
    foo = forms.CharField(widget=SummernoteWidget(attrs={'summernote': {'width': '50%', 'height': '400px'}}))

You can also pass additional parameters to custom Attachment model by adding attributes to SummernoteWidget or SummernoteInplaceWidget, any attribute starting with data- will be pass to the save(...) method of custom Attachment model as **kwargs.

# Pass additional parameters to Attachment via attributes
class SomeForm(forms.Form):
    foo = forms.CharField(widget=SummernoteWidget(attrs={'data-user-id': 123456, 'data-device': 'iphone'}))

TEST

Run tox. If you don't have it, just pip install tox

You can also run test with only specified targets.

$ tox -e py35-dj111, py38-dj301

LIMITATIONS

django-summernote does currently not support upload of non-image files.

LICENSE

django-summernote is distributed under MIT license and proudly served by great contributors.

Comments
  • Editor not loading for inline TextField

    Editor not loading for inline TextField

    Summernote is not loading for an inline model admin.

    I have an inline model:

    class ModelAInline(admin.StackedInline, SummernoteInlineModelAdmin):
        model = ModelA
        extra = 1
    
    class ModelBAdmin(SummernoteModelAdmin):
        ...
        inlines = [ModelAInline]
    
    admin.site.register(ModelB, ModelBAdmin)
    

    ModelB has a TextField which is loading with summernote widget correctly. ModelA has a TextField but it's not loading correctly, it just displays a white section, iframe doesn't seem to be loading.

    I found the following JS warnings on console:

    ReferenceError: content_iframe is not defined
    ReferenceError: __prefix__ is not defined
    

    Both JS errors point to line "32 > eval:1", referring, I think, to:

    eval("settings = window.parent.settings_id_modela_set-0-content/ line 32 &gt; eval_iframe;");
    

    I'am using version 0.5.12

    bug 
    opened by oromero 17
  • Server Error (500) with DEBUG=False

    Server Error (500) with DEBUG=False

    This is my first post to GitHub, so I am hopeful that I am submitting this information in the proper manner.

    I could not find this in documentation anywhere, but ran into an issue and a solution. I recommend updating the documentation for this solution.

    I setup Summernote in my Django3 Project. Everything looked perfect. I deployed to Heroku, but then could not access anything where Summernote was enabled. I was getting a Server Error (500). After checking quite a few different things, I realized the difference was that in my push to Heroku, my DEBUG is set to False. I changed this same setting in my dev environment and sure enough, same result.

    After hours of trying to track down the problem, I decided to move on for the time being and install a different Rich Text Editor. It was during the installation of that other editor where they had one line for their documentation. python manage.py collectstatic

    I realized that some static files had caused me problems previously, causing a 500 error when Debug was set to False. I figured, why not give this a try.

    Once I ran this, Summernote started working without issue.

    I pushed to Heroku, and everything is working as expected. Not a bug in the application, just recommending adding one line to the documentation.

    Thank you.

    opened by simpleittools 16
  • Not saving content while in code view?

    Not saving content while in code view?

    I'm using django-summernote 0.8.3 installed with mezzanine 4.1.0. After putting it in installed apps and adding a config to my settings.py, I just replaced all instances of admin.ModelAdmin in Mezzanine with SummernoteModelAdmin (there were only about 3 instances), and it seems to be working well.

    I use summernote to add html in a good syntax-colored, tab-preserving environment for pages. I noticed that if I edit the HTML and then press "Save" before turning off Code View, that my changes don't get loaded. Is there an easy fix to this?

    bug 
    opened by geoffrey-eisenbarth 14
  • django-summernote breaks after upgrading to Django 3

    django-summernote breaks after upgrading to Django 3

    After upgrading my app to Django 3 I get the following error:

    Traceback (most recent call last):
      File "manage.py", line 23, in <module>
        execute_from_command_line(sys.argv)
      File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
        utility.execute()
      File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 377, in execute
        django.setup()
      File "/usr/local/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
        apps.populate(settings.INSTALLED_APPS)
      File "/usr/local/lib/python3.7/site-packages/django/apps/registry.py", line 114, in populate
        app_config.import_models()
      File "/usr/local/lib/python3.7/site-packages/django/apps/config.py", line 211, in import_models
        self.models_module = import_module(models_module_name)
      File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
      File "<frozen importlib._bootstrap>", line 983, in _find_and_load
      File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 728, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "/source/lib/models.py", line 8, in <module>
        from django_summernote.widgets import SummernoteInplaceWidget
      File "/usr/local/lib/python3.7/site-packages/django_summernote/widgets.py", line 4, in <module>
        from django.contrib.staticfiles.templatetags.staticfiles import static
    ModuleNotFoundError: No module named 'django.contrib.staticfiles.templatetags'
    

    regarding to https://docs.djangoproject.com/en/dev/internals/deprecation/ that module was removed.

    After investigation of the Django sources replacing should be easy:

    # django 2.x django\contrib\staticfiles\templatetags\staticfiles.py
    def static(path):
        warnings.warn(
            'django.contrib.staticfiles.templatetags.static() is deprecated in '
            'favor of django.templatetags.static.static().',
            RemovedInDjango30Warning,
            stacklevel=2,
        )
        return _static(path)
    

    I think the problem may be that the package at https://pypi.org/project/django-summernote/ is outdated. It dates from January 2019. As the problem ist already fixed in the summernote sources only a new package needs to get published.

    opened by mpibpc-mroose 13
  • Forbidden <CSRF token missing or incorrect>:/ summernote/load_attachment/

    Forbidden :/ summernote/load_attachment/

    Hi I am getting this error when I try to load an image in the editor when I am using SummernoteInplaceWidget. The full error is:

    Forbidden :/ summernote/load_attachment/ POST /summernote/upload_attachment/ HTTP/1.1 403 2502

    When I use SummernoteWidget it works fine, but I can not resize the editor, but with SummernoteInplaceWidget I can resize it, but when I upload an image it show that error in console, and the image is not shown in the editor.

    I just want to say, that my header_photo is a ImageField and it works perfect, as SummernoteWidget does.

    my forms.py file:

    class CreatePostForm(forms.ModelForm):
    	class Meta:
    		model = Post
    		fields = ('title', 'status', 'header_photo', 'body')
    
    		widgets = {
                #'body': SummernoteWidget(),
                'body': SummernoteInplaceWidget(),
            }
    

    body is:

    body = models.CharField(max_length=5000, 
                                   blank=True, 
                                   unique=False, 
                                   null=True)
    

    settings.py file:

    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
        #'/var/www/static/',
    ]
    
    STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static_cdn')
    
    MEDIA_URL = '/media1/'
    MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'media_cdn')
    
    
    SUMMERNOTE_CONFIG = {
        # Using SummernoteWidget - iframe mode
        'iframe': False,  # or set False to use SummernoteInplaceWidget - no iframe mode
    
        # Using Summernote Air-mode
        'airMode': False,
    
        # Use native HTML tags (`<b>`, `<i>`, ...) instead of style attributes
        # (Firefox, Chrome only)
        'styleWithTags': True,
    
        # Set text direction : 'left to right' is default.
        'direction': 'ltr',
    
        # Change editor size
        'width': '100%',
    
        # Max length
        'max-length': 5000,
    }
    

    and my form is:

    <form class="form-horizontal" method="post" action="." enctype="multipart/form-data">
                        {% csrf_token %}
                        <fieldset>
                            <div class="text-center" style="margin-bottom: 20px">
                                <h2 style="color: #c1b4b4;">Upload the header picture for your post</h2>
                                {% render_field post_form.header_photo class="form-control" style="background-color: #E8E8E8" %}
                            </div>
    
                            <div class="form-inline">
                                <div class="form-group" style="margin-bottom: 20px;">
                                    {% render_field post_form.title class="form-control" placeholder="Blog title" %}
                                    {% render_field post_form.status class="form-control" %}
                                </div>
                            </div>
                            {{ post_form.media }}
                            {{ post_form.body }}
                            <hr>
                            <div class="control-group">
                                <!-- Button -->
                                <div class="controls" style="margin-bottom: 20px">
                                    <button class="btn btn-lg btn-success" style="min-width: 300px">Save</button>
                                </div>
                            </div>
                            {% if redirect_field_value %}
                            <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
                            {% endif %}
                         </fieldset>
                    </form>
    

    If you need I can upload any of my files. Thank you for your help

    bug 
    opened by predragfalcic 13
  • Codemirror settings dont work in SummernoteInplaceWidget.

    Codemirror settings dont work in SummernoteInplaceWidget.

    In my form I use SummernoteInplaceWidget.

    I have 2 problems:

    1. I notice that when I open form bold button in toolbar is always active. I notice this bug in Firefox Mozilla but in other browsers it works fine. Also when I click to text which is without any style bold button became active. I notice this bug only in Firefox Mozilla. What do you this about that? default

    2. Why next my settings dont change codemirror? I want to add colors and line numbers. What can you advice to me? Where is my mistake?

    I want codemirror like this: default

    settings.py:

    SUMMERNOTE_CONFIG = {
       'css': {
            '//cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/theme/monokai.min.css',
        },
       'codemirror': {
            'mode': 'htmlmixed',
            'lineNumbers': 'true',
            'theme': 'monokai',
        },
    }
    

    I load static files in template cause when I tried to set static files in settings.py file it raise error. CSS:

    <link rel="stylesheet" type="text/css" href="{% static "summernote/summernote.css" %}">
    <link rel="stylesheet" type="text/css" href="{% static "summernote/django_summernote.css" %}">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/3.20.0/codemirror.css">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/3.20.0/theme/monokai.css">
    

    JS:

    <script src="{% static 'summernote/jquery.ui.widget.js'%}"></script>
    <script src="{% static 'summernote/jquery.iframe-transport.js'%}"></script>
    <script src="{% static 'summernote/jquery.fileupload.js'%}"></script>
    <script src="{% static 'summernote/summernote.min.js'%}"></script>
    <script src="{% static 'summernote/ResizeSensor.js'%}"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/3.20.0/codemirror.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/3.20.0/mode/xml/xml.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/2.36.0/formatting.js"></script>
    

    Right now I have this: 1

    opened by nurzhannogerbek 9
  • fix multiplying '/static/' prefix

    fix multiplying '/static/' prefix

    the SummernoteInplaceWidget new media property introduced a regression where after successive reloads the widget stops working as the static files 'get lost'. the more reloads, the more static it gets :}

    <script type="text/javascript" src="/static/static/static/summernote/jquery.ui.widget.js"></script>
    <script type="text/javascript" src="/static/static/static/summernote/jquery.iframe-transport.js"></script>
    <script type="text/javascript" src="/static/static/static/summernote/jquery.fileupload.js"></script>
    <script type="text/javascript" src="/static/static/static/summernote/summernote.min.js"></script>
    <script type="text/javascript" src="/static/static/static/summernote/ResizeSensor.js"></script>
    

    using static() seems to be unnecessary:

    To find the appropriate prefix to use, Django will check if the STATIC_URL setting is not None and automatically fall back to using MEDIA_URL.

    i think that there is no advantage here to use the @property over the simpler Media class but in the patch i did not change it back.

    opened by minusf 9
  • Problem when using static file management with django + s3

    Problem when using static file management with django + s3

    hello.

    When doing staticfile management with django + s3 Django_summernote/templates/django_summernote/widget_iframe_editor.html : Problem with static tag in line 27.

    27 $.getScript('{% static "django_summernote/lang/summernote-" %}' + settings.lang + '.min.js');

    {% static "django_summernote/lang/summernote-" %} rendering => "https://{{s3-url}}/static/django_summernote/lang/summernote-" is not found error.

    The file 'django_summernote/lang/summernote-' could not be found with <xx.s3ext.StaticS3BotoStorage object at xxxx>.

    Due to this issue, we have temporarily created a "summernote-" file on s3.

    any ideas? help me.

    opened by jamieChae 9
  • drop-down menus isn't working

    drop-down menus isn't working

    django-summernote works, but drop-down menus isn't working. Style button and Line height buttons are virible, but doesn't roll out.

    Simple buttons are work well.

    Options taken from your readme.md. https://github.com/lqez/django-summernote#options 2014-08-29 12_02_28-example com _ edit org

    Example project already use the bootstrap - may be, some conflict?

    opened by yn-coder 9
  • Django 3.2 compatibility

    Django 3.2 compatibility

    Using the latest summernote (django-summernote==0.8.11.6) version results in some warnings:

    /usr/local/lib/python3.9/site-packages/django_summernote/urls.py:8: RemovedInDjango40Warning: django.conf.urls.url() is deprecated in favor of django.urls.re_path()
    

    and

    /usr/local/lib/python3.9/site-packages/django/apps/registry.py:91: RemovedInDjango41Warning: 'django_summernote' defines default_app_config = 'django_summernote.apps.DjangoSummernoteConfig'. Django now detects this configuration automatically. You can remove default_app_config.
    
    opened by BSVogler 8
  • Upgrade v0.8.7 to v0.8.8.5 FullScreen only show half height of window.

    Upgrade v0.8.7 to v0.8.8.5 FullScreen only show half height of window.

    I upgrade my Django from v1.11.5 to Django2.0,so i upgrade DjangoSummernote from v0.8.7 to 0.8.8.5.After upgrade i find full-screen not work like before.In v0.8.7 full-screen will resize SummernoteInplaceWidget to full screen,but in v0.8.8.5 SummernoteInplaceWidget only resize to about half of screen. 0.8.8.5: before full-screen after full-screen

    opened by yinkh 8
  • error when insert picture

    error when insert picture

    Internal Server Error: /summernote/upload_attachment/ Traceback (most recent call last): File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django/views/generic/base.py", line 103, in view return self.dispatch(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django/utils/decorators.py", line 46, in _wrapper return bound_method(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django/views/decorators/clickjacking.py", line 36, in wrapped_view resp = view_func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django_summernote/views.py", line 67, in dispatch return super(SummernoteUploadAttachment, self).dispatch(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django/contrib/auth/mixins.py", line 135, in dispatch return super().dispatch(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django/views/generic/base.py", line 142, in dispatch return handler(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django_summernote/views.py", line 144, in post attachment.save(**kwargs) File "/home/nc/miniconda3/envs/django4.1/lib/python3.11/site-packages/django_summernote/models.py", line 22, in save super().save(*args, **kwargs) TypeError: Model.save() got an unexpected keyword argument 'gramm'

    opened by xuanblo 0
  • Why my src attribute ignored?

    Why my src attribute ignored?

    I installed django-summernote and followed all setup, however when I upload image and post it with text, img tag doesn't have src attribute.

    In db table, result is appeared like this,

     id |                 text
    ----+-------------------------------
      1 | <p>This is image.</p><p><br></p><img style="">
    

    I try to find solution. The reason was discovered in SummernoteTextFormField. When field saves data, field will run bleach.clean(). bleach will remove html tags, attributes, other things by settings what specified in settings.py So I open settings.py and found that there is no src attribute. After I wrote src in ATTRIBUTES, uploading image is successfully works.

     id |                                                               text                                                                
    ----+-----------------------------------------------------------------------------------------------------------------------------------
      1 |<p>This is image.</p><p><br></p><img src="http://127.0.0.1:8000/media/django-summernote/2022-10-07/b11642da-88a4-41c1-b509-b94a49371ad1.png" style="">
    

    I think this isn't good solution to avoid XSS. There must be reason why src attributes doesn't exist in settings.ATTRIBUTES.

    Before solve this problem, I got unexpected keyword argument error, #477. So I installed bleach-4.1.0. Is this cause above error?

    update: I solved this problem with below codes in project settings.py.

    from django_summernote.settings import ATTRIBUTES
    
    
    ATTRIBUTES["*"] += ["src",]
    
    opened by 10cheon00 0
  • docs: fix simple typo, attachement -> attachment

    docs: fix simple typo, attachement -> attachment

    There is a small typo in django_summernote/test_django_summernote.py.

    Should read attachment rather than attachement.

    Semi-automated pull request generated by https://github.com/timgates42/meticulous/blob/master/docs/NOTE.md

    opened by timgates42 0
  • Other boostrap theme not working correctly SUMMERNOTE_THEME = 'bs5'

    Other boostrap theme not working correctly SUMMERNOTE_THEME = 'bs5'

    With summernote 0.8.20, with in settings.py SUMMERNOTE_THEME = 'bs5', the widget is not working, at least in admin: What is looks like with default setting: image With `SUMMERNOTE_THEME = 'bs5': image

    The buttons, for example to select title and subtiles, are not working, neither the code formatting. There is also the code formatting issue with `SUMMERNOTE_THEME = 'bs4'.

    opened by Guilouf 1
Releases(0.8.19.0)
  • 0.8.19.0(Oct 14, 2021)

    Thank you to all contributors and users of django-summernote.

    • #405: Set X-Frame-Options setting on a per-view basis (@czlee)

    • #396: HTML escaping (@campfireman)

    • Bump Summernote to 0.8.19

    • Drop support for Python 2

    • Drop support for outdated Django versions

    And also thanks to @ulgens, @ncampuzano, @aathikahamed, and other contributors.

    Source code(tar.gz)
    Source code(zip)
  • 0.8.11.6(Dec 22, 2019)

  • 0.8.11.5(Dec 19, 2019)

    • Fix crispy-forms issue with SummernoteInplaceWidget (@wuuuduu)
    • Security fixes and CustomUserPassesTestMixin in SummernoteUploadAttachment view (@wuuuduu)
    • Update Travis / Tox settings for the latest Django and Python versions (@lqez)
    • Add test targets for Django 3.0+ (@lqez)
    • Replace test runner with pytest (@lqez)
    Source code(tar.gz)
    Source code(zip)
  • 0.8.11.4(Jan 4, 2019)

  • 0.8.11.1(Dec 10, 2018)

  • 0.8.11.0(Dec 10, 2018)

    • Update Summernote to 0.8.11
    • Fix import behaviour (thanks to Jorge Klemm)
    • Fix onBlurCodeview to use Summernote callback
    • Remove warning by removing regex at path() (thanks to Ant Somers)
    • Add Django 2.0 usage on README (thanks to Ant Somers)
    • Make test suite pass on Django master branch (thanks to Claude Paroz)
    • Fix widget rendering repeatly (thanks to Andrew Cordery)
    Source code(tar.gz)
    Source code(zip)
  • 0.8.10.0(Sep 1, 2018)

  • 0.8.8.8(Aug 13, 2018)

  • 0.8.8.7(May 9, 2018)

  • 0.8.8.6(Feb 8, 2018)

    • Remove duplicated codes into a mixin
    • Add a sample model for testing admin page manually
    • Add .flake8 setting
    • Rename summer_note to summernote
    • Changing the language loading to be synchronous
    • View import path fix
    • Change class-based view from function-based view
    • Add summernote_fields to control which fields will use summernote in admin.
    • Fix SummernoteInplaceWidget full screen not work bug.
    • Update latest summernote options for __summernote_options__
    • Fixes ResizeSensor.js: TypeError: window.getComputedStyle(...) is null

    Thank you all contributors!

    Source code(tar.gz)
    Source code(zip)
  • 0.8.8.5(Dec 11, 2017)

  • 0.8.8.4(Nov 23, 2017)

  • 0.8.8.3(Nov 21, 2017)

    • Allow user can add external plugin settings via dict.
    • Added check summernote language is not en-US when adding i18n script #236 (#237)
    • Fix the type of help_text in migration 0002 (#229)
    • Rename static directory (#241)
    • Form assets media as a dynamic property (#239)
    • Add some missing commas for SUMMERNOTE_CONFIG in README (#243)

    Thank you all, pals!

    Source code(tar.gz)
    Source code(zip)
Owner
Summernote
Done is better than perfect
Summernote
django-quill-editor makes Quill.js easy to use on Django Forms and admin sites

django-quill-editor django-quill-editor makes Quill.js easy to use on Django Forms and admin sites No configuration required for static files! The ent

lhy 139 Dec 5, 2022
Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project

Django URL Shortener Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project Install this package to your Dja

Rishav Sinha 4 Nov 18, 2021
A beginner django project and also my first Django project which involves shortening of a longer URL into a short one using a unique id.

Django-URL-Shortener A beginner django project and also my first Django project which involves shortening of a longer URL into a short one using a uni

Rohini Rao 3 Aug 8, 2021
Awesome Django Markdown Editor, supported for Bootstrap & Semantic-UI

martor Martor is a Markdown Editor plugin for Django, supported for Bootstrap & Semantic-UI. Features Live Preview Integrated with Ace Editor Supporte

null 659 Jan 4, 2023
Django project starter on steroids: quickly create a Django app AND generate source code for data models + REST/GraphQL APIs (the generated code is auto-linted and has 100% test coverage).

Create Django App ?? We're a Django project starter on steroids! One-line command to create a Django app with all the dependencies auto-installed AND

imagine.ai 68 Oct 19, 2022
Dockerizing Django with Postgres, Gunicorn, Nginx and Certbot. A fully Django starter project.

Dockerizing Django with Postgres, Gunicorn, Nginx and Certbot ?? Features A Django stater project with fully basic requirements for a production-ready

null 8 Jun 27, 2022
pytest-django allows you to test your Django project/applications with the pytest testing tool.

pytest-django allows you to test your Django project/applications with the pytest testing tool.

pytest-dev 1.1k Dec 14, 2022
django-dashing is a customisable, modular dashboard application framework for Django to visualize interesting data about your project. Inspired in the dashboard framework Dashing

django-dashing django-dashing is a customisable, modular dashboard application framework for Django to visualize interesting data about your project.

talPor Solutions 703 Dec 22, 2022
Django Starter is a simple Skeleton to start with a Django project.

Django Starter Template Description Django Starter is a simple Skeleton to start

Numan Ibn Mazid 1 Jan 10, 2022
Intellicards-backend - A Django project bootstrapped with django-admin startproject mysite

Intellicards-backend - A Django project bootstrapped with django-admin startproject mysite

Fabrizio Torrico 2 Jan 13, 2022
Notes-Django: an advanced project to save notes in Django. where users are able to Create, Read, Update and Delete their notes.

An advanced software to keep you notes. It allows users to perform CRUD operations on theirs Notes. Was implemented Authorization and Authentication

Edilson Pateguana 1 Feb 5, 2022
This a Django TODO app project and practiced how to deploy and publish the project to Heroku

ToDo App Demo | Project Table of Contents Overview Built With Features How to use Acknowledgements Contact Overview Built With HTML CSS JS Django How

Cetin OGUT 1 Nov 19, 2021
Meta package to combine turbo-django and stimulus-django

Hotwire + Django This repository aims to help you integrate Hotwire with Django ?? Inspiration might be taken from @hotwired/hotwire-rails. We are sti

Hotwire for Django 31 Aug 9, 2022
django-reversion is an extension to the Django web framework that provides version control for model instances.

django-reversion django-reversion is an extension to the Django web framework that provides version control for model instances. Requirements Python 3

Dave Hall 2.8k Jan 2, 2023
Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.

Django-environ django-environ allows you to use Twelve-factor methodology to configure your Django application with environment variables. import envi

Daniele Faraglia 2.7k Jan 7, 2023
Rosetta is a Django application that eases the translation process of your Django projects

Rosetta Rosetta is a Django application that facilitates the translation process of your Django projects. Because it doesn't export any models, Rosett

Marco Bonetti 909 Dec 26, 2022
Cookiecutter Django is a framework for jumpstarting production-ready Django projects quickly.

Cookiecutter Django Powered by Cookiecutter, Cookiecutter Django is a framework for jumpstarting production-ready Django projects quickly. Documentati

Daniel Feldroy 10k Dec 31, 2022
A Django chatbot that is capable of doing math and searching Chinese poet online. Developed with django, channels, celery and redis.

Django Channels Websocket Chatbot A Django chatbot that is capable of doing math and searching Chinese poet online. Developed with django, channels, c

Yunbo Shi 8 Oct 28, 2022
A handy tool for generating Django-based backend projects without coding. On the other hand, it is a code generator of the Django framework.

Django Sage Painless The django-sage-painless is a valuable package based on Django Web Framework & Django Rest Framework for high-level and rapid web

sageteam 51 Sep 15, 2022