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.1.tar.gz (7.8 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.1-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

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

File metadata

File hashes

Hashes for django_admin_style_linker-1.0.1.tar.gz
Algorithm Hash digest
SHA256 49ef61bce2e62e29cb3e3bedbdb911cd52d167e1b3357027d38d6124bb38065a
MD5 8b9d5f184790bdf7188bec0ba82632bf
BLAKE2b-256 c11c428be160fbc0a49a9a179acdaded004f1326248d2325966db83d130814f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_admin_style_linker-1.0.1.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.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_admin_style_linker-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a2f0da193bd037333967d5e50ab96528955a09a638a093cc4c1108afcfa084af
MD5 930aa5dbbd8c8e6357efc592b4054230
BLAKE2b-256 fffc80d78d9c8fbec8c7b1f64e355123ad5594d0d464f9ddafc50b08d9b242ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_admin_style_linker-1.0.1-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