Skip to content

Commit 25169f1

Browse files
committed
Add the set_html_id template tag to resolve the random html.id attribute.
1 parent b4575df commit 25169f1

File tree

6 files changed

+21
-11
lines changed

6 files changed

+21
-11
lines changed

djangocms_frontend/contrib/accordion/templates/djangocms_frontend/bootstrap5/accordion.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{% load cms_tags frontend %}
2-
<{{ instance.tag_type }}{{ instance.get_attributes }} id="parent-{{ instance.uuid }}">
2+
<{{ instance.tag_type }}{{ instance.get_attributes }} {% set_html_id instance as html_id %}id="parent-{{ html_id }}">
33
{% for plugin in instance.child_plugin_instances %}
44
{% with parentloop=forloop parent=instance %}{% render_plugin plugin %}{% endwith %}
55
{% empty %}{% user_message _("Add accordion items here") %}

djangocms_frontend/contrib/accordion/templates/djangocms_frontend/bootstrap5/accordion_item.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{% load cms_tags frontend %}
22
{% spaceless %}
3-
<div class="accordion-item">
3+
<div class="accordion-item">{% set_html_id instance as html_id %}
44
<{{ parent.accordion_header_type|default:"h2" }} class="accordion-header"
5-
id="heading-{{ instance.uuid }}"><button
5+
id="heading-{{ instance.html_id }}"><button
66
class="accordion-button{% if not instance.accordion_item_open %} collapsed{% endif %} {{ instance.font_size }}"
77
type="button"
88
data-bs-toggle="collapse"
9-
data-bs-target="#item-{{ instance.uuid }}"
9+
data-bs-target="#item-{{ instance.html_id }}"
1010
aria-expanded="{{ instance.accordion_item_open|lower }}"
11-
aria-controls="item-{{ instance.uuid }}">{% inline_field instance "accordion_item_header" %}</button>
11+
aria-controls="item-{{ instance.html_id }}">{% inline_field instance "accordion_item_header" %}</button>
1212
</{{ parent.accordion_header_type|default:"h2" }}>
13-
<{{ instance.tag_type }}{{ instance.get_attributes }} id="item-{{ instance.uuid }}" aria-labelledby="heading-{{ instance.uuid }}" data-bs-parent="#parent-{{ parent.uuid }}">
13+
<{{ instance.tag_type }}{{ instance.get_attributes }} id="item-{{ instance.html_id }}" aria-labelledby="heading-{{ instance.html_id }}" data-bs-parent="#parent-{{ parent.html_id }}">
1414
<div class="accordion-body">{% endspaceless %}
1515
{% with parent=instance %}
1616
{% for plugin in instance.child_plugin_instances %}

djangocms_frontend/contrib/collapse/templates/djangocms_frontend/bootstrap5/collapse-container.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<{{ instance.tag_type }}{{ instance.get_attributes }}
33
id="{{ instance.container_identifier }}"
44
role="tabpanel"
5-
data-bs-parent="#collapse-{{ parent.uuid }}"
5+
data-bs-parent="#collapse-{{ parent.html_id }}"
66
aria-labelledby="trigger-{{ instance.container_identifier }}">
77
{% for plugin in instance.child_plugin_instances %}
88
{% with forloop as parentloop %}{% render_plugin plugin %}{% endwith %}

djangocms_frontend/contrib/collapse/templates/djangocms_frontend/bootstrap5/collapse.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{% load cms_tags frontend %}
22
<{{ instance.tag_type }}{{ instance.get_attributes }}
3-
id="collapse-{{ instance.uuid }}"
3+
{% set_html_id instance as html_id %}id="collapse-{{ html_id }}"
44
data-bs-children="{{ instance.collapse_siblings }}"
55
role="tablist"
66
>

djangocms_frontend/models.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import uuid
2-
31
from cms.models import CMSPlugin
42
from django.core.serializers.json import DjangoJSONEncoder
53
from django.db import models
@@ -48,7 +46,7 @@ class Meta:
4846

4947
def __init__(self, *args, **kwargs):
5048
self._additional_classes = []
51-
self.uuid = str(uuid.uuid4())
49+
self.html_id = None # HTML id attribute will be set in template tag set_html_id.
5250
super().__init__(*args, **kwargs)
5351

5452
def __getattr__(self, item):

djangocms_frontend/templatetags/frontend.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from djangocms_frontend import settings
2121
from djangocms_frontend.fields import HTMLsanitized
2222
from djangocms_frontend.helpers import get_related_object as related_object
23+
from djangocms_frontend.models import FrontendUIItem
2324

2425
register = template.Library()
2526

@@ -73,6 +74,17 @@ def get_attributes(attribute_field, *add_classes):
7374
return mark_safe(" ".join(attrs))
7475

7576

77+
@register.simple_tag(takes_context=True)
78+
def set_html_id(context: template.Context, instance: FrontendUIItem) -> str:
79+
if instance.html_id is None:
80+
request = context["request"]
81+
key = "frontend_plugins_counter"
82+
counter = getattr(request, key, 0) + 1
83+
instance.html_id = f"frontend-plugins-{counter}"
84+
setattr(request, key, counter)
85+
return instance.html_id
86+
87+
7688
@register.filter
7789
def get_related_object(reference):
7890
return related_object(dict(obj=reference), "obj")

0 commit comments

Comments
 (0)