from importlib import import_module from django.http import HttpRequest from django.utils.safestring import mark_safe from django_components import Component, types from .utils import discover_example_modules class ExamplesIndexPage(Component): """Index page that lists all available examples""" class Media: js = ( mark_safe( '' ), ) def get_template_data(self, args, kwargs, slots, context): # Get the list of discovered examples example_names = discover_example_modules() # Convert example names to display format examples = [] for name in sorted(example_names): # Convert snake_case to PascalCase (e.g. error_fallback -> ErrorFallback) display_name = "".join(word.capitalize() for word in name.split("_")) # For the short description, we use the DESCRIPTION variable from the component's module module_name = f"examples.dynamic.{name}.component" module = import_module(module_name) description = getattr(module, "DESCRIPTION", "") examples.append( { "name": name, # Original name for URLs "display_name": display_name, # PascalCase for display "description": description, } ) return { "examples": examples, } class View: def get(self, request: HttpRequest): return ExamplesIndexPage.render_to_response(request=request) template: types.django_html = """
Interactive examples showcasing django-components features
No example components were discovered in the docs/examples/ directory.
These examples are dynamically discovered from the docs/examples/ directory.
Each example includes a component definition, live demo page, and tests.