Reference¶
Settings¶
djangocms-frontend can be configured by putting the appropriate settings
in your project’s settings.py.
- settings.CMS_COMPONENT_PLUGINS¶
Defaults to
[]A list of dotted pathes to plugin classes that are supposed to also be components (see How to use frontend plugins as components in templates). Components are plugins to also be used in templates using the
{% plugin %}template tag.For performance reason, the plugin templates are compiled at startup.
To make
djangocms-frontendplugins available as components, add the following line to your project’s settings:CMS_COMPONENT_PLUGINS = [ "djangocms_frontend.cms_plugins.CMSUIPlugin", # All subclasses are added # add other plugins here if needed ]
- settings.DJANGOCMS_FRONTEND_COMPONENT_FOLDER¶
Defaults to
"cms_components"The subfolder where the component templates are discovered. This is used by the template components to find the templates for the components.
The folder needs to be created in your app’s
templates/<app_name>/directory. If you want to use a different folder, set this to the folder name of your choice.For example, if you want to use
"my_components", add the following line to your project’s settings:DJANGOCMS_FRONTEND_COMPONENT_FOLDER = "my_components"
This causes djangocms-frontend to search for templates on the following paths:
templates/<app_name>/my_components/, where<app_name>is the name of any installed app.
- settings.DJANGOCMS_FRONTEND_COMPONENT_FIELDS¶
Defaults to
{}A dictionary of installed Django apps and a list of Django form fields to be provided to template components’ context during their registration. The form fields can be used with the
{% field %}template tag.For example, to add a custom field to the context of all components, add the following line to your project’s settings:
DJANGOCMS_FRONTEND_COMPONENT_FIELDS = { "myapp": [ "myapp.fields.MySuperFieldField", "myapp.fields.ChatBotField", ], # add other apps here if needed }
These fields can be used in the template like this:
{% field "superField" MySuperFieldField required=True %} {% field "chat_bot" ChatBotField required=False %}
Fields are only imported into the context if the app is installed in the project’s
INSTALLED_APPS.
- settings.DJANGOCMS_FRONTEND_TAG_CHOICES¶
Defaults to
['div', 'section', 'article', 'header', 'footer', 'aside'].Lists the choices for the tag field of all
djangocms-frontendplugins.divis the default tag.These tags appear in Advanced Settings of some elements for editors to chose from.
- settings.DJANGOCMS_FRONTEND_GRID_SIZE¶
Defaults to
12.
- settings.DJANGOCMS_FRONTEND_GRID_CONTAINERS¶
Default:
( ("container", _("Container")), ("container-fluid", _("Fluid container")), ("container-full", _("Full container")), )
- settings.DJANGOCMS_FRONTEND_USE_ICONS¶
Defaults to
True.Decides if icons should be offered, e.g. in links.
- settings.DJANGOCMS_FRONTEND_CAROUSEL_TEMPLATES¶
Defaults to
(('default', _('Default')),)If more than one option is given editors can select which template a carousel uses for rendering. Carousel expects the templates in a template folder under
djangocms_frontend/bootstrap5/carousel/{{ name }}/.{{ name }}denotes the value of the template, i.e.defaultin the default example.Carousel requires at least two files:
carousel.htmlandslide.html.
- settings.DJANGOCMS_FRONTEND_TAB_TEMPLATES¶
Defaults to
(('default', _('Default')),)If more than one option is given editors can select which template a tab element uses for rendering. Tabs expects the templates in a template folder under
djangocms_frontend/bootstrap5/tabs/{{ name }}/.{{ name }}denotes the value of the template, i.e.defaultin the default example.Tabs requires at least two files:
tabs.htmlanditem.html.
- settings.DJANGOCMS_FRONTEND_LINK_TEMPLATES¶
Defaults to
(('default', _('Default')),)If more than one option is given editors can select which template a link or button element uses for rendering. Link expects the templates in a template folder under
djangocms_frontend/bootstrap5/link/{{ name }}/.{{ name }}denotes the value of the template, i.e.defaultin the default example.Link requires at least one file:
link.html.The default template adds
rel="noopener noreferrer"to links withtarget="_blank", which is recommended for security and performance. If you do not want this behaviour, provide a custom template (e.g. via an additional entry inDJANGOCMS_FRONTEND_LINK_TEMPLATESand a correspondinglink.htmlin your project) and omit or adjust therelattribute there.
- settings.DJANGOCMS_FRONTEND_JUMBOTRON_TEMPLATES¶
Defaults to
(('default', _('Default')),)Jumbotrons have been discontinued form Bootstrap 5 (and are not present in other frameworks either). The default template mimics the Bootstrap 4’s jumbotron.
If more than one option is given editors can select which template a jumbotron element uses for rendering. Jumbotron expects the template in a template folder under
djangocms_frontend/bootstrap5/jumbotron/{{ name }}/.{{ name }}denotes the value of the template, i.e.defaultin the default example.Link requires at least one file:
jumbotron.html.
- settings.DJANGOCMS_FRONTEND_SPACER_SIZES¶
Default:
( ('0', '* 0'), ('1', '* .25'), ('2', '* .5'), ('3', '* 1'), ('4', '* 1.5'), ('5', '* 3'), )
- settings.DJANGOCMS_FRONTEND_CAROUSEL_ASPECT_RATIOS¶
Default:
((16, 9),)Additional aspect ratios offered in the carousel component
- settings.DJANGOCMS_FRONTEND_COLOR_STYLE_CHOICES¶
Default:
( ("primary", _("Primary")), ("secondary", _("Secondary")), ("success", _("Success")), ("danger", _("Danger")), ("warning", _("Warning")), ("info", _("Info")), ("light", _("Light")), ("dark", _("Dark")), )
- settings.DJANGOCMS_FRONTEND_ADMIN_CSS¶
Default:
NoneAdds css format files to the frontend editing forms of
djangocms-frontend. The syntax is with aModelForm’scssattribute of itsMediaclass, e.g.,DJANGOCMS_FRONTEND_ADMIN_CSS = {"all": ("css/admin.min.css",)}.This css might be used to style have theme-specific colors available in the frontend editing forms. The included css file is custom made and should only contain color settings in the form of
.frontend-button-group .btn-primary { color: #123456; // add !important here if using djangocms-admin-style background-color: #abcdef; }
Note
Changing the
colorattribute might require a!importantstatement if you are using djangocms-admin-style.
- settings.DJANGOCMS_FRONTEND_MINIMUM_INPUT_LENGTH¶
If unset or smaller than
1the link plugin will render all link options into its form. If1or bigger the link form will wait for the user to type at least this many letters and search link targets matching this search string using an ajax request.
Note
The following settings of djangocms-picture are respected.
- settings.DJANGOCMS_PICTURE_ALIGN¶
You can override alignment styles with
DJANGOCMS_PICTURE_ALIGN, for example:DJANGOCMS_PICTURE_ALIGN = [ ('top', _('Top Aligned')), ]
This will generate a class prefixed with
align-. The example above would produce aclass="align-top". Adding aclasskey to the image attributes automatically merges the alignment with the attribute class.
- settings.DJANGOCMS_PICTURE_RATIO¶
You can use
DJANGOCMS_PICTURE_RATIOto set the width/height ratio of images if these values are not set explicitly on the image:DJANGOCMS_PICTURE_RATIO = 1.618
We use the golden ratio, approximately 1.618, as a default value for this.
- settings.DJANGOCMS_PICTURE_RESPONSIVE_IMAGES¶
You can enable responsive images technique by setting``DJANGOCMS_PICTURE_RESPONSIVE_IMAGES`` to
True.
- settings.DJANGOCMS_PICTURE_RESPONSIVE_IMAGES_VIEWPORT_BREAKPOINTS¶
If
DJANGOCMS_PICTURE_RESPONSIVE_IMAGESis set toTrue,uploaded images will create thumbnails of different sizes according toDJANGOCMS_PICTURE_RESPONSIVE_IMAGES_VIEWPORT_BREAKPOINTS(which defaults to[576, 768, 992]) and browser will be responsible for choosing the best image to display (based upon the screen viewport).
- settings.DJANGOCMS_PICTURE_TEMPLATES¶
This addon provides a
defaulttemplate for all instances. You can provide additional template choices by adding aDJANGOCMS_PICTURE_TEMPLATESsetting:DJANGOCMS_PICTURE_TEMPLATES = [ ('background', _('Background image')), ]
You’ll need to create the background folder inside
templates/djangocms_picture/otherwise you will get a template does not exist error. You can do this by copying thedefaultfolder inside that directory and renaming it tobackground.
- settings.TEXT_SAVE_IMAGE_FUNCTION¶
If you want to use djangocms-text-ckeditor’s Drag & Drop Images so be sure to set
TEXT_SAVE_IMAGE_FUNCTION:TEXT_SAVE_IMAGE_FUNCTION = 'djangocms_frontend.contrib.image.image_save.create_image_plugin'
Otherwise set
TEXT_SAVE_IMAGE_FUNCTION = None
- settings.DJANGOCMS_FRONTEND_ICON_LIBRARIES¶
Default:
DJANGOCMS_FRONTEND_ICON_LIBRARIES = { 'font-awesome': ( 'font-awesome.min.json', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css' ), 'bootstrap-icons': ( 'bootstrap-icons.min.json', 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css' ), 'material-icons-filled': ( 'material-icons-filled.min.json', 'https://fonts.googleapis.com/css2?family=Material+Icons' ), ...
For each available icon set there is an entry in this dictionary. The key is the basis for the displayed name. The value is a 2-tuple:
The name of the config file which is a static file with the path
djangocms_frontend/icon/vendor/assets/icon-libraries/.The name of the css file defining the icons. It is either a path or a file name. If it is a file name the css file is fetched from
djangocms_frontend/icon/vendor/assets/stylesheets/.
- settings.DJANGOCMS_FRONTEND_ICON_LIBRARIES_SHOWN¶
Default:
DJANGOCMS_FRONTEND_ICON_LIBRARIES_SHOWN = ( "font-awesome", "bootstrap-icons", "material-icons-filled", "material-icons-outlined", "material-icons-round", "material-icons-sharp", "material-icons-two-tone", "fomantic-ui", "foundation-icons", "elegant-icons", "feather-icons", "open-iconic", "tabler-icons", "weather-icons", )
This settings allows to restrict the number of icon sets shown to the user. Typically one or two icon sets should be sufficient to keep a consistent icon expierence.
Warning
This setting only has an effecet if
DJANGOCMS_FRONTEND_ICON_LIBRARIESis not explicitly set.
- settings.DJANGOCMS_FRONTEND_ICON_SIZE_CHOICES¶
Default:
DJANGOCMS_FRONTEND_ICON_SIZE_CHOICES = ( ("", _("Regular")), ("200%", _("x 2")), ("300%", _("x 3")), ("400%", _("x 4")), ("500%", _("x 5")), ("800%", _("x 8")), ("1200%", _("x 12")), )
This lost of options define the icon size choices a user can select. The values (first tuple element) are css units for the
font-sizecss property. Besides relative units (%) any css unit can be used, e.g.112pt.
- settings.DJANGOCMS_FRONTEND_SHOW_EMPTY_CHILDREN¶
Default:
FalseIf set to
Truethe frontend editing will show a message where children can be added to plugins to complete the design. This is supposed to make the editing experience more intuitive for editors.
Models¶
djangocms-frontend subclasses the CMSPlugin model.
- class FrontendUIItem(CMSPlugin)¶
Import from
djangocms_frontend.models.All concrete models for UI items are proxy models of this class. This implies you can create, delete and update instances of the proxy models and all the data will be saved as if you were using this original (non-proxied) model.
This way all proxies can have different python methods as needed while still all using the single database table of
FrontendUIItem.
- FrontendUIItem.ui_item¶
This CharField contains the UI item’s type without the suffix “Plugin”, e.g. “Link” and not “LinkPlugin”. This is a convenience field. The plugin type is determined by
CMSPlugin.plugin_type.
- FrontendUIItem.tag_type¶
This is the tag type field determining what tag type the UI item should have. Tag types default to
<div>.
- FrontendUIItem.config¶
The field
configis the JSON field that contains a dictionary with all specific information needed for the UI item. The entries of the dictionary can be directly read as attributes of theFrontendUIIteminstance. For example,ui_item.contextwill giveui_item.config["context"].Warning
Note that changes to the
configmust be written directly to the dictionary:ui_item.config["context"] = None.
- FrontendUIItem.add_classes(self, *args)¶
This helper method allows a Plugin’s render method to add framework-specific html classes to be added when a model is rendered. Each positional argument can be a string for a class name or a list of strings to be added to the list of html classes.
These classes are not saved to the database. They merely a are stored to simplify the rendering process and are lost once a UI item has been rendered.
- FrontendUIItem.get_attributes(self)¶
This method renders all attributes given in the optional
attributesfield (stored in.config). Theclassattribute reflects all additional classes that have been passed to the model instance by means of the.add_classesmethod.
- FrontendUIItem.initialize_from_form(self, form)¶
Since the UIItem models do not have default values for the contents of their
.configdictionary, a newly created instance of an UI item will not have config data set, not even required data.This method initializes all fields in
.configby setting the value to the respectiveinitialproperty of the UI items admin form.
- FrontendUIItem.get_short_description(self)¶
returns a plugin-specific short description shown in the structure mode of django CMS.
Form widgets¶
djangocms-frontend contains button group widgets which can be used as
for forms.ChoiceField. They might turn out helpful when adding custom
plugins.
- class ButtonGroup(forms.RadioSelect)¶
Import from
djangocms_frontend.fieldsThe button group widget displays a set of buttons for the user to chose. Usable for up to roughly five options.
- class ColoredButtonGroup(ButtonGroup)¶
Import from
djangocms_frontend.fieldsUsed to display the context color selection buttons.
- class IconGroup(ButtonGroup)¶
Import from
djangocms_frontend.fields.This widget displays icons in stead of text for the options. Each icon is rendered by
<span class="icon icon-{{value}}"></span>. Add css in theMediasubclass to ensure that for each option’s value the span renders the appropriate icon.
- class IconMultiselect(forms.CheckboxSelectMultiple)¶
Import from
djangocms_frontend.fields.Like
IconGroupthis widget displays a choice of icons. Since it inherits fromCheckboxSelectMultiplethe icons work like checkboxes and not radio buttons.
- class OptionalDeviceChoiceField(forms.MultipleChoiceField)¶
Import from
djangocms_frontend.fields.This form field displays a choice of devices corresponding to breakpoints in the responsive grid. The user can select any combination of devices including none and all.
The result is a list of values of the selected choices or None for all devices selected.
- class DeviceChoiceField(OptionalDeviceChoiceField)¶
Import from
djangocms_frontend.fields.This form field is identical to the
OptionalDeviceChoiceFieldabove, but requires the user to select at least one device.
Template filters¶
djangocms-frontend provides template filters that can be used in component templates.
Load them with {% load frontend %}.
- get_slot(instance, slot_name)¶
Import from
djangocms_frontend.templatetags.frontend.Get plugins for a specific slot directly from a component instance. This is useful for manually iterating over slot plugins in a component’s template instead of using the
{% childplugins %}template tag.- Parameters:
instance – The component plugin instance
slot_name – The name of the slot to retrieve plugins from
- Returns:
Generator yielding child plugin instances in the specified slot
Usage in templates:
{% load frontend %} {% for plugin in instance|get_slot:"buttons" %} {# Manually render each plugin in the slot #} <div class="button-wrapper"> {% render_plugin plugin %} </div> {% endfor %}
This is useful when you need more control over how slot content is rendered, compared to the
{% childplugins %}tag which handles rendering automatically.
- get_attributes(attribute_field, *add_classes)¶
Simple tag that joins classes with an attributes field and returns all HTML attributes formatted for use in templates.
- Parameters:
attribute_field – Dictionary of HTML attributes (e.g.,
{"class": "btn", "id": "my-id"})add_classes – Additional CSS classes to merge with existing ones
- Returns:
Safe HTML string of formatted attributes
Usage in templates:
{% load frontend %} {# Basic usage with attributes field #} <div {% get_attributes instance.attributes %}> {# Add additional classes #} <div {% get_attributes instance.attributes "extra-class" "another-class" %}> {# Combine multiple class sources #} <button {% get_attributes instance.attributes some_variable "static-class" %}>
Behavior:
Merges all provided classes into a single
classattributeProperly escapes attribute values for safety
Handles boolean attributes (renders just the attribute name if value is empty)
Returns a safe HTML string that can be used directly in templates
Management commands¶
Management commands are run by typing python -m manage frontend command in the
project directory. command can be one of the following:
migrateMigrates plugins from other frontend packages to
djangocms-frontend. Currently supports djangocms_bootstrap4 and djangocms_styled_link. Other packages can be migrated adding custom migration modules to theDJANGOCMS_FRONTEND_ADDITIONAL_MIGRATIONSsetting.stale_referencesIf references in a UI item are moved or removed the UI items are designed to fall back gracefully and both not throw errors or be deleted themselves (by a db cascade).
The drawback is, that references might become stale. This command prints all stale references, their plugins and pages/placeholder they belong to.
sync_permissionsThis command syncs permissions for users or groups. It is run with one of the following arguments:
users: Syncs permissions for all users.groups: Syncs permissions for all groups.
Permissions are copied from the
FrontendUIItemmodel to all installed plugins. This way you can set permissions for all plugins by setting them forFrontendUIItemand then syncing them.
Running Tests¶
You can run tests by executing:
python -m venv env
source env/bin/activate
pip install -r tests/requirements/base.txt
pytest