diff --git a/django_components/templatetags/component_tags.py b/django_components/templatetags/component_tags.py index 1db37157..d7c6620c 100644 --- a/django_components/templatetags/component_tags.py +++ b/django_components/templatetags/component_tags.py @@ -15,6 +15,9 @@ from django_components.middleware import ( register = template.Library() +RENDERED_COMMENT_TEMPLATE = "" + + def get_components_from_registry(registry): """Returns a list unique components from the registry.""" @@ -27,13 +30,36 @@ def get_components_from_registry(registry): return components +def get_components_from_preload_str(preload_str): + """Returns a list of unique components from a comma-separated str""" + + components = [] + for component_name in preload_str.split(","): + component_name = component_name.strip() + if not component_name: + continue + component_class = registry.get(component_name) + components.append(component_class(component_name)) + + return components + + @register.simple_tag(name="component_dependencies") -def component_dependencies_tag(): +def component_dependencies_tag(preload=""): """Marks location where CSS link and JS script tags should be rendered.""" if is_dependency_middleware_active(): + preloaded_dependencies = [] + for component in get_components_from_preload_str(preload): + preloaded_dependencies.append( + RENDERED_COMMENT_TEMPLATE.format( + name=component._component_name + ) + ) return mark_safe( - CSS_DEPENDENCY_PLACEHOLDER + JS_DEPENDENCY_PLACEHOLDER + "\n".join(preloaded_dependencies) + + CSS_DEPENDENCY_PLACEHOLDER + + JS_DEPENDENCY_PLACEHOLDER ) else: rendered_dependencies = [] @@ -44,11 +70,20 @@ def component_dependencies_tag(): @register.simple_tag(name="component_css_dependencies") -def component_css_dependencies_tag(): +def component_css_dependencies_tag(preload=""): """Marks location where CSS link tags should be rendered.""" if is_dependency_middleware_active(): - return mark_safe(CSS_DEPENDENCY_PLACEHOLDER) + preloaded_dependencies = [] + for component in get_components_from_preload_str(preload): + preloaded_dependencies.append( + RENDERED_COMMENT_TEMPLATE.format( + name=component._component_name + ) + ) + return mark_safe( + "\n".join(preloaded_dependencies) + CSS_DEPENDENCY_PLACEHOLDER + ) else: rendered_dependencies = [] for component in get_components_from_registry(registry): @@ -58,11 +93,20 @@ def component_css_dependencies_tag(): @register.simple_tag(name="component_js_dependencies") -def component_js_dependencies_tag(): +def component_js_dependencies_tag(preload=""): """Marks location where JS script tags should be rendered.""" if is_dependency_middleware_active(): - return mark_safe(JS_DEPENDENCY_PLACEHOLDER) + preloaded_dependencies = [] + for component in get_components_from_preload_str(preload): + preloaded_dependencies.append( + RENDERED_COMMENT_TEMPLATE.format( + name=component._component_name + ) + ) + return mark_safe( + "\n".join(preloaded_dependencies) + JS_DEPENDENCY_PLACEHOLDER + ) else: rendered_dependencies = [] for component in get_components_from_registry(registry): @@ -197,7 +241,9 @@ class ComponentNode(Node): rendered_component = self.component.render(context) if self.should_render_dependencies: return ( - f"" + RENDERED_COMMENT_TEMPLATE.format( + name=self.component._component_name + ) + rendered_component ) else: diff --git a/tests/test_dependency_rendering.py b/tests/test_dependency_rendering.py index 667636a2..d8315496 100644 --- a/tests/test_dependency_rendering.py +++ b/tests/test_dependency_rendering.py @@ -52,12 +52,7 @@ class ComponentMediaRenderingTests(SimpleTestCase): "{% load component_tags %}{% component_dependencies %}" ) rendered = create_and_process_template_response(template) - self.assertInHTML('