Skip to main content

A Django admin mixin to link MonacoEditor CSS and TinyMCE HTML fields for a live preview.

Project description

Django Admin Style Linker

PyPI version

A simple Django admin mixin to link a CSS editor field (MonacoEditor) with an HTML editor field (TinyMCE) for a live preview. When a user types CSS, it's instantly applied to the content in the HTML editor's iframe.

Features

  • Easy to integrate with any ModelAdmin.
  • Works with separate CSS and HTML fields.
  • Optional support for django-modeltranslation.

Installation

pip install django-admin-style-linker

Add admin_style_linker to your INSTALLED_APPS in settings.py and configure TinyMCE:

INSTALLED_APPS = [
    # ...
    'django_monaco_editor',
    'tinymce',
    'admin_style_linker',
    # ...
]

# Important
# You need to add this setup to your TinyMCE settings for django-admin-style-linker to work properly.
TINYMCE_DEFAULT_CONFIG = {
    "setup": """function (editor) {
        const event = new CustomEvent('tinyMceAllEditorsInit', { detail: [editor] });
        document.dispatchEvent(event);
    }""",

    # other TinyMCE settings
}

Usage

In your admin.py, inherit from LinkStyleAdminMixin and configure the link_styles attribute.

link_styles is a list of dictionaries, where each dictionary specifies one style field and one or more HTML fields it should apply to.

Example:

from django.contrib import admin
from .models import MyModel
from admin_style_linker import LinkStyleAdminMixin

@admin.register(MyModel)
class MyModelAdmin(LinkStyleAdminMixin, admin.ModelAdmin):
    # ... other admin settings

    link_styles = [
        {
            'styles_field': 'custom_css',  # The name of the field with CSS
            'html_fields': ['content_html', 'another_html_field'], # A list of fields with HTML
        },
    ]

Example

Django Modeltranslation Support

The mixin automatically detects if django-modeltranslation is installed and intelligently handles translated fields. You don't need any special configuration—just use the base field names in your link_styles setup, and the mixin will figure out the rest.

Here are a few common scenarios:


Scenario 1: Both Style and HTML Fields are Translatable (Most common)

When both the CSS field and the HTML field(s) are registered for translation, the mixin will link fields of the same language together.

translation.py:

from modeltranslation.translator import register, TranslationOptions
from .models import MyModel

@register(MyModel)
class MyModelTranslationOptions(TranslationOptions):
    fields = ('styles', 'content')

admin.py:

@admin.register(MyModel)
class MyModelAdmin(LinkStyleAdminMixin, admin.ModelAdmin):
    link_styles = [
        {
            'styles_field': 'styles',       # Base name
            'html_fields': ['content'],     # Base name
        },
    ]

Result: The mixin will automatically create the following links:

  • styles_en will apply to content_en.
  • styles_uk will apply to content_uk.
  • ...and so on for all your LANGUAGES.

Scenario 2: Non-Translatable Styles for Translatable HTML

Use one common CSS field to style all language versions of your HTML content.

translation.py:

@register(MyModel)
class MyModelTranslationOptions(TranslationOptions):
    fields = ('content',) # Only 'content' is translatable

admin.py:

@admin.register(MyModel)
class MyModelAdmin(LinkStyleAdminMixin, admin.ModelAdmin):
    link_styles = [
        {
            'styles_field': 'global_styles', # Not a translatable field
            'html_fields': ['content'],      # Translatable field
        },
    ]

Result: The global_styles field will apply to all language versions of the content field:

  • global_stylescontent_en
  • global_stylescontent_uk

Scenario 3: Translatable Styles for a Non-Translatable HTML Field

If your style field is translatable but the HTML field is not, the mixin will link the non-translatable field only to the style field of the default language (settings.LANGUAGE_CODE).

translation.py:

@register(MyModel)
class MyModelTranslationOptions(TranslationOptions):
    fields = ('styles',) # Only 'styles' is translatable

admin.py:

@admin.register(MyModel)
class MyModelAdmin(LinkStyleAdminMixin, admin.ModelAdmin):
    link_styles = [
        {
            'styles_field': 'styles',          # Translatable field
            'html_fields': ['footer_html'],    # NOT a translatable field
        },
    ]

Result: Assuming your default language is English (en):

  • styles_en will apply to footer_html.
  • Other style versions (styles_uk, etc.) will not be linked to footer_html.

How it Works

The mixin injects data-* attributes into the widgets of the specified fields during form rendering. A JavaScript file then listens for changes in the data-style-source-for field and injects its content as a <style> tag into the <iframe> of the corresponding data-style-target-of editor.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_admin_style_linker-1.0.2.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_admin_style_linker-1.0.2-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file django_admin_style_linker-1.0.2.tar.gz.

File metadata

File hashes

Hashes for django_admin_style_linker-1.0.2.tar.gz
Algorithm Hash digest
SHA256 27ec34597014ff6f2efc75443229ab4ff91da78e40a2e342cf30a8989b1e3fc6
MD5 b3f9f2653c15b23d2ca8f12a85b3f548
BLAKE2b-256 ed97b1c8edf5796076a47946f3761a76a966c5347f9d04807d259dc0c62f9db0

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_admin_style_linker-1.0.2.tar.gz:

Publisher: release.yml on john-psina/django-admin-style-linker

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_admin_style_linker-1.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_admin_style_linker-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d16381c221bddd191e4a72f4c0cb094c25608d1f5b8ee1b49084dc6ceee264ad
MD5 8ae2175f4cfbe730b073a2cb926bad3c
BLAKE2b-256 7d12f795f7f9916e64a7329e41518f1eec992e0e7ad77f69741ec8a790114f0a

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_admin_style_linker-1.0.2-py3-none-any.whl:

Publisher: release.yml on john-psina/django-admin-style-linker

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page