django-components/dev/reference/django_components/index.html

3096 lines
No EOL
601 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="A way to create simple reusable template components in Django."><link href=https://emilstenstrom.github.io/django-components/latest/reference/django_components/ rel=canonical><link href=../../license/ rel=prev><link href=app_settings/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.5.3, mkdocs-material-9.5.16"><title>Index - Django-Components</title><link rel=stylesheet href=../../assets/stylesheets/main.bcfcd587.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.06af60db.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../assets/_markdown_exec_pyodide.css><link rel=stylesheet href=../../assets/_mkdocstrings.css><link rel=stylesheet href=../../css/timeago.css><script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script><meta property=og:type content=website><meta property=og:title content="Index - Django-Components"><meta property=og:description content="A way to create simple reusable template components in Django."><meta property=og:image content=https://emilstenstrom.github.io/django-components/latest/assets/images/social/reference/django_components/index.png><meta property=og:image:type content=image/png><meta property=og:image:width content=1200><meta property=og:image:height content=630><meta content=https://emilstenstrom.github.io/django-components/latest/reference/django_components/ property=og:url><meta name=twitter:card content=summary_large_image><meta name=twitter:title content="Index - Django-Components"><meta name=twitter:description content="A way to create simple reusable template components in Django."><meta name=twitter:image content=https://emilstenstrom.github.io/django-components/latest/assets/images/social/reference/django_components/index.png></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#django_components class=md-skip> Skip to content </a> </div> <div data-md-component=announce> <aside class=md-banner> <div class="md-banner__inner md-grid md-typeset"> 🚨The documentation is still a work in progress. 🚨 </div> </aside> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class="md-header md-header--shadow" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../.. title=Django-Components class="md-header__button md-logo" aria-label=Django-Components data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> Django-Components </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Index </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media=(prefers-color-scheme) data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9h-1.9M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69m-9.15 3.96h2.3L12 9l-1.15 3.65Z"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme=default data-md-color-primary=teal data-md-color-accent=indigo aria-label="Switch to dark mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_2 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme=slate data-md-color-primary=teal data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_2> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg> </label> </form> <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </label> <nav class=md-search__options aria-label=Search> <a href=javascript:void(0) class="md-search__icon md-icon" title=Share aria-label=Share data-clipboard data-clipboard-text data-md-component=search-share tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg> </a> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> </button> </nav> <div class=md-search__suggest data-md-component=search-suggest></div> </form> <div class=md-search__output> <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/EmilStenstrom/django-components title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> </div> <div class=md-source__repository> EmilStenstrom/django-components </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../.. title=Django-Components class="md-nav__button md-logo" aria-label=Django-Components data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg> </a> Django-Components </label> <div class=md-nav__source> <a href=https://github.com/EmilStenstrom/django-components title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> </div> <div class=md-source__repository> EmilStenstrom/django-components </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_1> <div class="md-nav__link md-nav__container"> <a href=../.. class="md-nav__link "> <span class=md-ellipsis> README </span> </a> <label class="md-nav__link " for=__nav_1 id=__nav_1_label tabindex> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_1_label aria-expanded=false> <label class=md-nav__title for=__nav_1> <span class="md-nav__icon md-icon"></span> README </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../CHANGELOG/ class=md-nav__link> <span class=md-ellipsis> Changelog </span> </a> </li> <li class=md-nav__item> <a href=../../CODE_OF_CONDUCT/ class=md-nav__link> <span class=md-ellipsis> Code of Conduct </span> </a> </li> <li class=md-nav__item> <a href=../../license/ class=md-nav__link> <span class=md-ellipsis> License </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2 checked> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex> <span class=md-ellipsis> Reference </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=true> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> Reference </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1 checked> <label class=md-nav__link for=__nav_2_1 id=__nav_2_1_label tabindex=0> <span class=md-ellipsis> API Reference </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_1_label aria-expanded=true> <label class=md-nav__title for=__nav_2_1> <span class="md-nav__icon md-icon"></span> API Reference </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_1_1 checked> <div class="md-nav__link md-nav__container"> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> django_components </span> </a> <label class="md-nav__link md-nav__link--active" for=__nav_2_1_1 id=__nav_2_1_1_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=3 aria-labelledby=__nav_2_1_1_label aria-expanded=true> <label class=md-nav__title for=__nav_2_1_1> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> django_components </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=app_settings/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> app_settings </span> </a> </li> <li class=md-nav__item> <a href=apps/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> apps </span> </a> </li> <li class=md-nav__item> <a href=attributes/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> attributes </span> </a> </li> <li class=md-nav__item> <a href=autodiscover/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> autodiscover </span> </a> </li> <li class=md-nav__item> <a href=component/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component </span> </a> </li> <li class=md-nav__item> <a href=component_media/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component_media </span> </a> </li> <li class=md-nav__item> <a href=component_registry/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component_registry </span> </a> </li> <li class=md-nav__item> <a href=context/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> context </span> </a> </li> <li class=md-nav__item> <a href=expression/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> expression </span> </a> </li> <li class=md-nav__item> <a href=library/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> library </span> </a> </li> <li class=md-nav__item> <a href=logger/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> logger </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_13> <div class="md-nav__link md-nav__container"> <a href=management/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> management </span> </a> <label class="md-nav__link " for=__nav_2_1_1_13 id=__nav_2_1_1_13_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_1_13_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_13> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> management </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_13_2> <div class="md-nav__link md-nav__container"> <a href=management/commands/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> commands </span> </a> <label class="md-nav__link " for=__nav_2_1_1_13_2 id=__nav_2_1_1_13_2_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=5 aria-labelledby=__nav_2_1_1_13_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_13_2> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> commands </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=management/commands/startcomponent/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> startcomponent </span> </a> </li> <li class=md-nav__item> <a href=management/commands/upgradecomponent/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> upgradecomponent </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=middleware/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> middleware </span> </a> </li> <li class=md-nav__item> <a href=node/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> node </span> </a> </li> <li class=md-nav__item> <a href=provide/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> provide </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_17> <div class="md-nav__link md-nav__container"> <a href=safer_staticfiles/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> safer_staticfiles </span> </a> <label class="md-nav__link " for=__nav_2_1_1_17 id=__nav_2_1_1_17_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_1_17_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_17> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> safer_staticfiles </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=safer_staticfiles/apps/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> apps </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=slots/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> slots </span> </a> </li> <li class=md-nav__item> <a href=tag_formatter/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> tag_formatter </span> </a> </li> <li class=md-nav__item> <a href=template_loader/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> template_loader </span> </a> </li> <li class=md-nav__item> <a href=template_parser/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> template_parser </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_1_1_22> <div class="md-nav__link md-nav__container"> <a href=templatetags/ class="md-nav__link "> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> templatetags </span> </a> <label class="md-nav__link " for=__nav_2_1_1_22 id=__nav_2_1_1_22_label tabindex=0> <span class="md-nav__icon md-icon"></span> </label> </div> <nav class=md-nav data-md-level=4 aria-labelledby=__nav_2_1_1_22_label aria-expanded=false> <label class=md-nav__title for=__nav_2_1_1_22> <span class="md-nav__icon md-icon"></span> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> templatetags </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=templatetags/component_tags/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> component_tags </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=types/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> types </span> </a> </li> <li class=md-nav__item> <a href=utils/ class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> utils </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#django_components.app_settings class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;app_settings </span> </a> <nav class=md-nav aria-label= app_settings> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.app_settings.ContextBehavior class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ContextBehavior </span> </a> <nav class=md-nav aria-label= ContextBehavior> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.app_settings.ContextBehavior.DJANGO class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;DJANGO </span> </a> </li> <li class=md-nav__item> <a href=#django_components.app_settings.ContextBehavior.ISOLATED class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;ISOLATED </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.attributes class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;attributes </span> </a> <nav class=md-nav aria-label= attributes> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.attributes.append_attributes class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;append_attributes </span> </a> </li> <li class=md-nav__item> <a href=#django_components.attributes.attributes_to_string class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;attributes_to_string </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.autodiscover class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;autodiscover </span> </a> <nav class=md-nav aria-label= autodiscover> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.autodiscover.autodiscover class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;autodiscover </span> </a> </li> <li class=md-nav__item> <a href=#django_components.autodiscover.get_dirs class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_dirs </span> </a> </li> <li class=md-nav__item> <a href=#django_components.autodiscover.import_libraries class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;import_libraries </span> </a> </li> <li class=md-nav__item> <a href=#django_components.autodiscover.search_dirs class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;search_dirs </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.component class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;component </span> </a> <nav class=md-nav aria-label= component> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.component.Component class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Component </span> </a> <nav class=md-nav aria-label= Component> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.component.Component.Media class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;Media </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.css class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;css </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.input class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;input </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.js class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;js </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.media class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;media </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.response_class class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;response_class </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.template class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;template </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.template_name class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;template_name </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.as_view class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;as_view </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.inject class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;inject </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.render class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;render </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.render_css_dependencies class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;render_css_dependencies </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.render_dependencies class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;render_dependencies </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.render_js_dependencies class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;render_js_dependencies </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.Component.render_to_response class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;render_to_response </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.component.ComponentNode class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ComponentNode </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component.ComponentView class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ComponentView </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.component_media class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;component_media </span> </a> <nav class=md-nav aria-label= component_media> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.component_media.ComponentMediaInput class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ComponentMediaInput </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_media.MediaMeta class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;MediaMeta </span> </a> <nav class=md-nav aria-label= MediaMeta> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.component_media.MediaMeta--1-support-for-multiple-interfaces-of-jscss class=md-nav__link> <span class=md-ellipsis> 1. Support for multiple interfaces of JS/CSS </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_media.MediaMeta--2-media-are-first-resolved-relative-to-class-definition-file class=md-nav__link> <span class=md-ellipsis> 2. Media are first resolved relative to class definition file </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_media.MediaMeta--3-media-can-be-defined-as-str-bytes-pathlike-safestring-or-function-of-thereof class=md-nav__link> <span class=md-ellipsis> 3. Media can be defined as str, bytes, PathLike, SafeString, or function of thereof </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_media.MediaMeta--4-subclass-media-class-with-media_class class=md-nav__link> <span class=md-ellipsis> 4. Subclass wzxhzdk:17 class with wzxhzdk:18 </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.component_registry class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;component_registry </span> </a> <nav class=md-nav aria-label= component_registry> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.component_registry.registry class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;registry </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_registry.ComponentRegistry class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ComponentRegistry </span> </a> <nav class=md-nav aria-label= ComponentRegistry> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.component_registry.ComponentRegistry.library class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;library </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_registry.ComponentRegistry.all class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;all </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_registry.ComponentRegistry.clear class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;clear </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_registry.ComponentRegistry.get class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_registry.ComponentRegistry.register class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;register </span> </a> </li> <li class=md-nav__item> <a href=#django_components.component_registry.ComponentRegistry.unregister class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;unregister </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.component_registry.register class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;register </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.context class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;context </span> </a> <nav class=md-nav aria-label= context> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.context.copy_forloop_context class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;copy_forloop_context </span> </a> </li> <li class=md-nav__item> <a href=#django_components.context.get_injected_context_var class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_injected_context_var </span> </a> </li> <li class=md-nav__item> <a href=#django_components.context.prepare_context class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;prepare_context </span> </a> </li> <li class=md-nav__item> <a href=#django_components.context.set_component_id class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;set_component_id </span> </a> </li> <li class=md-nav__item> <a href=#django_components.context.set_provided_context_var class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;set_provided_context_var </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.expression class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;expression </span> </a> <nav class=md-nav aria-label= expression> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.expression.process_aggregate_kwargs class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;process_aggregate_kwargs </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.library class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;library </span> </a> <nav class=md-nav aria-label= library> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.library.PROTECTED_TAGS class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;PROTECTED_TAGS </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.logger class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;logger </span> </a> <nav class=md-nav aria-label= logger> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.logger.trace class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;trace </span> </a> </li> <li class=md-nav__item> <a href=#django_components.logger.trace_msg class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;trace_msg </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.management class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;management </span> </a> <nav class=md-nav aria-label= management> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.management.commands class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;commands </span> </a> <nav class=md-nav aria-label= commands> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.management.commands.upgradecomponent class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;upgradecomponent </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.middleware class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;middleware </span> </a> <nav class=md-nav aria-label= middleware> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.middleware.ComponentDependencyMiddleware class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ComponentDependencyMiddleware </span> </a> </li> <li class=md-nav__item> <a href=#django_components.middleware.DependencyReplacer class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;DependencyReplacer </span> </a> </li> <li class=md-nav__item> <a href=#django_components.middleware.join_media class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;join_media </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.node class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;node </span> </a> <nav class=md-nav aria-label= node> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.node.BaseNode class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;BaseNode </span> </a> </li> <li class=md-nav__item> <a href=#django_components.node.get_node_children class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_node_children </span> </a> </li> <li class=md-nav__item> <a href=#django_components.node.get_template_for_include_node class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_template_for_include_node </span> </a> </li> <li class=md-nav__item> <a href=#django_components.node.walk_nodelist class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;walk_nodelist </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.provide class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;provide </span> </a> <nav class=md-nav aria-label= provide> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.provide.ProvideNode class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ProvideNode </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.safer_staticfiles class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;safer_staticfiles </span> </a> <nav class=md-nav aria-label= safer_staticfiles> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.safer_staticfiles.apps class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;apps </span> </a> <nav class=md-nav aria-label= apps> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.safer_staticfiles.apps.SaferStaticFilesConfig class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;SaferStaticFilesConfig </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.slots class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;slots </span> </a> <nav class=md-nav aria-label= slots> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.slots.FillContent class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;FillContent </span> </a> </li> <li class=md-nav__item> <a href=#django_components.slots.FillNode class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;FillNode </span> </a> </li> <li class=md-nav__item> <a href=#django_components.slots.Slot class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Slot </span> </a> </li> <li class=md-nav__item> <a href=#django_components.slots.SlotFill class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;SlotFill </span> </a> </li> <li class=md-nav__item> <a href=#django_components.slots.SlotNode class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;SlotNode </span> </a> </li> <li class=md-nav__item> <a href=#django_components.slots.SlotRef class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;SlotRef </span> </a> </li> <li class=md-nav__item> <a href=#django_components.slots.parse_slot_fill_nodes_from_component_nodelist class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;parse_slot_fill_nodes_from_component_nodelist </span> </a> </li> <li class=md-nav__item> <a href=#django_components.slots.resolve_slots class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;resolve_slots </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;tag_formatter </span> </a> <nav class=md-nav aria-label= tag_formatter> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.tag_formatter.ComponentFormatter class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ComponentFormatter </span> </a> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.InternalTagFormatter class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;InternalTagFormatter </span> </a> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.ShorthandComponentFormatter class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ShorthandComponentFormatter </span> </a> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.TagFormatterABC class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;TagFormatterABC </span> </a> <nav class=md-nav aria-label= TagFormatterABC> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.tag_formatter.TagFormatterABC.end_tag class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;end_tag </span> </a> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.TagFormatterABC.parse class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;parse </span> </a> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.TagFormatterABC.start_tag class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;start_tag </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.TagResult class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;TagResult </span> </a> <nav class=md-nav aria-label= TagResult> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.tag_formatter.TagResult.component_name class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;component_name </span> </a> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.TagResult.tokens class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;tokens </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.tag_formatter.get_tag_formatter class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;get_tag_formatter </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.template_loader class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;template_loader </span> </a> <nav class=md-nav aria-label= template_loader> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.template_loader.Loader class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;Loader </span> </a> <nav class=md-nav aria-label= Loader> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.template_loader.Loader.get_dirs class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_dirs </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.template_parser class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;template_parser </span> </a> <nav class=md-nav aria-label= template_parser> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.template_parser.parse_bits class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;parse_bits </span> </a> </li> <li class=md-nav__item> <a href=#django_components.template_parser.token_kwargs class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;token_kwargs </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.templatetags class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;templatetags </span> </a> <nav class=md-nav aria-label= templatetags> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.templatetags.component_tags class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;component_tags </span> </a> <nav class=md-nav aria-label= component_tags> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.templatetags.component_tags.component class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;component </span> </a> </li> <li class=md-nav__item> <a href=#django_components.templatetags.component_tags.component_css_dependencies class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;component_css_dependencies </span> </a> </li> <li class=md-nav__item> <a href=#django_components.templatetags.component_tags.component_dependencies class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;component_dependencies </span> </a> </li> <li class=md-nav__item> <a href=#django_components.templatetags.component_tags.component_js_dependencies class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;component_js_dependencies </span> </a> </li> <li class=md-nav__item> <a href=#django_components.templatetags.component_tags.fill class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;fill </span> </a> </li> <li class=md-nav__item> <a href=#django_components.templatetags.component_tags.html_attrs class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;html_attrs </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#django_components.types class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;types </span> </a> </li> <li class=md-nav__item> <a href=#django_components.utils class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;utils </span> </a> <nav class=md-nav aria-label= utils> <ul class=md-nav__list> <li class=md-nav__item> <a href=#django_components.utils.gen_id class=md-nav__link> <span class=md-ellipsis> <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;gen_id </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <a href=https://github.com/EmilStenstrom/django-components/edit/master/src/django_components/__init__.py title="Edit this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4v-2m10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1 2.1 2.1Z"/></svg> </a> <a href=https://github.com/EmilStenstrom/django-components/raw/master/src/django_components/__init__.py title="View source of this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.15 8.15 0 0 1-1.23-2Z"/></svg> </a> <div class="doc doc-object doc-module"> <h1 id=django_components class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">django_components</span> <a href=#django_components class=headerlink title="Permanent link">¤</a></h1> <div class="doc doc-contents first"> <p>Main package for Django Components.</p> <div class="doc doc-children"> <div class="doc doc-object doc-module"> <h2 id=django_components.app_settings class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">app_settings</span> <a href=#django_components.app_settings class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.app_settings.ContextBehavior class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ContextBehavior</span> <a href=#django_components.app_settings.ContextBehavior class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></code>, <code><a class="autorefs autorefs-external" title=enum.Enum href=https://docs.python.org/3.12/library/enum.html#enum.Enum>Enum</a></code></p> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h4 id=django_components.app_settings.ContextBehavior.DJANGO class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">DJANGO</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.app_settings.ContextBehavior.DJANGO class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>DJANGO</span> <span class=o>=</span> <span class=s1>&#39;django&#39;</span>
</code></pre></div> <div class="doc doc-contents "> <p>With this setting, component fills behave as usual Django tags. That is, they enrich the context, and pass it along.</p> <ol> <li>Component fills use the context of the component they are within.</li> <li>Variables from <code>get_context_data</code> are available to the component fill.</li> </ol> <p>Example:</p> <p>Given this template <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>with</span> <span class=nv>cheese</span><span class=o>=</span><span class=s2>&quot;feta&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> </span><span class=cp>{%</span> <span class=k>component</span> <span class=s1>&#39;my_comp&#39;</span> <span class=cp>%}</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> </span><span class=cp>{{</span> <span class=nv>my_var</span> <span class=cp>}}</span><span class=x> # my_var</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=x> </span><span class=cp>{{</span> <span class=nv>cheese</span> <span class=cp>}}</span><span class=x> # cheese</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=x> </span><span class=cp>{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=cp>{%</span> <span class=k>endwith</span> <span class=cp>%}</span>
</code></pre></div></p> <p>and this context returned from the <code>get_context_data()</code> method <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=p>{</span> <span class=s2>&quot;my_var&quot;</span><span class=p>:</span> <span class=mi>123</span> <span class=p>}</span>
</code></pre></div></p> <p>Then if component "my_comp" defines context <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=p>{</span> <span class=s2>&quot;my_var&quot;</span><span class=p>:</span> <span class=mi>456</span> <span class=p>}</span>
</code></pre></div></p> <p>Then this will render: <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a><span class=x>456 # my_var</span>
<a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a><span class=x>feta # cheese</span>
</code></pre></div></p> <p>Because "my_comp" overrides the variable "my_var", so <code>{{ my_var }}</code> equals <code>456</code>.</p> <p>And variable "cheese" will equal <code>feta</code>, because the fill CAN access the current context.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.app_settings.ContextBehavior.ISOLATED class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">ISOLATED</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.app_settings.ContextBehavior.ISOLATED class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>ISOLATED</span> <span class=o>=</span> <span class=s1>&#39;isolated&#39;</span>
</code></pre></div> <div class="doc doc-contents "> <p>This setting makes the component fills behave similar to Vue or React, where the fills use EXCLUSIVELY the context variables defined in <code>get_context_data</code>.</p> <p>Example:</p> <p>Given this template <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>with</span> <span class=nv>cheese</span><span class=o>=</span><span class=s2>&quot;feta&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> </span><span class=cp>{%</span> <span class=k>component</span> <span class=s1>&#39;my_comp&#39;</span> <span class=cp>%}</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> </span><span class=cp>{{</span> <span class=nv>my_var</span> <span class=cp>}}</span><span class=x> # my_var</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=x> </span><span class=cp>{{</span> <span class=nv>cheese</span> <span class=cp>}}</span><span class=x> # cheese</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=x> </span><span class=cp>{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=cp>{%</span> <span class=k>endwith</span> <span class=cp>%}</span>
</code></pre></div></p> <p>and this context returned from the <code>get_context_data()</code> method <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=p>{</span> <span class=s2>&quot;my_var&quot;</span><span class=p>:</span> <span class=mi>123</span> <span class=p>}</span>
</code></pre></div></p> <p>Then if component "my_comp" defines context <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=p>{</span> <span class=s2>&quot;my_var&quot;</span><span class=p>:</span> <span class=mi>456</span> <span class=p>}</span>
</code></pre></div></p> <p>Then this will render: <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a><span class=x>123 # my_var</span>
<a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a><span class=x> # cheese</span>
</code></pre></div></p> <p>Because both variables "my_var" and "cheese" are taken from the root context. Since "cheese" is not defined in root context, it's empty.</p> </div> </div> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.attributes class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">attributes</span> <a href=#django_components.attributes class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.attributes.append_attributes class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">append_attributes</span> <a href=#django_components.attributes.append_attributes class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>append_attributes</span><span class=p>(</span><span class=o>*</span><span class=n>args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Tuple href=https://docs.python.org/3.12/library/typing.html#typing.Tuple>Tuple</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Merges the key-value pairs and returns a new dictionary.</p> <p>If a key is present multiple times, its values are concatenated with a space character as separator in the final dictionary.</p> <details class=quote> <summary>Source code in <code>src/django_components/attributes.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-71>71</a></span>
<span class=normal><a href=#__codelineno-0-72>72</a></span>
<span class=normal><a href=#__codelineno-0-73>73</a></span>
<span class=normal><a href=#__codelineno-0-74>74</a></span>
<span class=normal><a href=#__codelineno-0-75>75</a></span>
<span class=normal><a href=#__codelineno-0-76>76</a></span>
<span class=normal><a href=#__codelineno-0-77>77</a></span>
<span class=normal><a href=#__codelineno-0-78>78</a></span>
<span class=normal><a href=#__codelineno-0-79>79</a></span>
<span class=normal><a href=#__codelineno-0-80>80</a></span>
<span class=normal><a href=#__codelineno-0-81>81</a></span>
<span class=normal><a href=#__codelineno-0-82>82</a></span>
<span class=normal><a href=#__codelineno-0-83>83</a></span>
<span class=normal><a href=#__codelineno-0-84>84</a></span>
<span class=normal><a href=#__codelineno-0-85>85</a></span>
<span class=normal><a href=#__codelineno-0-86>86</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-71 name=__codelineno-0-71></a><span class=k>def</span> <span class=nf>append_attributes</span><span class=p>(</span><span class=o>*</span><span class=n>args</span><span class=p>:</span> <span class=n>Tuple</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n>Dict</span><span class=p>:</span>
<a id=__codelineno-0-72 name=__codelineno-0-72></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-73 name=__codelineno-0-73></a><span class=sd> Merges the key-value pairs and returns a new dictionary.</span>
<a id=__codelineno-0-74 name=__codelineno-0-74></a>
<a id=__codelineno-0-75 name=__codelineno-0-75></a><span class=sd> If a key is present multiple times, its values are concatenated with a space</span>
<a id=__codelineno-0-76 name=__codelineno-0-76></a><span class=sd> character as separator in the final dictionary.</span>
<a id=__codelineno-0-77 name=__codelineno-0-77></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-78 name=__codelineno-0-78></a> <span class=n>result</span><span class=p>:</span> <span class=n>Dict</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a>
<a id=__codelineno-0-80 name=__codelineno-0-80></a> <span class=k>for</span> <span class=n>key</span><span class=p>,</span> <span class=n>value</span> <span class=ow>in</span> <span class=n>args</span><span class=p>:</span>
<a id=__codelineno-0-81 name=__codelineno-0-81></a> <span class=k>if</span> <span class=n>key</span> <span class=ow>in</span> <span class=n>result</span><span class=p>:</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a> <span class=n>result</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>+=</span> <span class=s2>&quot; &quot;</span> <span class=o>+</span> <span class=n>value</span>
<a id=__codelineno-0-83 name=__codelineno-0-83></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-84 name=__codelineno-0-84></a> <span class=n>result</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>=</span> <span class=n>value</span>
<a id=__codelineno-0-85 name=__codelineno-0-85></a>
<a id=__codelineno-0-86 name=__codelineno-0-86></a> <span class=k>return</span> <span class=n>result</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.attributes.attributes_to_string class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">attributes_to_string</span> <a href=#django_components.attributes.attributes_to_string class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>attributes_to_string</span><span class=p>(</span><span class=n>attributes</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Mapping href=https://docs.python.org/3.12/library/typing.html#typing.Mapping>Mapping</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Convert a dict of attributes to a string.</p> <details class=quote> <summary>Source code in <code>src/django_components/attributes.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-56>56</a></span>
<span class=normal><a href=#__codelineno-0-57>57</a></span>
<span class=normal><a href=#__codelineno-0-58>58</a></span>
<span class=normal><a href=#__codelineno-0-59>59</a></span>
<span class=normal><a href=#__codelineno-0-60>60</a></span>
<span class=normal><a href=#__codelineno-0-61>61</a></span>
<span class=normal><a href=#__codelineno-0-62>62</a></span>
<span class=normal><a href=#__codelineno-0-63>63</a></span>
<span class=normal><a href=#__codelineno-0-64>64</a></span>
<span class=normal><a href=#__codelineno-0-65>65</a></span>
<span class=normal><a href=#__codelineno-0-66>66</a></span>
<span class=normal><a href=#__codelineno-0-67>67</a></span>
<span class=normal><a href=#__codelineno-0-68>68</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-56 name=__codelineno-0-56></a><span class=k>def</span> <span class=nf>attributes_to_string</span><span class=p>(</span><span class=n>attributes</span><span class=p>:</span> <span class=n>Mapping</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>])</span> <span class=o>-&gt;</span> <span class=nb>str</span><span class=p>:</span>
<a id=__codelineno-0-57 name=__codelineno-0-57></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Convert a dict of attributes to a string.&quot;&quot;&quot;</span>
<a id=__codelineno-0-58 name=__codelineno-0-58></a> <span class=n>attr_list</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-59 name=__codelineno-0-59></a>
<a id=__codelineno-0-60 name=__codelineno-0-60></a> <span class=k>for</span> <span class=n>key</span><span class=p>,</span> <span class=n>value</span> <span class=ow>in</span> <span class=n>attributes</span><span class=o>.</span><span class=n>items</span><span class=p>():</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a> <span class=k>if</span> <span class=n>value</span> <span class=ow>is</span> <span class=kc>None</span> <span class=ow>or</span> <span class=n>value</span> <span class=ow>is</span> <span class=kc>False</span><span class=p>:</span>
<a id=__codelineno-0-62 name=__codelineno-0-62></a> <span class=k>continue</span>
<a id=__codelineno-0-63 name=__codelineno-0-63></a> <span class=k>if</span> <span class=n>value</span> <span class=ow>is</span> <span class=kc>True</span><span class=p>:</span>
<a id=__codelineno-0-64 name=__codelineno-0-64></a> <span class=n>attr_list</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>conditional_escape</span><span class=p>(</span><span class=n>key</span><span class=p>))</span>
<a id=__codelineno-0-65 name=__codelineno-0-65></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-66 name=__codelineno-0-66></a> <span class=n>attr_list</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>format_html</span><span class=p>(</span><span class=s1>&#39;</span><span class=si>{}</span><span class=s1>=&quot;</span><span class=si>{}</span><span class=s1>&quot;&#39;</span><span class=p>,</span> <span class=n>key</span><span class=p>,</span> <span class=n>value</span><span class=p>))</span>
<a id=__codelineno-0-67 name=__codelineno-0-67></a>
<a id=__codelineno-0-68 name=__codelineno-0-68></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=n>SafeString</span><span class=p>(</span><span class=s2>&quot; &quot;</span><span class=p>)</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>attr_list</span><span class=p>))</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.autodiscover class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">autodiscover</span> <a href=#django_components.autodiscover class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.autodiscover.autodiscover class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">autodiscover</span> <a href=#django_components.autodiscover.autodiscover class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>autodiscover</span><span class=p>(</span><span class=n>map_module</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>[[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>],</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Search for component files and import them. Returns a list of module paths of imported files.</p> <p>Autodiscover searches in the locations as defined by <code>Loader.get_dirs</code>.</p> <p>You can map the module paths with <code>map_module</code> function. This serves as an escape hatch for when you need to use this function in tests.</p> <details class=quote> <summary>Source code in <code>src/django_components/autodiscover.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-14>14</a></span>
<span class=normal><a href=#__codelineno-0-15>15</a></span>
<span class=normal><a href=#__codelineno-0-16>16</a></span>
<span class=normal><a href=#__codelineno-0-17>17</a></span>
<span class=normal><a href=#__codelineno-0-18>18</a></span>
<span class=normal><a href=#__codelineno-0-19>19</a></span>
<span class=normal><a href=#__codelineno-0-20>20</a></span>
<span class=normal><a href=#__codelineno-0-21>21</a></span>
<span class=normal><a href=#__codelineno-0-22>22</a></span>
<span class=normal><a href=#__codelineno-0-23>23</a></span>
<span class=normal><a href=#__codelineno-0-24>24</a></span>
<span class=normal><a href=#__codelineno-0-25>25</a></span>
<span class=normal><a href=#__codelineno-0-26>26</a></span>
<span class=normal><a href=#__codelineno-0-27>27</a></span>
<span class=normal><a href=#__codelineno-0-28>28</a></span>
<span class=normal><a href=#__codelineno-0-29>29</a></span>
<span class=normal><a href=#__codelineno-0-30>30</a></span>
<span class=normal><a href=#__codelineno-0-31>31</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-14 name=__codelineno-0-14></a><span class=k>def</span> <span class=nf>autodiscover</span><span class=p>(</span>
<a id=__codelineno-0-15 name=__codelineno-0-15></a> <span class=n>map_module</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Callable</span><span class=p>[[</span><span class=nb>str</span><span class=p>],</span> <span class=nb>str</span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-16 name=__codelineno-0-16></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=nb>str</span><span class=p>]:</span>
<a id=__codelineno-0-17 name=__codelineno-0-17></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-18 name=__codelineno-0-18></a><span class=sd> Search for component files and import them. Returns a list of module</span>
<a id=__codelineno-0-19 name=__codelineno-0-19></a><span class=sd> paths of imported files.</span>
<a id=__codelineno-0-20 name=__codelineno-0-20></a>
<a id=__codelineno-0-21 name=__codelineno-0-21></a><span class=sd> Autodiscover searches in the locations as defined by `Loader.get_dirs`.</span>
<a id=__codelineno-0-22 name=__codelineno-0-22></a>
<a id=__codelineno-0-23 name=__codelineno-0-23></a><span class=sd> You can map the module paths with `map_module` function. This serves</span>
<a id=__codelineno-0-24 name=__codelineno-0-24></a><span class=sd> as an escape hatch for when you need to use this function in tests.</span>
<a id=__codelineno-0-25 name=__codelineno-0-25></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-26 name=__codelineno-0-26></a> <span class=n>dirs</span> <span class=o>=</span> <span class=n>get_dirs</span><span class=p>()</span>
<a id=__codelineno-0-27 name=__codelineno-0-27></a> <span class=n>component_filepaths</span> <span class=o>=</span> <span class=n>search_dirs</span><span class=p>(</span><span class=n>dirs</span><span class=p>,</span> <span class=s2>&quot;**/*.py&quot;</span><span class=p>)</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a> <span class=n>logger</span><span class=o>.</span><span class=n>debug</span><span class=p>(</span><span class=sa>f</span><span class=s2>&quot;Autodiscover found </span><span class=si>{</span><span class=nb>len</span><span class=p>(</span><span class=n>component_filepaths</span><span class=p>)</span><span class=si>}</span><span class=s2> files in component directories.&quot;</span><span class=p>)</span>
<a id=__codelineno-0-29 name=__codelineno-0-29></a>
<a id=__codelineno-0-30 name=__codelineno-0-30></a> <span class=n>modules</span> <span class=o>=</span> <span class=p>[</span><span class=n>_filepath_to_python_module</span><span class=p>(</span><span class=n>filepath</span><span class=p>)</span> <span class=k>for</span> <span class=n>filepath</span> <span class=ow>in</span> <span class=n>component_filepaths</span><span class=p>]</span>
<a id=__codelineno-0-31 name=__codelineno-0-31></a> <span class=k>return</span> <span class=n>_import_modules</span><span class=p>(</span><span class=n>modules</span><span class=p>,</span> <span class=n>map_module</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.autodiscover.get_dirs class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_dirs</span> <a href=#django_components.autodiscover.get_dirs class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>get_dirs</span><span class=p>(</span><span class=n>engine</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django.template.engine.Engine>Engine</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Helper for using django_component's FilesystemLoader class to obtain a list of directories where component python files may be defined.</p> <details class=quote> <summary>Source code in <code>src/django_components/autodiscover.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-92> 92</a></span>
<span class=normal><a href=#__codelineno-0-93> 93</a></span>
<span class=normal><a href=#__codelineno-0-94> 94</a></span>
<span class=normal><a href=#__codelineno-0-95> 95</a></span>
<span class=normal><a href=#__codelineno-0-96> 96</a></span>
<span class=normal><a href=#__codelineno-0-97> 97</a></span>
<span class=normal><a href=#__codelineno-0-98> 98</a></span>
<span class=normal><a href=#__codelineno-0-99> 99</a></span>
<span class=normal><a href=#__codelineno-0-100>100</a></span>
<span class=normal><a href=#__codelineno-0-101>101</a></span>
<span class=normal><a href=#__codelineno-0-102>102</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-92 name=__codelineno-0-92></a><span class=k>def</span> <span class=nf>get_dirs</span><span class=p>(</span><span class=n>engine</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Engine</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=n>Path</span><span class=p>]:</span>
<a id=__codelineno-0-93 name=__codelineno-0-93></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-94 name=__codelineno-0-94></a><span class=sd> Helper for using django_component&#39;s FilesystemLoader class to obtain a list</span>
<a id=__codelineno-0-95 name=__codelineno-0-95></a><span class=sd> of directories where component python files may be defined.</span>
<a id=__codelineno-0-96 name=__codelineno-0-96></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-97 name=__codelineno-0-97></a> <span class=n>current_engine</span> <span class=o>=</span> <span class=n>engine</span>
<a id=__codelineno-0-98 name=__codelineno-0-98></a> <span class=k>if</span> <span class=n>current_engine</span> <span class=ow>is</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-99 name=__codelineno-0-99></a> <span class=n>current_engine</span> <span class=o>=</span> <span class=n>Engine</span><span class=o>.</span><span class=n>get_default</span><span class=p>()</span>
<a id=__codelineno-0-100 name=__codelineno-0-100></a>
<a id=__codelineno-0-101 name=__codelineno-0-101></a> <span class=n>loader</span> <span class=o>=</span> <span class=n>Loader</span><span class=p>(</span><span class=n>current_engine</span><span class=p>)</span>
<a id=__codelineno-0-102 name=__codelineno-0-102></a> <span class=k>return</span> <span class=n>loader</span><span class=o>.</span><span class=n>get_dirs</span><span class=p>()</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.autodiscover.import_libraries class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">import_libraries</span> <a href=#django_components.autodiscover.import_libraries class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>import_libraries</span><span class=p>(</span><span class=n>map_module</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>[[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>],</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Import modules set in <code>COMPONENTS.libraries</code> setting.</p> <p>You can map the module paths with <code>map_module</code> function. This serves as an escape hatch for when you need to use this function in tests.</p> <details class=quote> <summary>Source code in <code>src/django_components/autodiscover.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-34>34</a></span>
<span class=normal><a href=#__codelineno-0-35>35</a></span>
<span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span>
<span class=normal><a href=#__codelineno-0-41>41</a></span>
<span class=normal><a href=#__codelineno-0-42>42</a></span>
<span class=normal><a href=#__codelineno-0-43>43</a></span>
<span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-34 name=__codelineno-0-34></a><span class=k>def</span> <span class=nf>import_libraries</span><span class=p>(</span>
<a id=__codelineno-0-35 name=__codelineno-0-35></a> <span class=n>map_module</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Callable</span><span class=p>[[</span><span class=nb>str</span><span class=p>],</span> <span class=nb>str</span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-36 name=__codelineno-0-36></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=nb>str</span><span class=p>]:</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-38 name=__codelineno-0-38></a><span class=sd> Import modules set in `COMPONENTS.libraries` setting.</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a>
<a id=__codelineno-0-40 name=__codelineno-0-40></a><span class=sd> You can map the module paths with `map_module` function. This serves</span>
<a id=__codelineno-0-41 name=__codelineno-0-41></a><span class=sd> as an escape hatch for when you need to use this function in tests.</span>
<a id=__codelineno-0-42 name=__codelineno-0-42></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-43 name=__codelineno-0-43></a> <span class=kn>from</span> <span class=nn>django_components.app_settings</span> <span class=kn>import</span> <span class=n>app_settings</span>
<a id=__codelineno-0-44 name=__codelineno-0-44></a>
<a id=__codelineno-0-45 name=__codelineno-0-45></a> <span class=k>return</span> <span class=n>_import_modules</span><span class=p>(</span><span class=n>app_settings</span><span class=o>.</span><span class=n>LIBRARIES</span><span class=p>,</span> <span class=n>map_module</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.autodiscover.search_dirs class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">search_dirs</span> <a href=#django_components.autodiscover.search_dirs class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>search_dirs</span><span class=p>(</span><span class=n>dirs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a></span><span class=p>],</span> <span class=n>search_glob</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Search the directories for the given glob pattern. Glob search results are returned as a flattened list.</p> <details class=quote> <summary>Source code in <code>src/django_components/autodiscover.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-105>105</a></span>
<span class=normal><a href=#__codelineno-0-106>106</a></span>
<span class=normal><a href=#__codelineno-0-107>107</a></span>
<span class=normal><a href=#__codelineno-0-108>108</a></span>
<span class=normal><a href=#__codelineno-0-109>109</a></span>
<span class=normal><a href=#__codelineno-0-110>110</a></span>
<span class=normal><a href=#__codelineno-0-111>111</a></span>
<span class=normal><a href=#__codelineno-0-112>112</a></span>
<span class=normal><a href=#__codelineno-0-113>113</a></span>
<span class=normal><a href=#__codelineno-0-114>114</a></span>
<span class=normal><a href=#__codelineno-0-115>115</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-105 name=__codelineno-0-105></a><span class=k>def</span> <span class=nf>search_dirs</span><span class=p>(</span><span class=n>dirs</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>Path</span><span class=p>],</span> <span class=n>search_glob</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=n>Path</span><span class=p>]:</span>
<a id=__codelineno-0-106 name=__codelineno-0-106></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-107 name=__codelineno-0-107></a><span class=sd> Search the directories for the given glob pattern. Glob search results are returned</span>
<a id=__codelineno-0-108 name=__codelineno-0-108></a><span class=sd> as a flattened list.</span>
<a id=__codelineno-0-109 name=__codelineno-0-109></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-110 name=__codelineno-0-110></a> <span class=n>matched_files</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>Path</span><span class=p>]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-111 name=__codelineno-0-111></a> <span class=k>for</span> <span class=n>directory</span> <span class=ow>in</span> <span class=n>dirs</span><span class=p>:</span>
<a id=__codelineno-0-112 name=__codelineno-0-112></a> <span class=k>for</span> <span class=n>path</span> <span class=ow>in</span> <span class=n>glob</span><span class=o>.</span><span class=n>iglob</span><span class=p>(</span><span class=nb>str</span><span class=p>(</span><span class=n>Path</span><span class=p>(</span><span class=n>directory</span><span class=p>)</span> <span class=o>/</span> <span class=n>search_glob</span><span class=p>),</span> <span class=n>recursive</span><span class=o>=</span><span class=kc>True</span><span class=p>):</span>
<a id=__codelineno-0-113 name=__codelineno-0-113></a> <span class=n>matched_files</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>Path</span><span class=p>(</span><span class=n>path</span><span class=p>))</span>
<a id=__codelineno-0-114 name=__codelineno-0-114></a>
<a id=__codelineno-0-115 name=__codelineno-0-115></a> <span class=k>return</span> <span class=n>matched_files</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.component class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">component</span> <a href=#django_components.component class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.component.Component class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Component</span> <a href=#django_components.component.Component class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>Component</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>registered_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>component_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>outer_context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django.template.context.Context>Context</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>fill_content</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.slots.FillContent href=slots/#django_components.slots.FillContent>FillContent</a></span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=typing.Generic href=https://docs.python.org/3.12/library/typing.html#typing.Generic>Generic</a>[<span title=django_components.component.ArgsType>ArgsType</span>, <span title=django_components.component.KwargsType>KwargsType</span>, <span title=django_components.component.DataType>DataType</span>, <span title=django_components.component.SlotsType>SlotsType</span>]</code></p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-169>169</a></span>
<span class=normal><a href=#__codelineno-0-170>170</a></span>
<span class=normal><a href=#__codelineno-0-171>171</a></span>
<span class=normal><a href=#__codelineno-0-172>172</a></span>
<span class=normal><a href=#__codelineno-0-173>173</a></span>
<span class=normal><a href=#__codelineno-0-174>174</a></span>
<span class=normal><a href=#__codelineno-0-175>175</a></span>
<span class=normal><a href=#__codelineno-0-176>176</a></span>
<span class=normal><a href=#__codelineno-0-177>177</a></span>
<span class=normal><a href=#__codelineno-0-178>178</a></span>
<span class=normal><a href=#__codelineno-0-179>179</a></span>
<span class=normal><a href=#__codelineno-0-180>180</a></span>
<span class=normal><a href=#__codelineno-0-181>181</a></span>
<span class=normal><a href=#__codelineno-0-182>182</a></span>
<span class=normal><a href=#__codelineno-0-183>183</a></span>
<span class=normal><a href=#__codelineno-0-184>184</a></span>
<span class=normal><a href=#__codelineno-0-185>185</a></span>
<span class=normal><a href=#__codelineno-0-186>186</a></span>
<span class=normal><a href=#__codelineno-0-187>187</a></span>
<span class=normal><a href=#__codelineno-0-188>188</a></span>
<span class=normal><a href=#__codelineno-0-189>189</a></span>
<span class=normal><a href=#__codelineno-0-190>190</a></span>
<span class=normal><a href=#__codelineno-0-191>191</a></span>
<span class=normal><a href=#__codelineno-0-192>192</a></span>
<span class=normal><a href=#__codelineno-0-193>193</a></span>
<span class=normal><a href=#__codelineno-0-194>194</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-169 name=__codelineno-0-169></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span>
<a id=__codelineno-0-170 name=__codelineno-0-170></a> <span class=bp>self</span><span class=p>,</span>
<a id=__codelineno-0-171 name=__codelineno-0-171></a> <span class=n>registered_name</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-172 name=__codelineno-0-172></a> <span class=n>component_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-173 name=__codelineno-0-173></a> <span class=n>outer_context</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Context</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-174 name=__codelineno-0-174></a> <span class=n>fill_content</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>FillContent</span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-175 name=__codelineno-0-175></a><span class=p>):</span>
<a id=__codelineno-0-176 name=__codelineno-0-176></a> <span class=c1># When user first instantiates the component class before calling</span>
<a id=__codelineno-0-177 name=__codelineno-0-177></a> <span class=c1># `render` or `render_to_response`, then we want to allow the render</span>
<a id=__codelineno-0-178 name=__codelineno-0-178></a> <span class=c1># function to make use of the instantiated object.</span>
<a id=__codelineno-0-179 name=__codelineno-0-179></a> <span class=c1>#</span>
<a id=__codelineno-0-180 name=__codelineno-0-180></a> <span class=c1># So while `MyComp.render()` creates a new instance of MyComp internally,</span>
<a id=__codelineno-0-181 name=__codelineno-0-181></a> <span class=c1># if we do `MyComp(registered_name=&quot;abc&quot;).render()`, then we use the</span>
<a id=__codelineno-0-182 name=__codelineno-0-182></a> <span class=c1># already-instantiated object.</span>
<a id=__codelineno-0-183 name=__codelineno-0-183></a> <span class=c1>#</span>
<a id=__codelineno-0-184 name=__codelineno-0-184></a> <span class=c1># To achieve that, we want to re-assign the class methods as instance methods.</span>
<a id=__codelineno-0-185 name=__codelineno-0-185></a> <span class=c1># For that we have to &quot;unwrap&quot; the class methods via __func__.</span>
<a id=__codelineno-0-186 name=__codelineno-0-186></a> <span class=c1># See https://stackoverflow.com/a/76706399/9788634</span>
<a id=__codelineno-0-187 name=__codelineno-0-187></a> <span class=bp>self</span><span class=o>.</span><span class=n>render_to_response</span> <span class=o>=</span> <span class=n>types</span><span class=o>.</span><span class=n>MethodType</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=vm>__class__</span><span class=o>.</span><span class=n>render_to_response</span><span class=o>.</span><span class=vm>__func__</span><span class=p>,</span> <span class=bp>self</span><span class=p>)</span> <span class=c1># type: ignore</span>
<a id=__codelineno-0-188 name=__codelineno-0-188></a> <span class=bp>self</span><span class=o>.</span><span class=n>render</span> <span class=o>=</span> <span class=n>types</span><span class=o>.</span><span class=n>MethodType</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=vm>__class__</span><span class=o>.</span><span class=n>render</span><span class=o>.</span><span class=vm>__func__</span><span class=p>,</span> <span class=bp>self</span><span class=p>)</span> <span class=c1># type: ignore</span>
<a id=__codelineno-0-189 name=__codelineno-0-189></a>
<a id=__codelineno-0-190 name=__codelineno-0-190></a> <span class=bp>self</span><span class=o>.</span><span class=n>registered_name</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=n>registered_name</span>
<a id=__codelineno-0-191 name=__codelineno-0-191></a> <span class=bp>self</span><span class=o>.</span><span class=n>outer_context</span><span class=p>:</span> <span class=n>Context</span> <span class=o>=</span> <span class=n>outer_context</span> <span class=ow>or</span> <span class=n>Context</span><span class=p>()</span>
<a id=__codelineno-0-192 name=__codelineno-0-192></a> <span class=bp>self</span><span class=o>.</span><span class=n>fill_content</span> <span class=o>=</span> <span class=n>fill_content</span> <span class=ow>or</span> <span class=p>{}</span>
<a id=__codelineno-0-193 name=__codelineno-0-193></a> <span class=bp>self</span><span class=o>.</span><span class=n>component_id</span> <span class=o>=</span> <span class=n>component_id</span> <span class=ow>or</span> <span class=n>gen_id</span><span class=p>()</span>
<a id=__codelineno-0-194 name=__codelineno-0-194></a> <span class=bp>self</span><span class=o>.</span><span class=n>_render_stack</span><span class=p>:</span> <span class=n>Deque</span><span class=p>[</span><span class=n>RenderInput</span><span class=p>[</span><span class=n>ArgsType</span><span class=p>,</span> <span class=n>KwargsType</span><span class=p>,</span> <span class=n>SlotsType</span><span class=p>]]</span> <span class=o>=</span> <span class=n>deque</span><span class=p>()</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.Media class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">Media</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.component.Component.Media class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>Media</span> <span class=o>=</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.component_media.ComponentMediaInput href=component_media/#django_components.component_media.ComponentMediaInput>ComponentMediaInput</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Defines JS and CSS media files associated with this component.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.css class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">css</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.component.Component.css class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>css</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Inlined CSS associated with this component.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.input class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">input</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-property"><code>property</code></small> </span> <a href=#django_components.component.Component.input class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nb>input</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.component.RenderInput>RenderInput</span></span><span class=p>[</span><span class=n><span title=django_components.component.ArgsType>ArgsType</span></span><span class=p>,</span> <span class=n><span title=django_components.component.KwargsType>KwargsType</span></span><span class=p>,</span> <span class=n><span title=django_components.component.SlotsType>SlotsType</span></span><span class=p>]]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Input holds the data (like arg, kwargs, slots) that were passsed to the current execution of the <code>render</code> method.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.js class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">js</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.component.Component.js class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>js</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Inlined JS associated with this component.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.media class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">media</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.component.Component.media class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>media</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.component.Component.Media href=component/#django_components.component.Component.Media>Media</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Normalized definition of JS and CSS media files associated with this component.</p> <p>NOTE: This field is generated from Component.Media class.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.response_class class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">response_class</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.component.Component.response_class class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>response_class</span> <span class=o>=</span> <span class=n><a class="autorefs autorefs-external" title=django.http.HttpResponse href=https://docs.djangoproject.com/en/5.0/ref/request-response/#django.http.HttpResponse>HttpResponse</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>This allows to configure what class is used to generate response from <code>render_to_response</code></p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.template class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">template</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.component.Component.template class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>template</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Inlined Django template associated with this component.</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component.Component.template_name class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">template_name</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small> </span> <a href=#django_components.component.Component.template_name class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>template_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Relative filepath to the Django template associated with this component.</p> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component.Component.as_view class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">as_view</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small> </span> <a href=#django_components.component.Component.as_view class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>as_view</span><span class=p>(</span><span class=o>**</span><span class=n>initkwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><span title=django_components.component.ViewFn>ViewFn</span></span>
</code></pre></div> <div class="doc doc-contents "> <p>Shortcut for calling <code>Component.View.as_view</code> and passing component instance to it.</p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-316>316</a></span>
<span class=normal><a href=#__codelineno-0-317>317</a></span>
<span class=normal><a href=#__codelineno-0-318>318</a></span>
<span class=normal><a href=#__codelineno-0-319>319</a></span>
<span class=normal><a href=#__codelineno-0-320>320</a></span>
<span class=normal><a href=#__codelineno-0-321>321</a></span>
<span class=normal><a href=#__codelineno-0-322>322</a></span>
<span class=normal><a href=#__codelineno-0-323>323</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-316 name=__codelineno-0-316></a><span class=nd>@classmethod</span>
<a id=__codelineno-0-317 name=__codelineno-0-317></a><span class=k>def</span> <span class=nf>as_view</span><span class=p>(</span><span class=bp>cls</span><span class=p>,</span> <span class=o>**</span><span class=n>initkwargs</span><span class=p>:</span> <span class=n>Any</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>ViewFn</span><span class=p>:</span>
<a id=__codelineno-0-318 name=__codelineno-0-318></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-319 name=__codelineno-0-319></a><span class=sd> Shortcut for calling `Component.View.as_view` and passing component instance to it.</span>
<a id=__codelineno-0-320 name=__codelineno-0-320></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-321 name=__codelineno-0-321></a> <span class=c1># Allow the View class to access this component via `self.component`</span>
<a id=__codelineno-0-322 name=__codelineno-0-322></a> <span class=n>component</span> <span class=o>=</span> <span class=bp>cls</span><span class=p>()</span>
<a id=__codelineno-0-323 name=__codelineno-0-323></a> <span class=k>return</span> <span class=n>component</span><span class=o>.</span><span class=n>View</span><span class=o>.</span><span class=n>as_view</span><span class=p>(</span><span class=o>**</span><span class=n>initkwargs</span><span class=p>,</span> <span class=n>component</span><span class=o>=</span><span class=n>component</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component.Component.inject class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">inject</span> <a href=#django_components.component.Component.inject class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>inject</span><span class=p>(</span><span class=n>key</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>default</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Use this method to retrieve the data that was passed to a <code>{% provide %}</code> tag with the corresponding key.</p> <p>To retrieve the data, <code>inject()</code> must be called inside a component that's inside the <code>{% provide %}</code> tag.</p> <p>You may also pass a default that will be used if the <code>provide</code> tag with given key was NOT found.</p> <p>This method mut be used inside the <code>get_context_data()</code> method and raises an error if called elsewhere.</p> <p>Example:</p> <p>Given this template: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>provide</span> <span class=s2>&quot;provider&quot;</span> <span class=nv>hello</span><span class=o>=</span><span class=s2>&quot;world&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> </span><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;my_comp&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> </span><span class=cp>{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=cp>{%</span> <span class=k>endprovide</span> <span class=cp>%}</span>
</code></pre></div></p> <p>And given this definition of "my_comp" component: <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=kn>from</span> <span class=nn>django_components</span> <span class=kn>import</span> <span class=n>Component</span><span class=p>,</span> <span class=n>register</span>
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a>
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a><span class=nd>@register</span><span class=p>(</span><span class=s2>&quot;my_comp&quot;</span><span class=p>)</span>
<a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a><span class=k>class</span> <span class=nc>MyComp</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-1-5 name=__codelineno-1-5 href=#__codelineno-1-5></a> <span class=n>template</span> <span class=o>=</span> <span class=s2>&quot;hi {{ data.hello }}!&quot;</span>
<a id=__codelineno-1-6 name=__codelineno-1-6 href=#__codelineno-1-6></a> <span class=k>def</span> <span class=nf>get_context_data</span><span class=p>(</span><span class=bp>self</span><span class=p>):</span>
<a id=__codelineno-1-7 name=__codelineno-1-7 href=#__codelineno-1-7></a> <span class=n>data</span> <span class=o>=</span> <span class=bp>self</span><span class=o>.</span><span class=n>inject</span><span class=p>(</span><span class=s2>&quot;provider&quot;</span><span class=p>)</span>
<a id=__codelineno-1-8 name=__codelineno-1-8 href=#__codelineno-1-8></a> <span class=k>return</span> <span class=p>{</span><span class=s2>&quot;data&quot;</span><span class=p>:</span> <span class=n>data</span><span class=p>}</span>
</code></pre></div></p> <p>This renders into: <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a>hi world!
</code></pre></div></p> <p>As the <code>{{ data.hello }}</code> is taken from the "provider".</p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-266>266</a></span>
<span class=normal><a href=#__codelineno-0-267>267</a></span>
<span class=normal><a href=#__codelineno-0-268>268</a></span>
<span class=normal><a href=#__codelineno-0-269>269</a></span>
<span class=normal><a href=#__codelineno-0-270>270</a></span>
<span class=normal><a href=#__codelineno-0-271>271</a></span>
<span class=normal><a href=#__codelineno-0-272>272</a></span>
<span class=normal><a href=#__codelineno-0-273>273</a></span>
<span class=normal><a href=#__codelineno-0-274>274</a></span>
<span class=normal><a href=#__codelineno-0-275>275</a></span>
<span class=normal><a href=#__codelineno-0-276>276</a></span>
<span class=normal><a href=#__codelineno-0-277>277</a></span>
<span class=normal><a href=#__codelineno-0-278>278</a></span>
<span class=normal><a href=#__codelineno-0-279>279</a></span>
<span class=normal><a href=#__codelineno-0-280>280</a></span>
<span class=normal><a href=#__codelineno-0-281>281</a></span>
<span class=normal><a href=#__codelineno-0-282>282</a></span>
<span class=normal><a href=#__codelineno-0-283>283</a></span>
<span class=normal><a href=#__codelineno-0-284>284</a></span>
<span class=normal><a href=#__codelineno-0-285>285</a></span>
<span class=normal><a href=#__codelineno-0-286>286</a></span>
<span class=normal><a href=#__codelineno-0-287>287</a></span>
<span class=normal><a href=#__codelineno-0-288>288</a></span>
<span class=normal><a href=#__codelineno-0-289>289</a></span>
<span class=normal><a href=#__codelineno-0-290>290</a></span>
<span class=normal><a href=#__codelineno-0-291>291</a></span>
<span class=normal><a href=#__codelineno-0-292>292</a></span>
<span class=normal><a href=#__codelineno-0-293>293</a></span>
<span class=normal><a href=#__codelineno-0-294>294</a></span>
<span class=normal><a href=#__codelineno-0-295>295</a></span>
<span class=normal><a href=#__codelineno-0-296>296</a></span>
<span class=normal><a href=#__codelineno-0-297>297</a></span>
<span class=normal><a href=#__codelineno-0-298>298</a></span>
<span class=normal><a href=#__codelineno-0-299>299</a></span>
<span class=normal><a href=#__codelineno-0-300>300</a></span>
<span class=normal><a href=#__codelineno-0-301>301</a></span>
<span class=normal><a href=#__codelineno-0-302>302</a></span>
<span class=normal><a href=#__codelineno-0-303>303</a></span>
<span class=normal><a href=#__codelineno-0-304>304</a></span>
<span class=normal><a href=#__codelineno-0-305>305</a></span>
<span class=normal><a href=#__codelineno-0-306>306</a></span>
<span class=normal><a href=#__codelineno-0-307>307</a></span>
<span class=normal><a href=#__codelineno-0-308>308</a></span>
<span class=normal><a href=#__codelineno-0-309>309</a></span>
<span class=normal><a href=#__codelineno-0-310>310</a></span>
<span class=normal><a href=#__codelineno-0-311>311</a></span>
<span class=normal><a href=#__codelineno-0-312>312</a></span>
<span class=normal><a href=#__codelineno-0-313>313</a></span>
<span class=normal><a href=#__codelineno-0-314>314</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-266 name=__codelineno-0-266></a><span class=k>def</span> <span class=nf>inject</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>key</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span> <span class=n>default</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Any</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Any</span><span class=p>:</span>
<a id=__codelineno-0-267 name=__codelineno-0-267></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-268 name=__codelineno-0-268></a><span class=sd> Use this method to retrieve the data that was passed to a `{% provide %}` tag</span>
<a id=__codelineno-0-269 name=__codelineno-0-269></a><span class=sd> with the corresponding key.</span>
<a id=__codelineno-0-270 name=__codelineno-0-270></a>
<a id=__codelineno-0-271 name=__codelineno-0-271></a><span class=sd> To retrieve the data, `inject()` must be called inside a component that&#39;s</span>
<a id=__codelineno-0-272 name=__codelineno-0-272></a><span class=sd> inside the `{% provide %}` tag.</span>
<a id=__codelineno-0-273 name=__codelineno-0-273></a>
<a id=__codelineno-0-274 name=__codelineno-0-274></a><span class=sd> You may also pass a default that will be used if the `provide` tag with given</span>
<a id=__codelineno-0-275 name=__codelineno-0-275></a><span class=sd> key was NOT found.</span>
<a id=__codelineno-0-276 name=__codelineno-0-276></a>
<a id=__codelineno-0-277 name=__codelineno-0-277></a><span class=sd> This method mut be used inside the `get_context_data()` method and raises</span>
<a id=__codelineno-0-278 name=__codelineno-0-278></a><span class=sd> an error if called elsewhere.</span>
<a id=__codelineno-0-279 name=__codelineno-0-279></a>
<a id=__codelineno-0-280 name=__codelineno-0-280></a><span class=sd> Example:</span>
<a id=__codelineno-0-281 name=__codelineno-0-281></a>
<a id=__codelineno-0-282 name=__codelineno-0-282></a><span class=sd> Given this template:</span>
<a id=__codelineno-0-283 name=__codelineno-0-283></a><span class=sd> ```django</span>
<a id=__codelineno-0-284 name=__codelineno-0-284></a><span class=sd> {% provide &quot;provider&quot; hello=&quot;world&quot; %}</span>
<a id=__codelineno-0-285 name=__codelineno-0-285></a><span class=sd> {% component &quot;my_comp&quot; %}</span>
<a id=__codelineno-0-286 name=__codelineno-0-286></a><span class=sd> {% endcomponent %}</span>
<a id=__codelineno-0-287 name=__codelineno-0-287></a><span class=sd> {% endprovide %}</span>
<a id=__codelineno-0-288 name=__codelineno-0-288></a><span class=sd> ```</span>
<a id=__codelineno-0-289 name=__codelineno-0-289></a>
<a id=__codelineno-0-290 name=__codelineno-0-290></a><span class=sd> And given this definition of &quot;my_comp&quot; component:</span>
<a id=__codelineno-0-291 name=__codelineno-0-291></a><span class=sd> ```py</span>
<a id=__codelineno-0-292 name=__codelineno-0-292></a><span class=sd> from django_components import Component, register</span>
<a id=__codelineno-0-293 name=__codelineno-0-293></a>
<a id=__codelineno-0-294 name=__codelineno-0-294></a><span class=sd> @register(&quot;my_comp&quot;)</span>
<a id=__codelineno-0-295 name=__codelineno-0-295></a><span class=sd> class MyComp(Component):</span>
<a id=__codelineno-0-296 name=__codelineno-0-296></a><span class=sd> template = &quot;hi {{ data.hello }}!&quot;</span>
<a id=__codelineno-0-297 name=__codelineno-0-297></a><span class=sd> def get_context_data(self):</span>
<a id=__codelineno-0-298 name=__codelineno-0-298></a><span class=sd> data = self.inject(&quot;provider&quot;)</span>
<a id=__codelineno-0-299 name=__codelineno-0-299></a><span class=sd> return {&quot;data&quot;: data}</span>
<a id=__codelineno-0-300 name=__codelineno-0-300></a><span class=sd> ```</span>
<a id=__codelineno-0-301 name=__codelineno-0-301></a>
<a id=__codelineno-0-302 name=__codelineno-0-302></a><span class=sd> This renders into:</span>
<a id=__codelineno-0-303 name=__codelineno-0-303></a><span class=sd> ```</span>
<a id=__codelineno-0-304 name=__codelineno-0-304></a><span class=sd> hi world!</span>
<a id=__codelineno-0-305 name=__codelineno-0-305></a><span class=sd> ```</span>
<a id=__codelineno-0-306 name=__codelineno-0-306></a>
<a id=__codelineno-0-307 name=__codelineno-0-307></a><span class=sd> As the `{{ data.hello }}` is taken from the &quot;provider&quot;.</span>
<a id=__codelineno-0-308 name=__codelineno-0-308></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-309 name=__codelineno-0-309></a> <span class=k>if</span> <span class=bp>self</span><span class=o>.</span><span class=n>input</span> <span class=ow>is</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-310 name=__codelineno-0-310></a> <span class=k>raise</span> <span class=ne>RuntimeError</span><span class=p>(</span>
<a id=__codelineno-0-311 name=__codelineno-0-311></a> <span class=sa>f</span><span class=s2>&quot;Method &#39;inject()&#39; of component &#39;</span><span class=si>{</span><span class=bp>self</span><span class=o>.</span><span class=n>name</span><span class=si>}</span><span class=s2>&#39; was called outside of &#39;get_context_data()&#39;&quot;</span>
<a id=__codelineno-0-312 name=__codelineno-0-312></a> <span class=p>)</span>
<a id=__codelineno-0-313 name=__codelineno-0-313></a>
<a id=__codelineno-0-314 name=__codelineno-0-314></a> <span class=k>return</span> <span class=n>get_injected_context_var</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>name</span><span class=p>,</span> <span class=bp>self</span><span class=o>.</span><span class=n>input</span><span class=o>.</span><span class=n>context</span><span class=p>,</span> <span class=n>key</span><span class=p>,</span> <span class=n>default</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component.Component.render class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">render</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small> </span> <a href=#django_components.component.Component.render class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>render</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Union href=https://docs.python.org/3.12/library/typing.html#typing.Union>Union</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>],</span> <span class=n><span title=django.template.context.Context>Context</span></span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.component.ArgsType>ArgsType</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.component.KwargsType>KwargsType</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>slots</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.component.SlotsType>SlotsType</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>escape_slots_content</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span> <span class=o>=</span> <span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Render the component into a string.</p> <p>Inputs: - <code>args</code> - Positional args for the component. This is the same as calling the component as <code>{% component "my_comp" arg1 arg2 ... %}</code> - <code>kwargs</code> - Kwargs for the component. This is the same as calling the component as <code>{% component "my_comp" key1=val1 key2=val2 ... %}</code> - <code>slots</code> - Component slot fills. This is the same as pasing <code>{% fill %}</code> tags to the component. Accepts a dictionary of <code>{ slot_name: slot_content }</code> where <code>slot_content</code> can be a string or render function. - <code>escape_slots_content</code> - Whether the content from <code>slots</code> should be escaped. - <code>context</code> - A context (dictionary or Django's Context) within which the component is rendered. The keys on the context can be accessed from within the template. - NOTE: In "isolated" mode, context is NOT accessible, and data MUST be passed via component's args and kwargs.</p> <p>Example: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>MyComponent</span><span class=o>.</span><span class=n>render</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>args</span><span class=o>=</span><span class=p>[</span><span class=mi>1</span><span class=p>,</span> <span class=s2>&quot;two&quot;</span><span class=p>,</span> <span class=p>{}],</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>kwargs</span><span class=o>=</span><span class=p>{</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=s2>&quot;key&quot;</span><span class=p>:</span> <span class=mi>123</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=p>},</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>slots</span><span class=o>=</span><span class=p>{</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=s2>&quot;header&quot;</span><span class=p>:</span> <span class=s1>&#39;STATIC TEXT HERE&#39;</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> <span class=s2>&quot;footer&quot;</span><span class=p>:</span> <span class=k>lambda</span> <span class=n>ctx</span><span class=p>,</span> <span class=n>slot_kwargs</span><span class=p>,</span> <span class=n>slot_ref</span><span class=p>:</span> <span class=sa>f</span><span class=s1>&#39;CTX: </span><span class=si>{</span><span class=n>ctx</span><span class=p>[</span><span class=s1>&#39;hello&#39;</span><span class=p>]</span><span class=si>}</span><span class=s1> SLOT_DATA: </span><span class=si>{</span><span class=n>slot_kwargs</span><span class=p>[</span><span class=s1>&#39;abc&#39;</span><span class=p>]</span><span class=si>}</span><span class=s1>&#39;</span><span class=p>,</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a> <span class=p>},</span>
<a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a> <span class=n>escape_slots_content</span><span class=o>=</span><span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a><span class=p>)</span>
</code></pre></div></p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-388>388</a></span>
<span class=normal><a href=#__codelineno-0-389>389</a></span>
<span class=normal><a href=#__codelineno-0-390>390</a></span>
<span class=normal><a href=#__codelineno-0-391>391</a></span>
<span class=normal><a href=#__codelineno-0-392>392</a></span>
<span class=normal><a href=#__codelineno-0-393>393</a></span>
<span class=normal><a href=#__codelineno-0-394>394</a></span>
<span class=normal><a href=#__codelineno-0-395>395</a></span>
<span class=normal><a href=#__codelineno-0-396>396</a></span>
<span class=normal><a href=#__codelineno-0-397>397</a></span>
<span class=normal><a href=#__codelineno-0-398>398</a></span>
<span class=normal><a href=#__codelineno-0-399>399</a></span>
<span class=normal><a href=#__codelineno-0-400>400</a></span>
<span class=normal><a href=#__codelineno-0-401>401</a></span>
<span class=normal><a href=#__codelineno-0-402>402</a></span>
<span class=normal><a href=#__codelineno-0-403>403</a></span>
<span class=normal><a href=#__codelineno-0-404>404</a></span>
<span class=normal><a href=#__codelineno-0-405>405</a></span>
<span class=normal><a href=#__codelineno-0-406>406</a></span>
<span class=normal><a href=#__codelineno-0-407>407</a></span>
<span class=normal><a href=#__codelineno-0-408>408</a></span>
<span class=normal><a href=#__codelineno-0-409>409</a></span>
<span class=normal><a href=#__codelineno-0-410>410</a></span>
<span class=normal><a href=#__codelineno-0-411>411</a></span>
<span class=normal><a href=#__codelineno-0-412>412</a></span>
<span class=normal><a href=#__codelineno-0-413>413</a></span>
<span class=normal><a href=#__codelineno-0-414>414</a></span>
<span class=normal><a href=#__codelineno-0-415>415</a></span>
<span class=normal><a href=#__codelineno-0-416>416</a></span>
<span class=normal><a href=#__codelineno-0-417>417</a></span>
<span class=normal><a href=#__codelineno-0-418>418</a></span>
<span class=normal><a href=#__codelineno-0-419>419</a></span>
<span class=normal><a href=#__codelineno-0-420>420</a></span>
<span class=normal><a href=#__codelineno-0-421>421</a></span>
<span class=normal><a href=#__codelineno-0-422>422</a></span>
<span class=normal><a href=#__codelineno-0-423>423</a></span>
<span class=normal><a href=#__codelineno-0-424>424</a></span>
<span class=normal><a href=#__codelineno-0-425>425</a></span>
<span class=normal><a href=#__codelineno-0-426>426</a></span>
<span class=normal><a href=#__codelineno-0-427>427</a></span>
<span class=normal><a href=#__codelineno-0-428>428</a></span>
<span class=normal><a href=#__codelineno-0-429>429</a></span>
<span class=normal><a href=#__codelineno-0-430>430</a></span>
<span class=normal><a href=#__codelineno-0-431>431</a></span>
<span class=normal><a href=#__codelineno-0-432>432</a></span>
<span class=normal><a href=#__codelineno-0-433>433</a></span>
<span class=normal><a href=#__codelineno-0-434>434</a></span>
<span class=normal><a href=#__codelineno-0-435>435</a></span>
<span class=normal><a href=#__codelineno-0-436>436</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-388 name=__codelineno-0-388></a><span class=nd>@classmethod</span>
<a id=__codelineno-0-389 name=__codelineno-0-389></a><span class=k>def</span> <span class=nf>render</span><span class=p>(</span>
<a id=__codelineno-0-390 name=__codelineno-0-390></a> <span class=bp>cls</span><span class=p>,</span>
<a id=__codelineno-0-391 name=__codelineno-0-391></a> <span class=n>context</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Union</span><span class=p>[</span><span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>],</span> <span class=n>Context</span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-392 name=__codelineno-0-392></a> <span class=n>args</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>ArgsType</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-393 name=__codelineno-0-393></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>KwargsType</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-394 name=__codelineno-0-394></a> <span class=n>slots</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>SlotsType</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-395 name=__codelineno-0-395></a> <span class=n>escape_slots_content</span><span class=p>:</span> <span class=nb>bool</span> <span class=o>=</span> <span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-396 name=__codelineno-0-396></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=nb>str</span><span class=p>:</span>
<a id=__codelineno-0-397 name=__codelineno-0-397></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-398 name=__codelineno-0-398></a><span class=sd> Render the component into a string.</span>
<a id=__codelineno-0-399 name=__codelineno-0-399></a>
<a id=__codelineno-0-400 name=__codelineno-0-400></a><span class=sd> Inputs:</span>
<a id=__codelineno-0-401 name=__codelineno-0-401></a><span class=sd> - `args` - Positional args for the component. This is the same as calling the component</span>
<a id=__codelineno-0-402 name=__codelineno-0-402></a><span class=sd> as `{% component &quot;my_comp&quot; arg1 arg2 ... %}`</span>
<a id=__codelineno-0-403 name=__codelineno-0-403></a><span class=sd> - `kwargs` - Kwargs for the component. This is the same as calling the component</span>
<a id=__codelineno-0-404 name=__codelineno-0-404></a><span class=sd> as `{% component &quot;my_comp&quot; key1=val1 key2=val2 ... %}`</span>
<a id=__codelineno-0-405 name=__codelineno-0-405></a><span class=sd> - `slots` - Component slot fills. This is the same as pasing `{% fill %}` tags to the component.</span>
<a id=__codelineno-0-406 name=__codelineno-0-406></a><span class=sd> Accepts a dictionary of `{ slot_name: slot_content }` where `slot_content` can be a string</span>
<a id=__codelineno-0-407 name=__codelineno-0-407></a><span class=sd> or render function.</span>
<a id=__codelineno-0-408 name=__codelineno-0-408></a><span class=sd> - `escape_slots_content` - Whether the content from `slots` should be escaped.</span>
<a id=__codelineno-0-409 name=__codelineno-0-409></a><span class=sd> - `context` - A context (dictionary or Django&#39;s Context) within which the component</span>
<a id=__codelineno-0-410 name=__codelineno-0-410></a><span class=sd> is rendered. The keys on the context can be accessed from within the template.</span>
<a id=__codelineno-0-411 name=__codelineno-0-411></a><span class=sd> - NOTE: In &quot;isolated&quot; mode, context is NOT accessible, and data MUST be passed via</span>
<a id=__codelineno-0-412 name=__codelineno-0-412></a><span class=sd> component&#39;s args and kwargs.</span>
<a id=__codelineno-0-413 name=__codelineno-0-413></a>
<a id=__codelineno-0-414 name=__codelineno-0-414></a><span class=sd> Example:</span>
<a id=__codelineno-0-415 name=__codelineno-0-415></a><span class=sd> ```py</span>
<a id=__codelineno-0-416 name=__codelineno-0-416></a><span class=sd> MyComponent.render(</span>
<a id=__codelineno-0-417 name=__codelineno-0-417></a><span class=sd> args=[1, &quot;two&quot;, {}],</span>
<a id=__codelineno-0-418 name=__codelineno-0-418></a><span class=sd> kwargs={</span>
<a id=__codelineno-0-419 name=__codelineno-0-419></a><span class=sd> &quot;key&quot;: 123,</span>
<a id=__codelineno-0-420 name=__codelineno-0-420></a><span class=sd> },</span>
<a id=__codelineno-0-421 name=__codelineno-0-421></a><span class=sd> slots={</span>
<a id=__codelineno-0-422 name=__codelineno-0-422></a><span class=sd> &quot;header&quot;: &#39;STATIC TEXT HERE&#39;,</span>
<a id=__codelineno-0-423 name=__codelineno-0-423></a><span class=sd> &quot;footer&quot;: lambda ctx, slot_kwargs, slot_ref: f&#39;CTX: {ctx[&#39;hello&#39;]} SLOT_DATA: {slot_kwargs[&#39;abc&#39;]}&#39;,</span>
<a id=__codelineno-0-424 name=__codelineno-0-424></a><span class=sd> },</span>
<a id=__codelineno-0-425 name=__codelineno-0-425></a><span class=sd> escape_slots_content=False,</span>
<a id=__codelineno-0-426 name=__codelineno-0-426></a><span class=sd> )</span>
<a id=__codelineno-0-427 name=__codelineno-0-427></a><span class=sd> ```</span>
<a id=__codelineno-0-428 name=__codelineno-0-428></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-429 name=__codelineno-0-429></a> <span class=c1># This method may be called as class method or as instance method.</span>
<a id=__codelineno-0-430 name=__codelineno-0-430></a> <span class=c1># If called as class method, create a new instance.</span>
<a id=__codelineno-0-431 name=__codelineno-0-431></a> <span class=k>if</span> <span class=nb>isinstance</span><span class=p>(</span><span class=bp>cls</span><span class=p>,</span> <span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-0-432 name=__codelineno-0-432></a> <span class=n>comp</span><span class=p>:</span> <span class=n>Component</span> <span class=o>=</span> <span class=bp>cls</span>
<a id=__codelineno-0-433 name=__codelineno-0-433></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-434 name=__codelineno-0-434></a> <span class=n>comp</span> <span class=o>=</span> <span class=bp>cls</span><span class=p>()</span>
<a id=__codelineno-0-435 name=__codelineno-0-435></a>
<a id=__codelineno-0-436 name=__codelineno-0-436></a> <span class=k>return</span> <span class=n>comp</span><span class=o>.</span><span class=n>_render</span><span class=p>(</span><span class=n>context</span><span class=p>,</span> <span class=n>args</span><span class=p>,</span> <span class=n>kwargs</span><span class=p>,</span> <span class=n>slots</span><span class=p>,</span> <span class=n>escape_slots_content</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component.Component.render_css_dependencies class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">render_css_dependencies</span> <a href=#django_components.component.Component.render_css_dependencies class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>render_css_dependencies</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.utils.safestring.SafeString href=https://docs.djangoproject.com/en/5.0/ref/utils/#django.utils.safestring.SafeString>SafeString</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Render only CSS dependencies available in the media class or provided as a string.</p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-254>254</a></span>
<span class=normal><a href=#__codelineno-0-255>255</a></span>
<span class=normal><a href=#__codelineno-0-256>256</a></span>
<span class=normal><a href=#__codelineno-0-257>257</a></span>
<span class=normal><a href=#__codelineno-0-258>258</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-254 name=__codelineno-0-254></a><span class=k>def</span> <span class=nf>render_css_dependencies</span><span class=p>(</span><span class=bp>self</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>SafeString</span><span class=p>:</span>
<a id=__codelineno-0-255 name=__codelineno-0-255></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Render only CSS dependencies available in the media class or provided as a string.&quot;&quot;&quot;</span>
<a id=__codelineno-0-256 name=__codelineno-0-256></a> <span class=k>if</span> <span class=bp>self</span><span class=o>.</span><span class=n>css</span> <span class=ow>is</span> <span class=ow>not</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-257 name=__codelineno-0-257></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=sa>f</span><span class=s2>&quot;&lt;style&gt;</span><span class=si>{</span><span class=bp>self</span><span class=o>.</span><span class=n>css</span><span class=si>}</span><span class=s2>&lt;/style&gt;&quot;</span><span class=p>)</span>
<a id=__codelineno-0-258 name=__codelineno-0-258></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>media</span><span class=o>.</span><span class=n>render_css</span><span class=p>()))</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component.Component.render_dependencies class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">render_dependencies</span> <a href=#django_components.component.Component.render_dependencies class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>render_dependencies</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.utils.safestring.SafeString href=https://docs.djangoproject.com/en/5.0/ref/utils/#django.utils.safestring.SafeString>SafeString</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Helper function to render all dependencies for a component.</p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-240>240</a></span>
<span class=normal><a href=#__codelineno-0-241>241</a></span>
<span class=normal><a href=#__codelineno-0-242>242</a></span>
<span class=normal><a href=#__codelineno-0-243>243</a></span>
<span class=normal><a href=#__codelineno-0-244>244</a></span>
<span class=normal><a href=#__codelineno-0-245>245</a></span>
<span class=normal><a href=#__codelineno-0-246>246</a></span>
<span class=normal><a href=#__codelineno-0-247>247</a></span>
<span class=normal><a href=#__codelineno-0-248>248</a></span>
<span class=normal><a href=#__codelineno-0-249>249</a></span>
<span class=normal><a href=#__codelineno-0-250>250</a></span>
<span class=normal><a href=#__codelineno-0-251>251</a></span>
<span class=normal><a href=#__codelineno-0-252>252</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-240 name=__codelineno-0-240></a><span class=k>def</span> <span class=nf>render_dependencies</span><span class=p>(</span><span class=bp>self</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>SafeString</span><span class=p>:</span>
<a id=__codelineno-0-241 name=__codelineno-0-241></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Helper function to render all dependencies for a component.&quot;&quot;&quot;</span>
<a id=__codelineno-0-242 name=__codelineno-0-242></a> <span class=n>dependencies</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-243 name=__codelineno-0-243></a>
<a id=__codelineno-0-244 name=__codelineno-0-244></a> <span class=n>css_deps</span> <span class=o>=</span> <span class=bp>self</span><span class=o>.</span><span class=n>render_css_dependencies</span><span class=p>()</span>
<a id=__codelineno-0-245 name=__codelineno-0-245></a> <span class=k>if</span> <span class=n>css_deps</span><span class=p>:</span>
<a id=__codelineno-0-246 name=__codelineno-0-246></a> <span class=n>dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>css_deps</span><span class=p>)</span>
<a id=__codelineno-0-247 name=__codelineno-0-247></a>
<a id=__codelineno-0-248 name=__codelineno-0-248></a> <span class=n>js_deps</span> <span class=o>=</span> <span class=bp>self</span><span class=o>.</span><span class=n>render_js_dependencies</span><span class=p>()</span>
<a id=__codelineno-0-249 name=__codelineno-0-249></a> <span class=k>if</span> <span class=n>js_deps</span><span class=p>:</span>
<a id=__codelineno-0-250 name=__codelineno-0-250></a> <span class=n>dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>js_deps</span><span class=p>)</span>
<a id=__codelineno-0-251 name=__codelineno-0-251></a>
<a id=__codelineno-0-252 name=__codelineno-0-252></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>dependencies</span><span class=p>))</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component.Component.render_js_dependencies class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">render_js_dependencies</span> <a href=#django_components.component.Component.render_js_dependencies class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>render_js_dependencies</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.utils.safestring.SafeString href=https://docs.djangoproject.com/en/5.0/ref/utils/#django.utils.safestring.SafeString>SafeString</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Render only JS dependencies available in the media class or provided as a string.</p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-260>260</a></span>
<span class=normal><a href=#__codelineno-0-261>261</a></span>
<span class=normal><a href=#__codelineno-0-262>262</a></span>
<span class=normal><a href=#__codelineno-0-263>263</a></span>
<span class=normal><a href=#__codelineno-0-264>264</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-260 name=__codelineno-0-260></a><span class=k>def</span> <span class=nf>render_js_dependencies</span><span class=p>(</span><span class=bp>self</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>SafeString</span><span class=p>:</span>
<a id=__codelineno-0-261 name=__codelineno-0-261></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Render only JS dependencies available in the media class or provided as a string.&quot;&quot;&quot;</span>
<a id=__codelineno-0-262 name=__codelineno-0-262></a> <span class=k>if</span> <span class=bp>self</span><span class=o>.</span><span class=n>js</span> <span class=ow>is</span> <span class=ow>not</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-263 name=__codelineno-0-263></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=sa>f</span><span class=s2>&quot;&lt;script&gt;</span><span class=si>{</span><span class=bp>self</span><span class=o>.</span><span class=n>js</span><span class=si>}</span><span class=s2>&lt;/script&gt;&quot;</span><span class=p>)</span>
<a id=__codelineno-0-264 name=__codelineno-0-264></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>media</span><span class=o>.</span><span class=n>render_js</span><span class=p>()))</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component.Component.render_to_response class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">render_to_response</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small> </span> <a href=#django_components.component.Component.render_to_response class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>render_to_response</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Union href=https://docs.python.org/3.12/library/typing.html#typing.Union>Union</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>],</span> <span class=n><span title=django.template.context.Context>Context</span></span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>slots</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.component.SlotsType>SlotsType</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>escape_slots_content</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span> <span class=o>=</span> <span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.component.ArgsType>ArgsType</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.component.KwargsType>KwargsType</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=o>*</span><span class=n>response_args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> <span class=o>**</span><span class=n>response_kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.http.HttpResponse href=https://docs.djangoproject.com/en/5.0/ref/request-response/#django.http.HttpResponse>HttpResponse</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Render the component and wrap the content in the response class.</p> <p>The response class is taken from <code>Component.response_class</code>. Defaults to <code>django.http.HttpResponse</code>.</p> <p>This is the interface for the <code>django.views.View</code> class which allows us to use components as Django views with <code>component.as_view()</code>.</p> <p>Inputs: - <code>args</code> - Positional args for the component. This is the same as calling the component as <code>{% component "my_comp" arg1 arg2 ... %}</code> - <code>kwargs</code> - Kwargs for the component. This is the same as calling the component as <code>{% component "my_comp" key1=val1 key2=val2 ... %}</code> - <code>slots</code> - Component slot fills. This is the same as pasing <code>{% fill %}</code> tags to the component. Accepts a dictionary of <code>{ slot_name: slot_content }</code> where <code>slot_content</code> can be a string or render function. - <code>escape_slots_content</code> - Whether the content from <code>slots</code> should be escaped. - <code>context</code> - A context (dictionary or Django's Context) within which the component is rendered. The keys on the context can be accessed from within the template. - NOTE: In "isolated" mode, context is NOT accessible, and data MUST be passed via component's args and kwargs.</p> <p>Any additional args and kwargs are passed to the <code>response_class</code>.</p> <p>Example: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>MyComponent</span><span class=o>.</span><span class=n>render_to_response</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>args</span><span class=o>=</span><span class=p>[</span><span class=mi>1</span><span class=p>,</span> <span class=s2>&quot;two&quot;</span><span class=p>,</span> <span class=p>{}],</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>kwargs</span><span class=o>=</span><span class=p>{</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=s2>&quot;key&quot;</span><span class=p>:</span> <span class=mi>123</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=p>},</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>slots</span><span class=o>=</span><span class=p>{</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=s2>&quot;header&quot;</span><span class=p>:</span> <span class=s1>&#39;STATIC TEXT HERE&#39;</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> <span class=s2>&quot;footer&quot;</span><span class=p>:</span> <span class=k>lambda</span> <span class=n>ctx</span><span class=p>,</span> <span class=n>slot_kwargs</span><span class=p>,</span> <span class=n>slot_ref</span><span class=p>:</span> <span class=sa>f</span><span class=s1>&#39;CTX: </span><span class=si>{</span><span class=n>ctx</span><span class=p>[</span><span class=s1>&#39;hello&#39;</span><span class=p>]</span><span class=si>}</span><span class=s1> SLOT_DATA: </span><span class=si>{</span><span class=n>slot_kwargs</span><span class=p>[</span><span class=s1>&#39;abc&#39;</span><span class=p>]</span><span class=si>}</span><span class=s1>&#39;</span><span class=p>,</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a> <span class=p>},</span>
<a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a> <span class=n>escape_slots_content</span><span class=o>=</span><span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a> <span class=c1># HttpResponse input</span>
<a id=__codelineno-0-12 name=__codelineno-0-12 href=#__codelineno-0-12></a> <span class=n>status</span><span class=o>=</span><span class=mi>201</span><span class=p>,</span>
<a id=__codelineno-0-13 name=__codelineno-0-13 href=#__codelineno-0-13></a> <span class=n>headers</span><span class=o>=</span><span class=p>{</span><span class=o>...</span><span class=p>},</span>
<a id=__codelineno-0-14 name=__codelineno-0-14 href=#__codelineno-0-14></a><span class=p>)</span>
<a id=__codelineno-0-15 name=__codelineno-0-15 href=#__codelineno-0-15></a><span class=c1># HttpResponse(content=..., status=201, headers=...)</span>
</code></pre></div></p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-325>325</a></span>
<span class=normal><a href=#__codelineno-0-326>326</a></span>
<span class=normal><a href=#__codelineno-0-327>327</a></span>
<span class=normal><a href=#__codelineno-0-328>328</a></span>
<span class=normal><a href=#__codelineno-0-329>329</a></span>
<span class=normal><a href=#__codelineno-0-330>330</a></span>
<span class=normal><a href=#__codelineno-0-331>331</a></span>
<span class=normal><a href=#__codelineno-0-332>332</a></span>
<span class=normal><a href=#__codelineno-0-333>333</a></span>
<span class=normal><a href=#__codelineno-0-334>334</a></span>
<span class=normal><a href=#__codelineno-0-335>335</a></span>
<span class=normal><a href=#__codelineno-0-336>336</a></span>
<span class=normal><a href=#__codelineno-0-337>337</a></span>
<span class=normal><a href=#__codelineno-0-338>338</a></span>
<span class=normal><a href=#__codelineno-0-339>339</a></span>
<span class=normal><a href=#__codelineno-0-340>340</a></span>
<span class=normal><a href=#__codelineno-0-341>341</a></span>
<span class=normal><a href=#__codelineno-0-342>342</a></span>
<span class=normal><a href=#__codelineno-0-343>343</a></span>
<span class=normal><a href=#__codelineno-0-344>344</a></span>
<span class=normal><a href=#__codelineno-0-345>345</a></span>
<span class=normal><a href=#__codelineno-0-346>346</a></span>
<span class=normal><a href=#__codelineno-0-347>347</a></span>
<span class=normal><a href=#__codelineno-0-348>348</a></span>
<span class=normal><a href=#__codelineno-0-349>349</a></span>
<span class=normal><a href=#__codelineno-0-350>350</a></span>
<span class=normal><a href=#__codelineno-0-351>351</a></span>
<span class=normal><a href=#__codelineno-0-352>352</a></span>
<span class=normal><a href=#__codelineno-0-353>353</a></span>
<span class=normal><a href=#__codelineno-0-354>354</a></span>
<span class=normal><a href=#__codelineno-0-355>355</a></span>
<span class=normal><a href=#__codelineno-0-356>356</a></span>
<span class=normal><a href=#__codelineno-0-357>357</a></span>
<span class=normal><a href=#__codelineno-0-358>358</a></span>
<span class=normal><a href=#__codelineno-0-359>359</a></span>
<span class=normal><a href=#__codelineno-0-360>360</a></span>
<span class=normal><a href=#__codelineno-0-361>361</a></span>
<span class=normal><a href=#__codelineno-0-362>362</a></span>
<span class=normal><a href=#__codelineno-0-363>363</a></span>
<span class=normal><a href=#__codelineno-0-364>364</a></span>
<span class=normal><a href=#__codelineno-0-365>365</a></span>
<span class=normal><a href=#__codelineno-0-366>366</a></span>
<span class=normal><a href=#__codelineno-0-367>367</a></span>
<span class=normal><a href=#__codelineno-0-368>368</a></span>
<span class=normal><a href=#__codelineno-0-369>369</a></span>
<span class=normal><a href=#__codelineno-0-370>370</a></span>
<span class=normal><a href=#__codelineno-0-371>371</a></span>
<span class=normal><a href=#__codelineno-0-372>372</a></span>
<span class=normal><a href=#__codelineno-0-373>373</a></span>
<span class=normal><a href=#__codelineno-0-374>374</a></span>
<span class=normal><a href=#__codelineno-0-375>375</a></span>
<span class=normal><a href=#__codelineno-0-376>376</a></span>
<span class=normal><a href=#__codelineno-0-377>377</a></span>
<span class=normal><a href=#__codelineno-0-378>378</a></span>
<span class=normal><a href=#__codelineno-0-379>379</a></span>
<span class=normal><a href=#__codelineno-0-380>380</a></span>
<span class=normal><a href=#__codelineno-0-381>381</a></span>
<span class=normal><a href=#__codelineno-0-382>382</a></span>
<span class=normal><a href=#__codelineno-0-383>383</a></span>
<span class=normal><a href=#__codelineno-0-384>384</a></span>
<span class=normal><a href=#__codelineno-0-385>385</a></span>
<span class=normal><a href=#__codelineno-0-386>386</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-325 name=__codelineno-0-325></a><span class=nd>@classmethod</span>
<a id=__codelineno-0-326 name=__codelineno-0-326></a><span class=k>def</span> <span class=nf>render_to_response</span><span class=p>(</span>
<a id=__codelineno-0-327 name=__codelineno-0-327></a> <span class=bp>cls</span><span class=p>,</span>
<a id=__codelineno-0-328 name=__codelineno-0-328></a> <span class=n>context</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Union</span><span class=p>[</span><span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>],</span> <span class=n>Context</span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-329 name=__codelineno-0-329></a> <span class=n>slots</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>SlotsType</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-330 name=__codelineno-0-330></a> <span class=n>escape_slots_content</span><span class=p>:</span> <span class=nb>bool</span> <span class=o>=</span> <span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-331 name=__codelineno-0-331></a> <span class=n>args</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>ArgsType</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-332 name=__codelineno-0-332></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>KwargsType</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-333 name=__codelineno-0-333></a> <span class=o>*</span><span class=n>response_args</span><span class=p>:</span> <span class=n>Any</span><span class=p>,</span>
<a id=__codelineno-0-334 name=__codelineno-0-334></a> <span class=o>**</span><span class=n>response_kwargs</span><span class=p>:</span> <span class=n>Any</span><span class=p>,</span>
<a id=__codelineno-0-335 name=__codelineno-0-335></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>HttpResponse</span><span class=p>:</span>
<a id=__codelineno-0-336 name=__codelineno-0-336></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-337 name=__codelineno-0-337></a><span class=sd> Render the component and wrap the content in the response class.</span>
<a id=__codelineno-0-338 name=__codelineno-0-338></a>
<a id=__codelineno-0-339 name=__codelineno-0-339></a><span class=sd> The response class is taken from `Component.response_class`. Defaults to `django.http.HttpResponse`.</span>
<a id=__codelineno-0-340 name=__codelineno-0-340></a>
<a id=__codelineno-0-341 name=__codelineno-0-341></a><span class=sd> This is the interface for the `django.views.View` class which allows us to</span>
<a id=__codelineno-0-342 name=__codelineno-0-342></a><span class=sd> use components as Django views with `component.as_view()`.</span>
<a id=__codelineno-0-343 name=__codelineno-0-343></a>
<a id=__codelineno-0-344 name=__codelineno-0-344></a><span class=sd> Inputs:</span>
<a id=__codelineno-0-345 name=__codelineno-0-345></a><span class=sd> - `args` - Positional args for the component. This is the same as calling the component</span>
<a id=__codelineno-0-346 name=__codelineno-0-346></a><span class=sd> as `{% component &quot;my_comp&quot; arg1 arg2 ... %}`</span>
<a id=__codelineno-0-347 name=__codelineno-0-347></a><span class=sd> - `kwargs` - Kwargs for the component. This is the same as calling the component</span>
<a id=__codelineno-0-348 name=__codelineno-0-348></a><span class=sd> as `{% component &quot;my_comp&quot; key1=val1 key2=val2 ... %}`</span>
<a id=__codelineno-0-349 name=__codelineno-0-349></a><span class=sd> - `slots` - Component slot fills. This is the same as pasing `{% fill %}` tags to the component.</span>
<a id=__codelineno-0-350 name=__codelineno-0-350></a><span class=sd> Accepts a dictionary of `{ slot_name: slot_content }` where `slot_content` can be a string</span>
<a id=__codelineno-0-351 name=__codelineno-0-351></a><span class=sd> or render function.</span>
<a id=__codelineno-0-352 name=__codelineno-0-352></a><span class=sd> - `escape_slots_content` - Whether the content from `slots` should be escaped.</span>
<a id=__codelineno-0-353 name=__codelineno-0-353></a><span class=sd> - `context` - A context (dictionary or Django&#39;s Context) within which the component</span>
<a id=__codelineno-0-354 name=__codelineno-0-354></a><span class=sd> is rendered. The keys on the context can be accessed from within the template.</span>
<a id=__codelineno-0-355 name=__codelineno-0-355></a><span class=sd> - NOTE: In &quot;isolated&quot; mode, context is NOT accessible, and data MUST be passed via</span>
<a id=__codelineno-0-356 name=__codelineno-0-356></a><span class=sd> component&#39;s args and kwargs.</span>
<a id=__codelineno-0-357 name=__codelineno-0-357></a>
<a id=__codelineno-0-358 name=__codelineno-0-358></a><span class=sd> Any additional args and kwargs are passed to the `response_class`.</span>
<a id=__codelineno-0-359 name=__codelineno-0-359></a>
<a id=__codelineno-0-360 name=__codelineno-0-360></a><span class=sd> Example:</span>
<a id=__codelineno-0-361 name=__codelineno-0-361></a><span class=sd> ```py</span>
<a id=__codelineno-0-362 name=__codelineno-0-362></a><span class=sd> MyComponent.render_to_response(</span>
<a id=__codelineno-0-363 name=__codelineno-0-363></a><span class=sd> args=[1, &quot;two&quot;, {}],</span>
<a id=__codelineno-0-364 name=__codelineno-0-364></a><span class=sd> kwargs={</span>
<a id=__codelineno-0-365 name=__codelineno-0-365></a><span class=sd> &quot;key&quot;: 123,</span>
<a id=__codelineno-0-366 name=__codelineno-0-366></a><span class=sd> },</span>
<a id=__codelineno-0-367 name=__codelineno-0-367></a><span class=sd> slots={</span>
<a id=__codelineno-0-368 name=__codelineno-0-368></a><span class=sd> &quot;header&quot;: &#39;STATIC TEXT HERE&#39;,</span>
<a id=__codelineno-0-369 name=__codelineno-0-369></a><span class=sd> &quot;footer&quot;: lambda ctx, slot_kwargs, slot_ref: f&#39;CTX: {ctx[&#39;hello&#39;]} SLOT_DATA: {slot_kwargs[&#39;abc&#39;]}&#39;,</span>
<a id=__codelineno-0-370 name=__codelineno-0-370></a><span class=sd> },</span>
<a id=__codelineno-0-371 name=__codelineno-0-371></a><span class=sd> escape_slots_content=False,</span>
<a id=__codelineno-0-372 name=__codelineno-0-372></a><span class=sd> # HttpResponse input</span>
<a id=__codelineno-0-373 name=__codelineno-0-373></a><span class=sd> status=201,</span>
<a id=__codelineno-0-374 name=__codelineno-0-374></a><span class=sd> headers={...},</span>
<a id=__codelineno-0-375 name=__codelineno-0-375></a><span class=sd> )</span>
<a id=__codelineno-0-376 name=__codelineno-0-376></a><span class=sd> # HttpResponse(content=..., status=201, headers=...)</span>
<a id=__codelineno-0-377 name=__codelineno-0-377></a><span class=sd> ```</span>
<a id=__codelineno-0-378 name=__codelineno-0-378></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-379 name=__codelineno-0-379></a> <span class=n>content</span> <span class=o>=</span> <span class=bp>cls</span><span class=o>.</span><span class=n>render</span><span class=p>(</span>
<a id=__codelineno-0-380 name=__codelineno-0-380></a> <span class=n>args</span><span class=o>=</span><span class=n>args</span><span class=p>,</span>
<a id=__codelineno-0-381 name=__codelineno-0-381></a> <span class=n>kwargs</span><span class=o>=</span><span class=n>kwargs</span><span class=p>,</span>
<a id=__codelineno-0-382 name=__codelineno-0-382></a> <span class=n>context</span><span class=o>=</span><span class=n>context</span><span class=p>,</span>
<a id=__codelineno-0-383 name=__codelineno-0-383></a> <span class=n>slots</span><span class=o>=</span><span class=n>slots</span><span class=p>,</span>
<a id=__codelineno-0-384 name=__codelineno-0-384></a> <span class=n>escape_slots_content</span><span class=o>=</span><span class=n>escape_slots_content</span><span class=p>,</span>
<a id=__codelineno-0-385 name=__codelineno-0-385></a> <span class=p>)</span>
<a id=__codelineno-0-386 name=__codelineno-0-386></a> <span class=k>return</span> <span class=bp>cls</span><span class=o>.</span><span class=n>response_class</span><span class=p>(</span><span class=n>content</span><span class=p>,</span> <span class=o>*</span><span class=n>response_args</span><span class=p>,</span> <span class=o>**</span><span class=n>response_kwargs</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.component.ComponentNode class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ComponentNode</span> <a href=#django_components.component.ComponentNode class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>ComponentNode</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><span title=django_components.expression.Expression>Expression</span></span><span class=p>],</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n><span title=django_components.expression.RuntimeKwargs>RuntimeKwargs</span></span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>isolated_context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span> <span class=o>=</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>fill_nodes</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.slots.FillNode href=slots/#django_components.slots.FillNode>FillNode</a></span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=n>node_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-internal" title=django_components.node.BaseNode href=node/#django_components.node.BaseNode>BaseNode</a></code></p> <p>Django.template.Node subclass that renders a django-components component</p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-595>595</a></span>
<span class=normal><a href=#__codelineno-0-596>596</a></span>
<span class=normal><a href=#__codelineno-0-597>597</a></span>
<span class=normal><a href=#__codelineno-0-598>598</a></span>
<span class=normal><a href=#__codelineno-0-599>599</a></span>
<span class=normal><a href=#__codelineno-0-600>600</a></span>
<span class=normal><a href=#__codelineno-0-601>601</a></span>
<span class=normal><a href=#__codelineno-0-602>602</a></span>
<span class=normal><a href=#__codelineno-0-603>603</a></span>
<span class=normal><a href=#__codelineno-0-604>604</a></span>
<span class=normal><a href=#__codelineno-0-605>605</a></span>
<span class=normal><a href=#__codelineno-0-606>606</a></span>
<span class=normal><a href=#__codelineno-0-607>607</a></span>
<span class=normal><a href=#__codelineno-0-608>608</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-595 name=__codelineno-0-595></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span>
<a id=__codelineno-0-596 name=__codelineno-0-596></a> <span class=bp>self</span><span class=p>,</span>
<a id=__codelineno-0-597 name=__codelineno-0-597></a> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-598 name=__codelineno-0-598></a> <span class=n>args</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>Expression</span><span class=p>],</span>
<a id=__codelineno-0-599 name=__codelineno-0-599></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>RuntimeKwargs</span><span class=p>,</span>
<a id=__codelineno-0-600 name=__codelineno-0-600></a> <span class=n>isolated_context</span><span class=p>:</span> <span class=nb>bool</span> <span class=o>=</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-601 name=__codelineno-0-601></a> <span class=n>fill_nodes</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>List</span><span class=p>[</span><span class=n>FillNode</span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-602 name=__codelineno-0-602></a> <span class=n>node_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-603 name=__codelineno-0-603></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-604 name=__codelineno-0-604></a> <span class=nb>super</span><span class=p>()</span><span class=o>.</span><span class=fm>__init__</span><span class=p>(</span><span class=n>nodelist</span><span class=o>=</span><span class=n>NodeList</span><span class=p>(</span><span class=n>fill_nodes</span><span class=p>),</span> <span class=n>args</span><span class=o>=</span><span class=n>args</span><span class=p>,</span> <span class=n>kwargs</span><span class=o>=</span><span class=n>kwargs</span><span class=p>,</span> <span class=n>node_id</span><span class=o>=</span><span class=n>node_id</span><span class=p>)</span>
<a id=__codelineno-0-605 name=__codelineno-0-605></a>
<a id=__codelineno-0-606 name=__codelineno-0-606></a> <span class=bp>self</span><span class=o>.</span><span class=n>name</span> <span class=o>=</span> <span class=n>name</span>
<a id=__codelineno-0-607 name=__codelineno-0-607></a> <span class=bp>self</span><span class=o>.</span><span class=n>isolated_context</span> <span class=o>=</span> <span class=n>isolated_context</span>
<a id=__codelineno-0-608 name=__codelineno-0-608></a> <span class=bp>self</span><span class=o>.</span><span class=n>fill_nodes</span> <span class=o>=</span> <span class=n>fill_nodes</span> <span class=ow>or</span> <span class=p>[]</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.component.ComponentView class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ComponentView</span> <a href=#django_components.component.ComponentView class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>ComponentView</span><span class=p>(</span><span class=n>component</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.component.Component href=component/#django_components.component.Component>Component</a></span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><span title=django.views.View>View</span></code></p> <p>Subclass of <code>django.views.View</code> where the <code>Component</code> instance is available via <code>self.component</code>.</p> <details class=quote> <summary>Source code in <code>src/django_components/component.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-136>136</a></span>
<span class=normal><a href=#__codelineno-0-137>137</a></span>
<span class=normal><a href=#__codelineno-0-138>138</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-136 name=__codelineno-0-136></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>component</span><span class=p>:</span> <span class=s2>&quot;Component&quot;</span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>:</span> <span class=n>Any</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-137 name=__codelineno-0-137></a> <span class=nb>super</span><span class=p>()</span><span class=o>.</span><span class=fm>__init__</span><span class=p>(</span><span class=o>**</span><span class=n>kwargs</span><span class=p>)</span>
<a id=__codelineno-0-138 name=__codelineno-0-138></a> <span class=bp>self</span><span class=o>.</span><span class=n>component</span> <span class=o>=</span> <span class=n>component</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.component_media class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">component_media</span> <a href=#django_components.component_media class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.component_media.ComponentMediaInput class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ComponentMediaInput</span> <a href=#django_components.component_media.ComponentMediaInput class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p>Defines JS and CSS media files associated with this component.</p> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.component_media.MediaMeta class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MediaMeta</span> <a href=#django_components.component_media.MediaMeta class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><span title=django.forms.widgets.MediaDefiningClass>MediaDefiningClass</span></code></p> <p>Metaclass for handling media files for components.</p> <p>Similar to <code>MediaDefiningClass</code>, this class supports the use of <code>Media</code> attribute to define associated JS/CSS files, which are then available under <code>media</code> attribute as a instance of <code>Media</code> class.</p> <p>This subclass has following changes:</p> <h6 id=django_components.component_media.MediaMeta--1-support-for-multiple-interfaces-of-jscss>1. Support for multiple interfaces of JS/CSS<a class=headerlink href=#django_components.component_media.MediaMeta--1-support-for-multiple-interfaces-of-jscss title="Permanent link">¤</a></h6> <ol> <li> <p>As plain strings <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=k>class</span> <span class=nc>Media</span><span class=p>:</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>js</span> <span class=o>=</span> <span class=s2>&quot;path/to/script.js&quot;</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>css</span> <span class=o>=</span> <span class=s2>&quot;path/to/style.css&quot;</span>
</code></pre></div></p> </li> <li> <p>As lists <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a> <span class=k>class</span> <span class=nc>Media</span><span class=p>:</span>
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a> <span class=n>js</span> <span class=o>=</span> <span class=p>[</span><span class=s2>&quot;path/to/script1.js&quot;</span><span class=p>,</span> <span class=s2>&quot;path/to/script2.js&quot;</span><span class=p>]</span>
<a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a> <span class=n>css</span> <span class=o>=</span> <span class=p>[</span><span class=s2>&quot;path/to/style1.css&quot;</span><span class=p>,</span> <span class=s2>&quot;path/to/style2.css&quot;</span><span class=p>]</span>
</code></pre></div></p> </li> <li> <p>[CSS ONLY] Dicts of strings <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a> <span class=k>class</span> <span class=nc>Media</span><span class=p>:</span>
<a id=__codelineno-2-3 name=__codelineno-2-3 href=#__codelineno-2-3></a> <span class=n>css</span> <span class=o>=</span> <span class=p>{</span>
<a id=__codelineno-2-4 name=__codelineno-2-4 href=#__codelineno-2-4></a> <span class=s2>&quot;all&quot;</span><span class=p>:</span> <span class=s2>&quot;path/to/style1.css&quot;</span><span class=p>,</span>
<a id=__codelineno-2-5 name=__codelineno-2-5 href=#__codelineno-2-5></a> <span class=s2>&quot;print&quot;</span><span class=p>:</span> <span class=s2>&quot;path/to/style2.css&quot;</span><span class=p>,</span>
<a id=__codelineno-2-6 name=__codelineno-2-6 href=#__codelineno-2-6></a> <span class=p>}</span>
</code></pre></div></p> </li> <li> <p>[CSS ONLY] Dicts of lists <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a> <span class=k>class</span> <span class=nc>Media</span><span class=p>:</span>
<a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a> <span class=n>css</span> <span class=o>=</span> <span class=p>{</span>
<a id=__codelineno-3-4 name=__codelineno-3-4 href=#__codelineno-3-4></a> <span class=s2>&quot;all&quot;</span><span class=p>:</span> <span class=p>[</span><span class=s2>&quot;path/to/style1.css&quot;</span><span class=p>],</span>
<a id=__codelineno-3-5 name=__codelineno-3-5 href=#__codelineno-3-5></a> <span class=s2>&quot;print&quot;</span><span class=p>:</span> <span class=p>[</span><span class=s2>&quot;path/to/style2.css&quot;</span><span class=p>],</span>
<a id=__codelineno-3-6 name=__codelineno-3-6 href=#__codelineno-3-6></a> <span class=p>}</span>
</code></pre></div></p> </li> </ol> <h6 id=django_components.component_media.MediaMeta--2-media-are-first-resolved-relative-to-class-definition-file>2. Media are first resolved relative to class definition file<a class=headerlink href=#django_components.component_media.MediaMeta--2-media-are-first-resolved-relative-to-class-definition-file title="Permanent link">¤</a></h6> <p>E.g. if in a directory <code>my_comp</code> you have <code>script.js</code> and <code>my_comp.py</code>, and <code>my_comp.py</code> looks like this:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-4-2 name=__codelineno-4-2 href=#__codelineno-4-2></a> <span class=k>class</span> <span class=nc>Media</span><span class=p>:</span>
<a id=__codelineno-4-3 name=__codelineno-4-3 href=#__codelineno-4-3></a> <span class=n>js</span> <span class=o>=</span> <span class=s2>&quot;script.js&quot;</span>
</code></pre></div> <p>Then <code>script.js</code> will be resolved as <code>my_comp/script.js</code>.</p> <h6 id=django_components.component_media.MediaMeta--3-media-can-be-defined-as-str-bytes-pathlike-safestring-or-function-of-thereof>3. Media can be defined as str, bytes, PathLike, SafeString, or function of thereof<a class=headerlink href=#django_components.component_media.MediaMeta--3-media-can-be-defined-as-str-bytes-pathlike-safestring-or-function-of-thereof title="Permanent link">¤</a></h6> <p>E.g.:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-5-1 name=__codelineno-5-1 href=#__codelineno-5-1></a><span class=k>def</span> <span class=nf>lazy_eval_css</span><span class=p>():</span>
<a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a> <span class=c1># do something</span>
<a id=__codelineno-5-3 name=__codelineno-5-3 href=#__codelineno-5-3></a> <span class=k>return</span> <span class=n>path</span>
<a id=__codelineno-5-4 name=__codelineno-5-4 href=#__codelineno-5-4></a>
<a id=__codelineno-5-5 name=__codelineno-5-5 href=#__codelineno-5-5></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-5-6 name=__codelineno-5-6 href=#__codelineno-5-6></a> <span class=k>class</span> <span class=nc>Media</span><span class=p>:</span>
<a id=__codelineno-5-7 name=__codelineno-5-7 href=#__codelineno-5-7></a> <span class=n>js</span> <span class=o>=</span> <span class=sa>b</span><span class=s2>&quot;script.js&quot;</span>
<a id=__codelineno-5-8 name=__codelineno-5-8 href=#__codelineno-5-8></a> <span class=n>css</span> <span class=o>=</span> <span class=n>lazy_eval_css</span>
</code></pre></div> <h6 id=django_components.component_media.MediaMeta--4-subclass-media-class-with-media_class>4. Subclass <code>Media</code> class with <code>media_class</code><a class=headerlink href=#django_components.component_media.MediaMeta--4-subclass-media-class-with-media_class title="Permanent link">¤</a></h6> <p>Normal <code>MediaDefiningClass</code> creates an instance of <code>Media</code> class under the <code>media</code> attribute. This class allows to override which class will be instantiated with <code>media_class</code> attribute:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-6-1 name=__codelineno-6-1 href=#__codelineno-6-1></a><span class=k>class</span> <span class=nc>MyMedia</span><span class=p>(</span><span class=n>Media</span><span class=p>):</span>
<a id=__codelineno-6-2 name=__codelineno-6-2 href=#__codelineno-6-2></a> <span class=k>def</span> <span class=nf>render_js</span><span class=p>(</span><span class=bp>self</span><span class=p>):</span>
<a id=__codelineno-6-3 name=__codelineno-6-3 href=#__codelineno-6-3></a> <span class=o>...</span>
<a id=__codelineno-6-4 name=__codelineno-6-4 href=#__codelineno-6-4></a>
<a id=__codelineno-6-5 name=__codelineno-6-5 href=#__codelineno-6-5></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-6-6 name=__codelineno-6-6 href=#__codelineno-6-6></a> <span class=n>media_class</span> <span class=o>=</span> <span class=n>MyMedia</span>
<a id=__codelineno-6-7 name=__codelineno-6-7 href=#__codelineno-6-7></a> <span class=k>def</span> <span class=nf>get_context_data</span><span class=p>(</span><span class=bp>self</span><span class=p>):</span>
<a id=__codelineno-6-8 name=__codelineno-6-8 href=#__codelineno-6-8></a> <span class=k>assert</span> <span class=nb>isinstance</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>media</span><span class=p>,</span> <span class=n>MyMedia</span><span class=p>)</span>
</code></pre></div> <div class="doc doc-children"> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.component_registry class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">component_registry</span> <a href=#django_components.component_registry class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h3 id=django_components.component_registry.registry class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">registry</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small> </span> <a href=#django_components.component_registry.registry class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>registry</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.component_registry.ComponentRegistry href=component_registry/#django_components.component_registry.ComponentRegistry>ComponentRegistry</a></span> <span class=o>=</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.component_registry.ComponentRegistry href=component_registry/#django_components.component_registry.ComponentRegistry>ComponentRegistry</a></span><span class=p>()</span>
</code></pre></div> <div class="doc doc-contents "> <p>The default and global component registry. Use this instance to directly register or remove components:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=c1># Register components</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>,</span> <span class=n>ButtonComponent</span><span class=p>)</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;card&quot;</span><span class=p>,</span> <span class=n>CardComponent</span><span class=p>)</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=c1># Get single</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=n>registry</span><span class=o>.</span><span class=n>get</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>)</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=c1># Get all</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a><span class=n>registry</span><span class=o>.</span><span class=n>all</span><span class=p>()</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=c1># Unregister single</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a><span class=n>registry</span><span class=o>.</span><span class=n>unregister</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>)</span>
<a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a><span class=c1># Unregister all</span>
<a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a><span class=n>registry</span><span class=o>.</span><span class=n>clear</span><span class=p>()</span>
</code></pre></div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.component_registry.ComponentRegistry class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ComponentRegistry</span> <a href=#django_components.component_registry.ComponentRegistry class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>ComponentRegistry</span><span class=p>(</span><span class=n>library</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django.template.Library>Library</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p>Manages which components can be used in the template tags.</p> <p>Each ComponentRegistry instance is associated with an instance of Django's Library. So when you register or unregister a component to/from a component registry, behind the scenes the registry automatically adds/removes the component's template tag to/from the Library.</p> <p>The Library instance can be set at instantiation. If omitted, then the default Library instance from django_components is used. The Library instance can be accessed under <code>library</code> attribute.</p> <p>Example:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=c1># Use with default Library</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=n>registry</span> <span class=o>=</span> <span class=n>ComponentRegistry</span><span class=p>()</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=c1># Or a custom one</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=n>my_lib</span> <span class=o>=</span> <span class=n>Library</span><span class=p>()</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=n>registry</span> <span class=o>=</span> <span class=n>ComponentRegistry</span><span class=p>(</span><span class=n>library</span><span class=o>=</span><span class=n>my_lib</span><span class=p>)</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=c1># Usage</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>,</span> <span class=n>ButtonComponent</span><span class=p>)</span>
<a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;card&quot;</span><span class=p>,</span> <span class=n>CardComponent</span><span class=p>)</span>
<a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a><span class=n>registry</span><span class=o>.</span><span class=n>all</span><span class=p>()</span>
<a id=__codelineno-0-12 name=__codelineno-0-12 href=#__codelineno-0-12></a><span class=n>registry</span><span class=o>.</span><span class=n>clear</span><span class=p>()</span>
<a id=__codelineno-0-13 name=__codelineno-0-13 href=#__codelineno-0-13></a><span class=n>registry</span><span class=o>.</span><span class=n>get</span><span class=p>()</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/component_registry.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-69>69</a></span>
<span class=normal><a href=#__codelineno-0-70>70</a></span>
<span class=normal><a href=#__codelineno-0-71>71</a></span>
<span class=normal><a href=#__codelineno-0-72>72</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-69 name=__codelineno-0-69></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>library</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Library</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-70 name=__codelineno-0-70></a> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>ComponentRegistryEntry</span><span class=p>]</span> <span class=o>=</span> <span class=p>{}</span> <span class=c1># component name -&gt; component_entry mapping</span>
<a id=__codelineno-0-71 name=__codelineno-0-71></a> <span class=bp>self</span><span class=o>.</span><span class=n>_tags</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Set</span><span class=p>[</span><span class=nb>str</span><span class=p>]]</span> <span class=o>=</span> <span class=p>{}</span> <span class=c1># tag -&gt; list[component names]</span>
<a id=__codelineno-0-72 name=__codelineno-0-72></a> <span class=bp>self</span><span class=o>.</span><span class=n>_library</span> <span class=o>=</span> <span class=n>library</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h4 id=django_components.component_registry.ComponentRegistry.library class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">library</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-property"><code>property</code></small> </span> <a href=#django_components.component_registry.ComponentRegistry.library class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>library</span><span class=p>:</span> <span class=n><span title=django.template.Library>Library</span></span>
</code></pre></div> <div class="doc doc-contents "> <p>The template tag library with which the component registry is associated.</p> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component_registry.ComponentRegistry.all class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">all</span> <a href=#django_components.component_registry.ComponentRegistry.all class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nb>all</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Type href=https://docs.python.org/3.12/library/typing.html#typing.Type>Type</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.component.Component href=component/#django_components.component.Component>Component</a></span><span class=p>]]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Retrieve all registered component classes.</p> <p>Example:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=c1># First register components</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>,</span> <span class=n>ButtonComponent</span><span class=p>)</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;card&quot;</span><span class=p>,</span> <span class=n>CardComponent</span><span class=p>)</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=c1># Then get all</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=n>registry</span><span class=o>.</span><span class=n>all</span><span class=p>()</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=c1># &gt; {</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a><span class=c1># &gt; &quot;button&quot;: ButtonComponent,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=c1># &gt; &quot;card&quot;: CardComponent,</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a><span class=c1># &gt; }</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/component_registry.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-193>193</a></span>
<span class=normal><a href=#__codelineno-0-194>194</a></span>
<span class=normal><a href=#__codelineno-0-195>195</a></span>
<span class=normal><a href=#__codelineno-0-196>196</a></span>
<span class=normal><a href=#__codelineno-0-197>197</a></span>
<span class=normal><a href=#__codelineno-0-198>198</a></span>
<span class=normal><a href=#__codelineno-0-199>199</a></span>
<span class=normal><a href=#__codelineno-0-200>200</a></span>
<span class=normal><a href=#__codelineno-0-201>201</a></span>
<span class=normal><a href=#__codelineno-0-202>202</a></span>
<span class=normal><a href=#__codelineno-0-203>203</a></span>
<span class=normal><a href=#__codelineno-0-204>204</a></span>
<span class=normal><a href=#__codelineno-0-205>205</a></span>
<span class=normal><a href=#__codelineno-0-206>206</a></span>
<span class=normal><a href=#__codelineno-0-207>207</a></span>
<span class=normal><a href=#__codelineno-0-208>208</a></span>
<span class=normal><a href=#__codelineno-0-209>209</a></span>
<span class=normal><a href=#__codelineno-0-210>210</a></span>
<span class=normal><a href=#__codelineno-0-211>211</a></span>
<span class=normal><a href=#__codelineno-0-212>212</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-193 name=__codelineno-0-193></a><span class=k>def</span> <span class=nf>all</span><span class=p>(</span><span class=bp>self</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Type</span><span class=p>[</span><span class=s2>&quot;Component&quot;</span><span class=p>]]:</span>
<a id=__codelineno-0-194 name=__codelineno-0-194></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-195 name=__codelineno-0-195></a><span class=sd> Retrieve all registered component classes.</span>
<a id=__codelineno-0-196 name=__codelineno-0-196></a>
<a id=__codelineno-0-197 name=__codelineno-0-197></a><span class=sd> Example:</span>
<a id=__codelineno-0-198 name=__codelineno-0-198></a>
<a id=__codelineno-0-199 name=__codelineno-0-199></a><span class=sd> ```py</span>
<a id=__codelineno-0-200 name=__codelineno-0-200></a><span class=sd> # First register components</span>
<a id=__codelineno-0-201 name=__codelineno-0-201></a><span class=sd> registry.register(&quot;button&quot;, ButtonComponent)</span>
<a id=__codelineno-0-202 name=__codelineno-0-202></a><span class=sd> registry.register(&quot;card&quot;, CardComponent)</span>
<a id=__codelineno-0-203 name=__codelineno-0-203></a><span class=sd> # Then get all</span>
<a id=__codelineno-0-204 name=__codelineno-0-204></a><span class=sd> registry.all()</span>
<a id=__codelineno-0-205 name=__codelineno-0-205></a><span class=sd> # &gt; {</span>
<a id=__codelineno-0-206 name=__codelineno-0-206></a><span class=sd> # &gt; &quot;button&quot;: ButtonComponent,</span>
<a id=__codelineno-0-207 name=__codelineno-0-207></a><span class=sd> # &gt; &quot;card&quot;: CardComponent,</span>
<a id=__codelineno-0-208 name=__codelineno-0-208></a><span class=sd> # &gt; }</span>
<a id=__codelineno-0-209 name=__codelineno-0-209></a><span class=sd> ```</span>
<a id=__codelineno-0-210 name=__codelineno-0-210></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-211 name=__codelineno-0-211></a> <span class=n>comps</span> <span class=o>=</span> <span class=p>{</span><span class=n>key</span><span class=p>:</span> <span class=n>entry</span><span class=o>.</span><span class=n>cls</span> <span class=k>for</span> <span class=n>key</span><span class=p>,</span> <span class=n>entry</span> <span class=ow>in</span> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=o>.</span><span class=n>items</span><span class=p>()}</span>
<a id=__codelineno-0-212 name=__codelineno-0-212></a> <span class=k>return</span> <span class=n>comps</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component_registry.ComponentRegistry.clear class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">clear</span> <a href=#django_components.component_registry.ComponentRegistry.clear class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>clear</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Clears the registry, unregistering all components.</p> <p>Example:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=c1># First register components</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>,</span> <span class=n>ButtonComponent</span><span class=p>)</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;card&quot;</span><span class=p>,</span> <span class=n>CardComponent</span><span class=p>)</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=c1># Then clear</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=n>registry</span><span class=o>.</span><span class=n>clear</span><span class=p>()</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=c1># Then get all</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a><span class=n>registry</span><span class=o>.</span><span class=n>all</span><span class=p>()</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=c1># &gt; {}</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/component_registry.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-214>214</a></span>
<span class=normal><a href=#__codelineno-0-215>215</a></span>
<span class=normal><a href=#__codelineno-0-216>216</a></span>
<span class=normal><a href=#__codelineno-0-217>217</a></span>
<span class=normal><a href=#__codelineno-0-218>218</a></span>
<span class=normal><a href=#__codelineno-0-219>219</a></span>
<span class=normal><a href=#__codelineno-0-220>220</a></span>
<span class=normal><a href=#__codelineno-0-221>221</a></span>
<span class=normal><a href=#__codelineno-0-222>222</a></span>
<span class=normal><a href=#__codelineno-0-223>223</a></span>
<span class=normal><a href=#__codelineno-0-224>224</a></span>
<span class=normal><a href=#__codelineno-0-225>225</a></span>
<span class=normal><a href=#__codelineno-0-226>226</a></span>
<span class=normal><a href=#__codelineno-0-227>227</a></span>
<span class=normal><a href=#__codelineno-0-228>228</a></span>
<span class=normal><a href=#__codelineno-0-229>229</a></span>
<span class=normal><a href=#__codelineno-0-230>230</a></span>
<span class=normal><a href=#__codelineno-0-231>231</a></span>
<span class=normal><a href=#__codelineno-0-232>232</a></span>
<span class=normal><a href=#__codelineno-0-233>233</a></span>
<span class=normal><a href=#__codelineno-0-234>234</a></span>
<span class=normal><a href=#__codelineno-0-235>235</a></span>
<span class=normal><a href=#__codelineno-0-236>236</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-214 name=__codelineno-0-214></a><span class=k>def</span> <span class=nf>clear</span><span class=p>(</span><span class=bp>self</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-215 name=__codelineno-0-215></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-216 name=__codelineno-0-216></a><span class=sd> Clears the registry, unregistering all components.</span>
<a id=__codelineno-0-217 name=__codelineno-0-217></a>
<a id=__codelineno-0-218 name=__codelineno-0-218></a><span class=sd> Example:</span>
<a id=__codelineno-0-219 name=__codelineno-0-219></a>
<a id=__codelineno-0-220 name=__codelineno-0-220></a><span class=sd> ```py</span>
<a id=__codelineno-0-221 name=__codelineno-0-221></a><span class=sd> # First register components</span>
<a id=__codelineno-0-222 name=__codelineno-0-222></a><span class=sd> registry.register(&quot;button&quot;, ButtonComponent)</span>
<a id=__codelineno-0-223 name=__codelineno-0-223></a><span class=sd> registry.register(&quot;card&quot;, CardComponent)</span>
<a id=__codelineno-0-224 name=__codelineno-0-224></a><span class=sd> # Then clear</span>
<a id=__codelineno-0-225 name=__codelineno-0-225></a><span class=sd> registry.clear()</span>
<a id=__codelineno-0-226 name=__codelineno-0-226></a><span class=sd> # Then get all</span>
<a id=__codelineno-0-227 name=__codelineno-0-227></a><span class=sd> registry.all()</span>
<a id=__codelineno-0-228 name=__codelineno-0-228></a><span class=sd> # &gt; {}</span>
<a id=__codelineno-0-229 name=__codelineno-0-229></a><span class=sd> ```</span>
<a id=__codelineno-0-230 name=__codelineno-0-230></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-231 name=__codelineno-0-231></a> <span class=n>all_comp_names</span> <span class=o>=</span> <span class=nb>list</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=o>.</span><span class=n>keys</span><span class=p>())</span>
<a id=__codelineno-0-232 name=__codelineno-0-232></a> <span class=k>for</span> <span class=n>comp_name</span> <span class=ow>in</span> <span class=n>all_comp_names</span><span class=p>:</span>
<a id=__codelineno-0-233 name=__codelineno-0-233></a> <span class=bp>self</span><span class=o>.</span><span class=n>unregister</span><span class=p>(</span><span class=n>comp_name</span><span class=p>)</span>
<a id=__codelineno-0-234 name=__codelineno-0-234></a>
<a id=__codelineno-0-235 name=__codelineno-0-235></a> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-236 name=__codelineno-0-236></a> <span class=bp>self</span><span class=o>.</span><span class=n>_tags</span> <span class=o>=</span> <span class=p>{}</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component_registry.ComponentRegistry.get class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get</span> <a href=#django_components.component_registry.ComponentRegistry.get class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>get</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Type href=https://docs.python.org/3.12/library/typing.html#typing.Type>Type</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.component.Component href=component/#django_components.component.Component>Component</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Retrieve a component class registered under the given name.</p> <p>Raises <code>NotRegistered</code> if the given name is not registered.</p> <p>Example:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=c1># First register component</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>,</span> <span class=n>ButtonComponent</span><span class=p>)</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=c1># Then get</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=n>registry</span><span class=o>.</span><span class=n>get</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>)</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=c1># &gt; ButtonComponent</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/component_registry.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-172>172</a></span>
<span class=normal><a href=#__codelineno-0-173>173</a></span>
<span class=normal><a href=#__codelineno-0-174>174</a></span>
<span class=normal><a href=#__codelineno-0-175>175</a></span>
<span class=normal><a href=#__codelineno-0-176>176</a></span>
<span class=normal><a href=#__codelineno-0-177>177</a></span>
<span class=normal><a href=#__codelineno-0-178>178</a></span>
<span class=normal><a href=#__codelineno-0-179>179</a></span>
<span class=normal><a href=#__codelineno-0-180>180</a></span>
<span class=normal><a href=#__codelineno-0-181>181</a></span>
<span class=normal><a href=#__codelineno-0-182>182</a></span>
<span class=normal><a href=#__codelineno-0-183>183</a></span>
<span class=normal><a href=#__codelineno-0-184>184</a></span>
<span class=normal><a href=#__codelineno-0-185>185</a></span>
<span class=normal><a href=#__codelineno-0-186>186</a></span>
<span class=normal><a href=#__codelineno-0-187>187</a></span>
<span class=normal><a href=#__codelineno-0-188>188</a></span>
<span class=normal><a href=#__codelineno-0-189>189</a></span>
<span class=normal><a href=#__codelineno-0-190>190</a></span>
<span class=normal><a href=#__codelineno-0-191>191</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-172 name=__codelineno-0-172></a><span class=k>def</span> <span class=nf>get</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Type</span><span class=p>[</span><span class=s2>&quot;Component&quot;</span><span class=p>]:</span>
<a id=__codelineno-0-173 name=__codelineno-0-173></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-174 name=__codelineno-0-174></a><span class=sd> Retrieve a component class registered under the given name.</span>
<a id=__codelineno-0-175 name=__codelineno-0-175></a>
<a id=__codelineno-0-176 name=__codelineno-0-176></a><span class=sd> Raises `NotRegistered` if the given name is not registered.</span>
<a id=__codelineno-0-177 name=__codelineno-0-177></a>
<a id=__codelineno-0-178 name=__codelineno-0-178></a><span class=sd> Example:</span>
<a id=__codelineno-0-179 name=__codelineno-0-179></a>
<a id=__codelineno-0-180 name=__codelineno-0-180></a><span class=sd> ```py</span>
<a id=__codelineno-0-181 name=__codelineno-0-181></a><span class=sd> # First register component</span>
<a id=__codelineno-0-182 name=__codelineno-0-182></a><span class=sd> registry.register(&quot;button&quot;, ButtonComponent)</span>
<a id=__codelineno-0-183 name=__codelineno-0-183></a><span class=sd> # Then get</span>
<a id=__codelineno-0-184 name=__codelineno-0-184></a><span class=sd> registry.get(&quot;button&quot;)</span>
<a id=__codelineno-0-185 name=__codelineno-0-185></a><span class=sd> # &gt; ButtonComponent</span>
<a id=__codelineno-0-186 name=__codelineno-0-186></a><span class=sd> ```</span>
<a id=__codelineno-0-187 name=__codelineno-0-187></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-188 name=__codelineno-0-188></a> <span class=k>if</span> <span class=n>name</span> <span class=ow>not</span> <span class=ow>in</span> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=p>:</span>
<a id=__codelineno-0-189 name=__codelineno-0-189></a> <span class=k>raise</span> <span class=n>NotRegistered</span><span class=p>(</span><span class=s1>&#39;The component &quot;</span><span class=si>%s</span><span class=s1>&quot; is not registered&#39;</span> <span class=o>%</span> <span class=n>name</span><span class=p>)</span>
<a id=__codelineno-0-190 name=__codelineno-0-190></a>
<a id=__codelineno-0-191 name=__codelineno-0-191></a> <span class=k>return</span> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=p>[</span><span class=n>name</span><span class=p>]</span><span class=o>.</span><span class=n>cls</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component_registry.ComponentRegistry.register class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">register</span> <a href=#django_components.component_registry.ComponentRegistry.register class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>register</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>component</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Type href=https://docs.python.org/3.12/library/typing.html#typing.Type>Type</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.component.Component href=component/#django_components.component.Component>Component</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Register a component with this registry under the given name.</p> <p>A component MUST be registered before it can be used in a template such as: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;my_comp&quot;</span> <span class=cp>%}{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
</code></pre></div></p> <p>Raises <code>AlreadyRegistered</code> if a different component was already registered under the same name.</p> <p>Example:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>,</span> <span class=n>ButtonComponent</span><span class=p>)</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/component_registry.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-94> 94</a></span>
<span class=normal><a href=#__codelineno-0-95> 95</a></span>
<span class=normal><a href=#__codelineno-0-96> 96</a></span>
<span class=normal><a href=#__codelineno-0-97> 97</a></span>
<span class=normal><a href=#__codelineno-0-98> 98</a></span>
<span class=normal><a href=#__codelineno-0-99> 99</a></span>
<span class=normal><a href=#__codelineno-0-100>100</a></span>
<span class=normal><a href=#__codelineno-0-101>101</a></span>
<span class=normal><a href=#__codelineno-0-102>102</a></span>
<span class=normal><a href=#__codelineno-0-103>103</a></span>
<span class=normal><a href=#__codelineno-0-104>104</a></span>
<span class=normal><a href=#__codelineno-0-105>105</a></span>
<span class=normal><a href=#__codelineno-0-106>106</a></span>
<span class=normal><a href=#__codelineno-0-107>107</a></span>
<span class=normal><a href=#__codelineno-0-108>108</a></span>
<span class=normal><a href=#__codelineno-0-109>109</a></span>
<span class=normal><a href=#__codelineno-0-110>110</a></span>
<span class=normal><a href=#__codelineno-0-111>111</a></span>
<span class=normal><a href=#__codelineno-0-112>112</a></span>
<span class=normal><a href=#__codelineno-0-113>113</a></span>
<span class=normal><a href=#__codelineno-0-114>114</a></span>
<span class=normal><a href=#__codelineno-0-115>115</a></span>
<span class=normal><a href=#__codelineno-0-116>116</a></span>
<span class=normal><a href=#__codelineno-0-117>117</a></span>
<span class=normal><a href=#__codelineno-0-118>118</a></span>
<span class=normal><a href=#__codelineno-0-119>119</a></span>
<span class=normal><a href=#__codelineno-0-120>120</a></span>
<span class=normal><a href=#__codelineno-0-121>121</a></span>
<span class=normal><a href=#__codelineno-0-122>122</a></span>
<span class=normal><a href=#__codelineno-0-123>123</a></span>
<span class=normal><a href=#__codelineno-0-124>124</a></span>
<span class=normal><a href=#__codelineno-0-125>125</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-94 name=__codelineno-0-94></a><span class=k>def</span> <span class=nf>register</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span> <span class=n>component</span><span class=p>:</span> <span class=n>Type</span><span class=p>[</span><span class=s2>&quot;Component&quot;</span><span class=p>])</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-95 name=__codelineno-0-95></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-96 name=__codelineno-0-96></a><span class=sd> Register a component with this registry under the given name.</span>
<a id=__codelineno-0-97 name=__codelineno-0-97></a>
<a id=__codelineno-0-98 name=__codelineno-0-98></a><span class=sd> A component MUST be registered before it can be used in a template such as:</span>
<a id=__codelineno-0-99 name=__codelineno-0-99></a><span class=sd> ```django</span>
<a id=__codelineno-0-100 name=__codelineno-0-100></a><span class=sd> {% component &quot;my_comp&quot; %}{% endcomponent %}</span>
<a id=__codelineno-0-101 name=__codelineno-0-101></a><span class=sd> ```</span>
<a id=__codelineno-0-102 name=__codelineno-0-102></a>
<a id=__codelineno-0-103 name=__codelineno-0-103></a><span class=sd> Raises `AlreadyRegistered` if a different component was already registered</span>
<a id=__codelineno-0-104 name=__codelineno-0-104></a><span class=sd> under the same name.</span>
<a id=__codelineno-0-105 name=__codelineno-0-105></a>
<a id=__codelineno-0-106 name=__codelineno-0-106></a><span class=sd> Example:</span>
<a id=__codelineno-0-107 name=__codelineno-0-107></a>
<a id=__codelineno-0-108 name=__codelineno-0-108></a><span class=sd> ```py</span>
<a id=__codelineno-0-109 name=__codelineno-0-109></a><span class=sd> registry.register(&quot;button&quot;, ButtonComponent)</span>
<a id=__codelineno-0-110 name=__codelineno-0-110></a><span class=sd> ```</span>
<a id=__codelineno-0-111 name=__codelineno-0-111></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-112 name=__codelineno-0-112></a> <span class=n>existing_component</span> <span class=o>=</span> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=o>.</span><span class=n>get</span><span class=p>(</span><span class=n>name</span><span class=p>)</span>
<a id=__codelineno-0-113 name=__codelineno-0-113></a> <span class=k>if</span> <span class=n>existing_component</span> <span class=ow>and</span> <span class=n>existing_component</span><span class=o>.</span><span class=n>cls</span><span class=o>.</span><span class=n>_class_hash</span> <span class=o>!=</span> <span class=n>component</span><span class=o>.</span><span class=n>_class_hash</span><span class=p>:</span>
<a id=__codelineno-0-114 name=__codelineno-0-114></a> <span class=k>raise</span> <span class=n>AlreadyRegistered</span><span class=p>(</span><span class=s1>&#39;The component &quot;</span><span class=si>%s</span><span class=s1>&quot; has already been registered&#39;</span> <span class=o>%</span> <span class=n>name</span><span class=p>)</span>
<a id=__codelineno-0-115 name=__codelineno-0-115></a>
<a id=__codelineno-0-116 name=__codelineno-0-116></a> <span class=n>entry</span> <span class=o>=</span> <span class=bp>self</span><span class=o>.</span><span class=n>_register_to_library</span><span class=p>(</span><span class=n>name</span><span class=p>,</span> <span class=n>component</span><span class=p>)</span>
<a id=__codelineno-0-117 name=__codelineno-0-117></a>
<a id=__codelineno-0-118 name=__codelineno-0-118></a> <span class=c1># Keep track of which components use which tags, because multiple components may</span>
<a id=__codelineno-0-119 name=__codelineno-0-119></a> <span class=c1># use the same tag.</span>
<a id=__codelineno-0-120 name=__codelineno-0-120></a> <span class=n>tag</span> <span class=o>=</span> <span class=n>entry</span><span class=o>.</span><span class=n>tag</span>
<a id=__codelineno-0-121 name=__codelineno-0-121></a> <span class=k>if</span> <span class=n>tag</span> <span class=ow>not</span> <span class=ow>in</span> <span class=bp>self</span><span class=o>.</span><span class=n>_tags</span><span class=p>:</span>
<a id=__codelineno-0-122 name=__codelineno-0-122></a> <span class=bp>self</span><span class=o>.</span><span class=n>_tags</span><span class=p>[</span><span class=n>tag</span><span class=p>]</span> <span class=o>=</span> <span class=nb>set</span><span class=p>()</span>
<a id=__codelineno-0-123 name=__codelineno-0-123></a> <span class=bp>self</span><span class=o>.</span><span class=n>_tags</span><span class=p>[</span><span class=n>tag</span><span class=p>]</span><span class=o>.</span><span class=n>add</span><span class=p>(</span><span class=n>name</span><span class=p>)</span>
<a id=__codelineno-0-124 name=__codelineno-0-124></a>
<a id=__codelineno-0-125 name=__codelineno-0-125></a> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=p>[</span><span class=n>name</span><span class=p>]</span> <span class=o>=</span> <span class=n>entry</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.component_registry.ComponentRegistry.unregister class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">unregister</span> <a href=#django_components.component_registry.ComponentRegistry.unregister class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>unregister</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Unlinks a previously-registered component from the registry under the given name.</p> <p>Once a component is unregistered, it CANNOT be used in a template anymore. Following would raise an error: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;my_comp&quot;</span> <span class=cp>%}{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
</code></pre></div></p> <p>Raises <code>NotRegistered</code> if the given name is not registered.</p> <p>Example:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=c1># First register component</span>
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a><span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>,</span> <span class=n>ButtonComponent</span><span class=p>)</span>
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a><span class=c1># Then unregister</span>
<a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a><span class=n>registry</span><span class=o>.</span><span class=n>unregister</span><span class=p>(</span><span class=s2>&quot;button&quot;</span><span class=p>)</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/component_registry.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-127>127</a></span>
<span class=normal><a href=#__codelineno-0-128>128</a></span>
<span class=normal><a href=#__codelineno-0-129>129</a></span>
<span class=normal><a href=#__codelineno-0-130>130</a></span>
<span class=normal><a href=#__codelineno-0-131>131</a></span>
<span class=normal><a href=#__codelineno-0-132>132</a></span>
<span class=normal><a href=#__codelineno-0-133>133</a></span>
<span class=normal><a href=#__codelineno-0-134>134</a></span>
<span class=normal><a href=#__codelineno-0-135>135</a></span>
<span class=normal><a href=#__codelineno-0-136>136</a></span>
<span class=normal><a href=#__codelineno-0-137>137</a></span>
<span class=normal><a href=#__codelineno-0-138>138</a></span>
<span class=normal><a href=#__codelineno-0-139>139</a></span>
<span class=normal><a href=#__codelineno-0-140>140</a></span>
<span class=normal><a href=#__codelineno-0-141>141</a></span>
<span class=normal><a href=#__codelineno-0-142>142</a></span>
<span class=normal><a href=#__codelineno-0-143>143</a></span>
<span class=normal><a href=#__codelineno-0-144>144</a></span>
<span class=normal><a href=#__codelineno-0-145>145</a></span>
<span class=normal><a href=#__codelineno-0-146>146</a></span>
<span class=normal><a href=#__codelineno-0-147>147</a></span>
<span class=normal><a href=#__codelineno-0-148>148</a></span>
<span class=normal><a href=#__codelineno-0-149>149</a></span>
<span class=normal><a href=#__codelineno-0-150>150</a></span>
<span class=normal><a href=#__codelineno-0-151>151</a></span>
<span class=normal><a href=#__codelineno-0-152>152</a></span>
<span class=normal><a href=#__codelineno-0-153>153</a></span>
<span class=normal><a href=#__codelineno-0-154>154</a></span>
<span class=normal><a href=#__codelineno-0-155>155</a></span>
<span class=normal><a href=#__codelineno-0-156>156</a></span>
<span class=normal><a href=#__codelineno-0-157>157</a></span>
<span class=normal><a href=#__codelineno-0-158>158</a></span>
<span class=normal><a href=#__codelineno-0-159>159</a></span>
<span class=normal><a href=#__codelineno-0-160>160</a></span>
<span class=normal><a href=#__codelineno-0-161>161</a></span>
<span class=normal><a href=#__codelineno-0-162>162</a></span>
<span class=normal><a href=#__codelineno-0-163>163</a></span>
<span class=normal><a href=#__codelineno-0-164>164</a></span>
<span class=normal><a href=#__codelineno-0-165>165</a></span>
<span class=normal><a href=#__codelineno-0-166>166</a></span>
<span class=normal><a href=#__codelineno-0-167>167</a></span>
<span class=normal><a href=#__codelineno-0-168>168</a></span>
<span class=normal><a href=#__codelineno-0-169>169</a></span>
<span class=normal><a href=#__codelineno-0-170>170</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-127 name=__codelineno-0-127></a><span class=k>def</span> <span class=nf>unregister</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-128 name=__codelineno-0-128></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-129 name=__codelineno-0-129></a><span class=sd> Unlinks a previously-registered component from the registry under the given name.</span>
<a id=__codelineno-0-130 name=__codelineno-0-130></a>
<a id=__codelineno-0-131 name=__codelineno-0-131></a><span class=sd> Once a component is unregistered, it CANNOT be used in a template anymore.</span>
<a id=__codelineno-0-132 name=__codelineno-0-132></a><span class=sd> Following would raise an error:</span>
<a id=__codelineno-0-133 name=__codelineno-0-133></a><span class=sd> ```django</span>
<a id=__codelineno-0-134 name=__codelineno-0-134></a><span class=sd> {% component &quot;my_comp&quot; %}{% endcomponent %}</span>
<a id=__codelineno-0-135 name=__codelineno-0-135></a><span class=sd> ```</span>
<a id=__codelineno-0-136 name=__codelineno-0-136></a>
<a id=__codelineno-0-137 name=__codelineno-0-137></a><span class=sd> Raises `NotRegistered` if the given name is not registered.</span>
<a id=__codelineno-0-138 name=__codelineno-0-138></a>
<a id=__codelineno-0-139 name=__codelineno-0-139></a><span class=sd> Example:</span>
<a id=__codelineno-0-140 name=__codelineno-0-140></a>
<a id=__codelineno-0-141 name=__codelineno-0-141></a><span class=sd> ```py</span>
<a id=__codelineno-0-142 name=__codelineno-0-142></a><span class=sd> # First register component</span>
<a id=__codelineno-0-143 name=__codelineno-0-143></a><span class=sd> registry.register(&quot;button&quot;, ButtonComponent)</span>
<a id=__codelineno-0-144 name=__codelineno-0-144></a><span class=sd> # Then unregister</span>
<a id=__codelineno-0-145 name=__codelineno-0-145></a><span class=sd> registry.unregister(&quot;button&quot;)</span>
<a id=__codelineno-0-146 name=__codelineno-0-146></a><span class=sd> ```</span>
<a id=__codelineno-0-147 name=__codelineno-0-147></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-148 name=__codelineno-0-148></a> <span class=c1># Validate</span>
<a id=__codelineno-0-149 name=__codelineno-0-149></a> <span class=bp>self</span><span class=o>.</span><span class=n>get</span><span class=p>(</span><span class=n>name</span><span class=p>)</span>
<a id=__codelineno-0-150 name=__codelineno-0-150></a>
<a id=__codelineno-0-151 name=__codelineno-0-151></a> <span class=n>entry</span> <span class=o>=</span> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=p>[</span><span class=n>name</span><span class=p>]</span>
<a id=__codelineno-0-152 name=__codelineno-0-152></a> <span class=n>tag</span> <span class=o>=</span> <span class=n>entry</span><span class=o>.</span><span class=n>tag</span>
<a id=__codelineno-0-153 name=__codelineno-0-153></a>
<a id=__codelineno-0-154 name=__codelineno-0-154></a> <span class=c1># Unregister the tag from library if this was the last component using this tag</span>
<a id=__codelineno-0-155 name=__codelineno-0-155></a> <span class=c1># Unlink component from tag</span>
<a id=__codelineno-0-156 name=__codelineno-0-156></a> <span class=bp>self</span><span class=o>.</span><span class=n>_tags</span><span class=p>[</span><span class=n>tag</span><span class=p>]</span><span class=o>.</span><span class=n>remove</span><span class=p>(</span><span class=n>name</span><span class=p>)</span>
<a id=__codelineno-0-157 name=__codelineno-0-157></a>
<a id=__codelineno-0-158 name=__codelineno-0-158></a> <span class=c1># Cleanup</span>
<a id=__codelineno-0-159 name=__codelineno-0-159></a> <span class=n>is_tag_empty</span> <span class=o>=</span> <span class=ow>not</span> <span class=nb>len</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>_tags</span><span class=p>[</span><span class=n>tag</span><span class=p>])</span>
<a id=__codelineno-0-160 name=__codelineno-0-160></a> <span class=k>if</span> <span class=n>is_tag_empty</span><span class=p>:</span>
<a id=__codelineno-0-161 name=__codelineno-0-161></a> <span class=k>del</span> <span class=bp>self</span><span class=o>.</span><span class=n>_tags</span><span class=p>[</span><span class=n>tag</span><span class=p>]</span>
<a id=__codelineno-0-162 name=__codelineno-0-162></a>
<a id=__codelineno-0-163 name=__codelineno-0-163></a> <span class=c1># Only unregister a tag if it&#39;s NOT protected</span>
<a id=__codelineno-0-164 name=__codelineno-0-164></a> <span class=n>is_protected</span> <span class=o>=</span> <span class=n>is_tag_protected</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>library</span><span class=p>,</span> <span class=n>tag</span><span class=p>)</span>
<a id=__codelineno-0-165 name=__codelineno-0-165></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>is_protected</span><span class=p>:</span>
<a id=__codelineno-0-166 name=__codelineno-0-166></a> <span class=c1># Unregister the tag from library if this was the last component using this tag</span>
<a id=__codelineno-0-167 name=__codelineno-0-167></a> <span class=k>if</span> <span class=n>is_tag_empty</span> <span class=ow>and</span> <span class=n>tag</span> <span class=ow>in</span> <span class=bp>self</span><span class=o>.</span><span class=n>library</span><span class=o>.</span><span class=n>tags</span><span class=p>:</span>
<a id=__codelineno-0-168 name=__codelineno-0-168></a> <span class=k>del</span> <span class=bp>self</span><span class=o>.</span><span class=n>library</span><span class=o>.</span><span class=n>tags</span><span class=p>[</span><span class=n>tag</span><span class=p>]</span>
<a id=__codelineno-0-169 name=__codelineno-0-169></a>
<a id=__codelineno-0-170 name=__codelineno-0-170></a> <span class=k>del</span> <span class=bp>self</span><span class=o>.</span><span class=n>_registry</span><span class=p>[</span><span class=n>name</span><span class=p>]</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.component_registry.register class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">register</span> <a href=#django_components.component_registry.register class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>register</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>registry</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.component_registry.ComponentRegistry href=component_registry/#django_components.component_registry.ComponentRegistry>ComponentRegistry</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>[[</span><span class=n><span title=django_components.component_registry._TComp>_TComp</span></span><span class=p>],</span> <span class=n><span title=django_components.component_registry._TComp>_TComp</span></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Class decorator to register a component.</p> <p>Usage:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=nd>@register</span><span class=p>(</span><span class=s2>&quot;my_component&quot;</span><span class=p>)</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=o>...</span>
</code></pre></div> <p>Optionally specify which <code>ComponentRegistry</code> the component should be registered to by setting the <code>registry</code> kwarg:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=n>my_lib</span> <span class=o>=</span> <span class=n>django</span><span class=o>.</span><span class=n>template</span><span class=o>.</span><span class=n>Library</span><span class=p>()</span>
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a><span class=n>my_reg</span> <span class=o>=</span> <span class=n>ComponentRegistry</span><span class=p>(</span><span class=n>library</span><span class=o>=</span><span class=n>my_lib</span><span class=p>)</span>
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a>
<a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a><span class=nd>@register</span><span class=p>(</span><span class=s2>&quot;my_component&quot;</span><span class=p>,</span> <span class=n>registry</span><span class=o>=</span><span class=n>my_reg</span><span class=p>)</span>
<a id=__codelineno-1-5 name=__codelineno-1-5 href=#__codelineno-1-5></a><span class=k>class</span> <span class=nc>MyComponent</span><span class=p>(</span><span class=n>Component</span><span class=p>):</span>
<a id=__codelineno-1-6 name=__codelineno-1-6 href=#__codelineno-1-6></a> <span class=o>...</span>
</code></pre></div> <details class=quote> <summary>Source code in <code>src/django_components/component_registry.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-277>277</a></span>
<span class=normal><a href=#__codelineno-0-278>278</a></span>
<span class=normal><a href=#__codelineno-0-279>279</a></span>
<span class=normal><a href=#__codelineno-0-280>280</a></span>
<span class=normal><a href=#__codelineno-0-281>281</a></span>
<span class=normal><a href=#__codelineno-0-282>282</a></span>
<span class=normal><a href=#__codelineno-0-283>283</a></span>
<span class=normal><a href=#__codelineno-0-284>284</a></span>
<span class=normal><a href=#__codelineno-0-285>285</a></span>
<span class=normal><a href=#__codelineno-0-286>286</a></span>
<span class=normal><a href=#__codelineno-0-287>287</a></span>
<span class=normal><a href=#__codelineno-0-288>288</a></span>
<span class=normal><a href=#__codelineno-0-289>289</a></span>
<span class=normal><a href=#__codelineno-0-290>290</a></span>
<span class=normal><a href=#__codelineno-0-291>291</a></span>
<span class=normal><a href=#__codelineno-0-292>292</a></span>
<span class=normal><a href=#__codelineno-0-293>293</a></span>
<span class=normal><a href=#__codelineno-0-294>294</a></span>
<span class=normal><a href=#__codelineno-0-295>295</a></span>
<span class=normal><a href=#__codelineno-0-296>296</a></span>
<span class=normal><a href=#__codelineno-0-297>297</a></span>
<span class=normal><a href=#__codelineno-0-298>298</a></span>
<span class=normal><a href=#__codelineno-0-299>299</a></span>
<span class=normal><a href=#__codelineno-0-300>300</a></span>
<span class=normal><a href=#__codelineno-0-301>301</a></span>
<span class=normal><a href=#__codelineno-0-302>302</a></span>
<span class=normal><a href=#__codelineno-0-303>303</a></span>
<span class=normal><a href=#__codelineno-0-304>304</a></span>
<span class=normal><a href=#__codelineno-0-305>305</a></span>
<span class=normal><a href=#__codelineno-0-306>306</a></span>
<span class=normal><a href=#__codelineno-0-307>307</a></span>
<span class=normal><a href=#__codelineno-0-308>308</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-277 name=__codelineno-0-277></a><span class=k>def</span> <span class=nf>register</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span> <span class=n>registry</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>ComponentRegistry</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Callable</span><span class=p>[[</span><span class=n>_TComp</span><span class=p>],</span> <span class=n>_TComp</span><span class=p>]:</span>
<a id=__codelineno-0-278 name=__codelineno-0-278></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-279 name=__codelineno-0-279></a><span class=sd> Class decorator to register a component.</span>
<a id=__codelineno-0-280 name=__codelineno-0-280></a>
<a id=__codelineno-0-281 name=__codelineno-0-281></a><span class=sd> Usage:</span>
<a id=__codelineno-0-282 name=__codelineno-0-282></a>
<a id=__codelineno-0-283 name=__codelineno-0-283></a><span class=sd> ```py</span>
<a id=__codelineno-0-284 name=__codelineno-0-284></a><span class=sd> @register(&quot;my_component&quot;)</span>
<a id=__codelineno-0-285 name=__codelineno-0-285></a><span class=sd> class MyComponent(Component):</span>
<a id=__codelineno-0-286 name=__codelineno-0-286></a><span class=sd> ...</span>
<a id=__codelineno-0-287 name=__codelineno-0-287></a><span class=sd> ```</span>
<a id=__codelineno-0-288 name=__codelineno-0-288></a>
<a id=__codelineno-0-289 name=__codelineno-0-289></a><span class=sd> Optionally specify which `ComponentRegistry` the component should be registered to by</span>
<a id=__codelineno-0-290 name=__codelineno-0-290></a><span class=sd> setting the `registry` kwarg:</span>
<a id=__codelineno-0-291 name=__codelineno-0-291></a>
<a id=__codelineno-0-292 name=__codelineno-0-292></a><span class=sd> ```py</span>
<a id=__codelineno-0-293 name=__codelineno-0-293></a><span class=sd> my_lib = django.template.Library()</span>
<a id=__codelineno-0-294 name=__codelineno-0-294></a><span class=sd> my_reg = ComponentRegistry(library=my_lib)</span>
<a id=__codelineno-0-295 name=__codelineno-0-295></a>
<a id=__codelineno-0-296 name=__codelineno-0-296></a><span class=sd> @register(&quot;my_component&quot;, registry=my_reg)</span>
<a id=__codelineno-0-297 name=__codelineno-0-297></a><span class=sd> class MyComponent(Component):</span>
<a id=__codelineno-0-298 name=__codelineno-0-298></a><span class=sd> ...</span>
<a id=__codelineno-0-299 name=__codelineno-0-299></a><span class=sd> ```</span>
<a id=__codelineno-0-300 name=__codelineno-0-300></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-301 name=__codelineno-0-301></a> <span class=k>if</span> <span class=n>registry</span> <span class=ow>is</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-302 name=__codelineno-0-302></a> <span class=n>registry</span> <span class=o>=</span> <span class=n>_the_registry</span>
<a id=__codelineno-0-303 name=__codelineno-0-303></a>
<a id=__codelineno-0-304 name=__codelineno-0-304></a> <span class=k>def</span> <span class=nf>decorator</span><span class=p>(</span><span class=n>component</span><span class=p>:</span> <span class=n>_TComp</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>_TComp</span><span class=p>:</span>
<a id=__codelineno-0-305 name=__codelineno-0-305></a> <span class=n>registry</span><span class=o>.</span><span class=n>register</span><span class=p>(</span><span class=n>name</span><span class=o>=</span><span class=n>name</span><span class=p>,</span> <span class=n>component</span><span class=o>=</span><span class=n>component</span><span class=p>)</span>
<a id=__codelineno-0-306 name=__codelineno-0-306></a> <span class=k>return</span> <span class=n>component</span>
<a id=__codelineno-0-307 name=__codelineno-0-307></a>
<a id=__codelineno-0-308 name=__codelineno-0-308></a> <span class=k>return</span> <span class=n>decorator</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.context class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">context</span> <a href=#django_components.context class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p>This file centralizes various ways we use Django's Context class pass data across components, nodes, slots, and contexts.</p> <p>You can think of the Context as our storage system.</p> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.context.copy_forloop_context class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">copy_forloop_context</span> <a href=#django_components.context.copy_forloop_context class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>copy_forloop_context</span><span class=p>(</span><span class=n>from_context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>,</span> <span class=n>to_context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Forward the info about the current loop</p> <details class=quote> <summary>Source code in <code>src/django_components/context.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-64>64</a></span>
<span class=normal><a href=#__codelineno-0-65>65</a></span>
<span class=normal><a href=#__codelineno-0-66>66</a></span>
<span class=normal><a href=#__codelineno-0-67>67</a></span>
<span class=normal><a href=#__codelineno-0-68>68</a></span>
<span class=normal><a href=#__codelineno-0-69>69</a></span>
<span class=normal><a href=#__codelineno-0-70>70</a></span>
<span class=normal><a href=#__codelineno-0-71>71</a></span>
<span class=normal><a href=#__codelineno-0-72>72</a></span>
<span class=normal><a href=#__codelineno-0-73>73</a></span>
<span class=normal><a href=#__codelineno-0-74>74</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-64 name=__codelineno-0-64></a><span class=k>def</span> <span class=nf>copy_forloop_context</span><span class=p>(</span><span class=n>from_context</span><span class=p>:</span> <span class=n>Context</span><span class=p>,</span> <span class=n>to_context</span><span class=p>:</span> <span class=n>Context</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-65 name=__codelineno-0-65></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Forward the info about the current loop&quot;&quot;&quot;</span>
<a id=__codelineno-0-66 name=__codelineno-0-66></a> <span class=c1># Note that the ForNode (which implements for loop behavior) does not</span>
<a id=__codelineno-0-67 name=__codelineno-0-67></a> <span class=c1># only add the `forloop` key, but also keys corresponding to the loop elements</span>
<a id=__codelineno-0-68 name=__codelineno-0-68></a> <span class=c1># So if the loop syntax is `{% for my_val in my_lists %}`, then ForNode also</span>
<a id=__codelineno-0-69 name=__codelineno-0-69></a> <span class=c1># sets a `my_val` key.</span>
<a id=__codelineno-0-70 name=__codelineno-0-70></a> <span class=c1># For this reason, instead of copying individual keys, we copy the whole stack layer</span>
<a id=__codelineno-0-71 name=__codelineno-0-71></a> <span class=c1># set by ForNode.</span>
<a id=__codelineno-0-72 name=__codelineno-0-72></a> <span class=k>if</span> <span class=s2>&quot;forloop&quot;</span> <span class=ow>in</span> <span class=n>from_context</span><span class=p>:</span>
<a id=__codelineno-0-73 name=__codelineno-0-73></a> <span class=n>forloop_dict_index</span> <span class=o>=</span> <span class=n>find_last_index</span><span class=p>(</span><span class=n>from_context</span><span class=o>.</span><span class=n>dicts</span><span class=p>,</span> <span class=k>lambda</span> <span class=n>d</span><span class=p>:</span> <span class=s2>&quot;forloop&quot;</span> <span class=ow>in</span> <span class=n>d</span><span class=p>)</span>
<a id=__codelineno-0-74 name=__codelineno-0-74></a> <span class=n>to_context</span><span class=o>.</span><span class=n>update</span><span class=p>(</span><span class=n>from_context</span><span class=o>.</span><span class=n>dicts</span><span class=p>[</span><span class=n>forloop_dict_index</span><span class=p>])</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.context.get_injected_context_var class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_injected_context_var</span> <a href=#django_components.context.get_injected_context_var class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>get_injected_context_var</span><span class=p>(</span><span class=n>component_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>,</span> <span class=n>key</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>default</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Retrieve a 'provided' field. The field MUST have been previously 'provided' by the component's ancestors using the <code>{% provide %}</code> template tag.</p> <details class=quote> <summary>Source code in <code>src/django_components/context.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-77> 77</a></span>
<span class=normal><a href=#__codelineno-0-78> 78</a></span>
<span class=normal><a href=#__codelineno-0-79> 79</a></span>
<span class=normal><a href=#__codelineno-0-80> 80</a></span>
<span class=normal><a href=#__codelineno-0-81> 81</a></span>
<span class=normal><a href=#__codelineno-0-82> 82</a></span>
<span class=normal><a href=#__codelineno-0-83> 83</a></span>
<span class=normal><a href=#__codelineno-0-84> 84</a></span>
<span class=normal><a href=#__codelineno-0-85> 85</a></span>
<span class=normal><a href=#__codelineno-0-86> 86</a></span>
<span class=normal><a href=#__codelineno-0-87> 87</a></span>
<span class=normal><a href=#__codelineno-0-88> 88</a></span>
<span class=normal><a href=#__codelineno-0-89> 89</a></span>
<span class=normal><a href=#__codelineno-0-90> 90</a></span>
<span class=normal><a href=#__codelineno-0-91> 91</a></span>
<span class=normal><a href=#__codelineno-0-92> 92</a></span>
<span class=normal><a href=#__codelineno-0-93> 93</a></span>
<span class=normal><a href=#__codelineno-0-94> 94</a></span>
<span class=normal><a href=#__codelineno-0-95> 95</a></span>
<span class=normal><a href=#__codelineno-0-96> 96</a></span>
<span class=normal><a href=#__codelineno-0-97> 97</a></span>
<span class=normal><a href=#__codelineno-0-98> 98</a></span>
<span class=normal><a href=#__codelineno-0-99> 99</a></span>
<span class=normal><a href=#__codelineno-0-100>100</a></span>
<span class=normal><a href=#__codelineno-0-101>101</a></span>
<span class=normal><a href=#__codelineno-0-102>102</a></span>
<span class=normal><a href=#__codelineno-0-103>103</a></span>
<span class=normal><a href=#__codelineno-0-104>104</a></span>
<span class=normal><a href=#__codelineno-0-105>105</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-77 name=__codelineno-0-77></a><span class=k>def</span> <span class=nf>get_injected_context_var</span><span class=p>(</span>
<a id=__codelineno-0-78 name=__codelineno-0-78></a> <span class=n>component_name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a> <span class=n>context</span><span class=p>:</span> <span class=n>Context</span><span class=p>,</span>
<a id=__codelineno-0-80 name=__codelineno-0-80></a> <span class=n>key</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-81 name=__codelineno-0-81></a> <span class=n>default</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Any</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Any</span><span class=p>:</span>
<a id=__codelineno-0-83 name=__codelineno-0-83></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-84 name=__codelineno-0-84></a><span class=sd> Retrieve a &#39;provided&#39; field. The field MUST have been previously &#39;provided&#39;</span>
<a id=__codelineno-0-85 name=__codelineno-0-85></a><span class=sd> by the component&#39;s ancestors using the `{% provide %}` template tag.</span>
<a id=__codelineno-0-86 name=__codelineno-0-86></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-87 name=__codelineno-0-87></a> <span class=c1># NOTE: For simplicity, we keep the provided values directly on the context.</span>
<a id=__codelineno-0-88 name=__codelineno-0-88></a> <span class=c1># This plays nicely with Django&#39;s Context, which behaves like a stack, so &quot;newer&quot;</span>
<a id=__codelineno-0-89 name=__codelineno-0-89></a> <span class=c1># values overshadow the &quot;older&quot; ones.</span>
<a id=__codelineno-0-90 name=__codelineno-0-90></a> <span class=n>internal_key</span> <span class=o>=</span> <span class=n>_INJECT_CONTEXT_KEY_PREFIX</span> <span class=o>+</span> <span class=n>key</span>
<a id=__codelineno-0-91 name=__codelineno-0-91></a>
<a id=__codelineno-0-92 name=__codelineno-0-92></a> <span class=c1># Return provided value if found</span>
<a id=__codelineno-0-93 name=__codelineno-0-93></a> <span class=k>if</span> <span class=n>internal_key</span> <span class=ow>in</span> <span class=n>context</span><span class=p>:</span>
<a id=__codelineno-0-94 name=__codelineno-0-94></a> <span class=k>return</span> <span class=n>context</span><span class=p>[</span><span class=n>internal_key</span><span class=p>]</span>
<a id=__codelineno-0-95 name=__codelineno-0-95></a>
<a id=__codelineno-0-96 name=__codelineno-0-96></a> <span class=c1># If a default was given, return that</span>
<a id=__codelineno-0-97 name=__codelineno-0-97></a> <span class=k>if</span> <span class=n>default</span> <span class=ow>is</span> <span class=ow>not</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-98 name=__codelineno-0-98></a> <span class=k>return</span> <span class=n>default</span>
<a id=__codelineno-0-99 name=__codelineno-0-99></a>
<a id=__codelineno-0-100 name=__codelineno-0-100></a> <span class=c1># Otherwise raise error</span>
<a id=__codelineno-0-101 name=__codelineno-0-101></a> <span class=k>raise</span> <span class=ne>KeyError</span><span class=p>(</span>
<a id=__codelineno-0-102 name=__codelineno-0-102></a> <span class=sa>f</span><span class=s2>&quot;Component &#39;</span><span class=si>{</span><span class=n>component_name</span><span class=si>}</span><span class=s2>&#39; tried to inject a variable &#39;</span><span class=si>{</span><span class=n>key</span><span class=si>}</span><span class=s2>&#39; before it was provided.&quot;</span>
<a id=__codelineno-0-103 name=__codelineno-0-103></a> <span class=sa>f</span><span class=s2>&quot; To fix this, make sure that at least one ancestor of component &#39;</span><span class=si>{</span><span class=n>component_name</span><span class=si>}</span><span class=s2>&#39; has&quot;</span>
<a id=__codelineno-0-104 name=__codelineno-0-104></a> <span class=sa>f</span><span class=s2>&quot; the variable &#39;</span><span class=si>{</span><span class=n>key</span><span class=si>}</span><span class=s2>&#39; in their &#39;provide&#39; attribute.&quot;</span>
<a id=__codelineno-0-105 name=__codelineno-0-105></a> <span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.context.prepare_context class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">prepare_context</span> <a href=#django_components.context.prepare_context class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>prepare_context</span><span class=p>(</span><span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>,</span> <span class=n>component_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Initialize the internal context state.</p> <details class=quote> <summary>Source code in <code>src/django_components/context.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-22>22</a></span>
<span class=normal><a href=#__codelineno-0-23>23</a></span>
<span class=normal><a href=#__codelineno-0-24>24</a></span>
<span class=normal><a href=#__codelineno-0-25>25</a></span>
<span class=normal><a href=#__codelineno-0-26>26</a></span>
<span class=normal><a href=#__codelineno-0-27>27</a></span>
<span class=normal><a href=#__codelineno-0-28>28</a></span>
<span class=normal><a href=#__codelineno-0-29>29</a></span>
<span class=normal><a href=#__codelineno-0-30>30</a></span>
<span class=normal><a href=#__codelineno-0-31>31</a></span>
<span class=normal><a href=#__codelineno-0-32>32</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-22 name=__codelineno-0-22></a><span class=k>def</span> <span class=nf>prepare_context</span><span class=p>(</span>
<a id=__codelineno-0-23 name=__codelineno-0-23></a> <span class=n>context</span><span class=p>:</span> <span class=n>Context</span><span class=p>,</span>
<a id=__codelineno-0-24 name=__codelineno-0-24></a> <span class=n>component_id</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-25 name=__codelineno-0-25></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-26 name=__codelineno-0-26></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Initialize the internal context state.&quot;&quot;&quot;</span>
<a id=__codelineno-0-27 name=__codelineno-0-27></a> <span class=c1># Initialize mapping dicts within this rendering run.</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a> <span class=c1># This is shared across the whole render chain, thus we set it only once.</span>
<a id=__codelineno-0-29 name=__codelineno-0-29></a> <span class=k>if</span> <span class=n>_FILLED_SLOTS_CONTENT_CONTEXT_KEY</span> <span class=ow>not</span> <span class=ow>in</span> <span class=n>context</span><span class=p>:</span>
<a id=__codelineno-0-30 name=__codelineno-0-30></a> <span class=n>context</span><span class=p>[</span><span class=n>_FILLED_SLOTS_CONTENT_CONTEXT_KEY</span><span class=p>]</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-31 name=__codelineno-0-31></a>
<a id=__codelineno-0-32 name=__codelineno-0-32></a> <span class=n>set_component_id</span><span class=p>(</span><span class=n>context</span><span class=p>,</span> <span class=n>component_id</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.context.set_component_id class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">set_component_id</span> <a href=#django_components.context.set_component_id class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>set_component_id</span><span class=p>(</span><span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>,</span> <span class=n>component_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>We use the Context object to pass down info on inside of which component we are currently rendering.</p> <details class=quote> <summary>Source code in <code>src/django_components/context.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-53>53</a></span>
<span class=normal><a href=#__codelineno-0-54>54</a></span>
<span class=normal><a href=#__codelineno-0-55>55</a></span>
<span class=normal><a href=#__codelineno-0-56>56</a></span>
<span class=normal><a href=#__codelineno-0-57>57</a></span>
<span class=normal><a href=#__codelineno-0-58>58</a></span>
<span class=normal><a href=#__codelineno-0-59>59</a></span>
<span class=normal><a href=#__codelineno-0-60>60</a></span>
<span class=normal><a href=#__codelineno-0-61>61</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-53 name=__codelineno-0-53></a><span class=k>def</span> <span class=nf>set_component_id</span><span class=p>(</span><span class=n>context</span><span class=p>:</span> <span class=n>Context</span><span class=p>,</span> <span class=n>component_id</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-54 name=__codelineno-0-54></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-55 name=__codelineno-0-55></a><span class=sd> We use the Context object to pass down info on inside of which component</span>
<a id=__codelineno-0-56 name=__codelineno-0-56></a><span class=sd> we are currently rendering.</span>
<a id=__codelineno-0-57 name=__codelineno-0-57></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-58 name=__codelineno-0-58></a> <span class=c1># Store the previous component so we can detect if the current component</span>
<a id=__codelineno-0-59 name=__codelineno-0-59></a> <span class=c1># is the top-most or not. If it is, then &quot;_parent_component_id&quot; is None</span>
<a id=__codelineno-0-60 name=__codelineno-0-60></a> <span class=n>context</span><span class=p>[</span><span class=n>_PARENT_COMP_CONTEXT_KEY</span><span class=p>]</span> <span class=o>=</span> <span class=n>context</span><span class=o>.</span><span class=n>get</span><span class=p>(</span><span class=n>_CURRENT_COMP_CONTEXT_KEY</span><span class=p>,</span> <span class=kc>None</span><span class=p>)</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a> <span class=n>context</span><span class=p>[</span><span class=n>_CURRENT_COMP_CONTEXT_KEY</span><span class=p>]</span> <span class=o>=</span> <span class=n>component_id</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.context.set_provided_context_var class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">set_provided_context_var</span> <a href=#django_components.context.set_provided_context_var class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>set_provided_context_var</span><span class=p>(</span><span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>,</span> <span class=n>key</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>provided_kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>'Provide' given data under given key. In other words, this data can be retrieved using <code>self.inject(key)</code> inside of <code>get_context_data()</code> method of components that are nested inside the <code>{% provide %}</code> tag.</p> <details class=quote> <summary>Source code in <code>src/django_components/context.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-108>108</a></span>
<span class=normal><a href=#__codelineno-0-109>109</a></span>
<span class=normal><a href=#__codelineno-0-110>110</a></span>
<span class=normal><a href=#__codelineno-0-111>111</a></span>
<span class=normal><a href=#__codelineno-0-112>112</a></span>
<span class=normal><a href=#__codelineno-0-113>113</a></span>
<span class=normal><a href=#__codelineno-0-114>114</a></span>
<span class=normal><a href=#__codelineno-0-115>115</a></span>
<span class=normal><a href=#__codelineno-0-116>116</a></span>
<span class=normal><a href=#__codelineno-0-117>117</a></span>
<span class=normal><a href=#__codelineno-0-118>118</a></span>
<span class=normal><a href=#__codelineno-0-119>119</a></span>
<span class=normal><a href=#__codelineno-0-120>120</a></span>
<span class=normal><a href=#__codelineno-0-121>121</a></span>
<span class=normal><a href=#__codelineno-0-122>122</a></span>
<span class=normal><a href=#__codelineno-0-123>123</a></span>
<span class=normal><a href=#__codelineno-0-124>124</a></span>
<span class=normal><a href=#__codelineno-0-125>125</a></span>
<span class=normal><a href=#__codelineno-0-126>126</a></span>
<span class=normal><a href=#__codelineno-0-127>127</a></span>
<span class=normal><a href=#__codelineno-0-128>128</a></span>
<span class=normal><a href=#__codelineno-0-129>129</a></span>
<span class=normal><a href=#__codelineno-0-130>130</a></span>
<span class=normal><a href=#__codelineno-0-131>131</a></span>
<span class=normal><a href=#__codelineno-0-132>132</a></span>
<span class=normal><a href=#__codelineno-0-133>133</a></span>
<span class=normal><a href=#__codelineno-0-134>134</a></span>
<span class=normal><a href=#__codelineno-0-135>135</a></span>
<span class=normal><a href=#__codelineno-0-136>136</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-108 name=__codelineno-0-108></a><span class=k>def</span> <span class=nf>set_provided_context_var</span><span class=p>(</span>
<a id=__codelineno-0-109 name=__codelineno-0-109></a> <span class=n>context</span><span class=p>:</span> <span class=n>Context</span><span class=p>,</span>
<a id=__codelineno-0-110 name=__codelineno-0-110></a> <span class=n>key</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-111 name=__codelineno-0-111></a> <span class=n>provided_kwargs</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>],</span>
<a id=__codelineno-0-112 name=__codelineno-0-112></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-113 name=__codelineno-0-113></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-114 name=__codelineno-0-114></a><span class=sd> &#39;Provide&#39; given data under given key. In other words, this data can be retrieved</span>
<a id=__codelineno-0-115 name=__codelineno-0-115></a><span class=sd> using `self.inject(key)` inside of `get_context_data()` method of components that</span>
<a id=__codelineno-0-116 name=__codelineno-0-116></a><span class=sd> are nested inside the `{% provide %}` tag.</span>
<a id=__codelineno-0-117 name=__codelineno-0-117></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-118 name=__codelineno-0-118></a> <span class=c1># NOTE: We raise TemplateSyntaxError since this func should be called only from</span>
<a id=__codelineno-0-119 name=__codelineno-0-119></a> <span class=c1># within template.</span>
<a id=__codelineno-0-120 name=__codelineno-0-120></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>key</span><span class=p>:</span>
<a id=__codelineno-0-121 name=__codelineno-0-121></a> <span class=k>raise</span> <span class=n>TemplateSyntaxError</span><span class=p>(</span>
<a id=__codelineno-0-122 name=__codelineno-0-122></a> <span class=s2>&quot;Provide tag received an empty string. Key must be non-empty and a valid identifier.&quot;</span>
<a id=__codelineno-0-123 name=__codelineno-0-123></a> <span class=p>)</span>
<a id=__codelineno-0-124 name=__codelineno-0-124></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>key</span><span class=o>.</span><span class=n>isidentifier</span><span class=p>():</span>
<a id=__codelineno-0-125 name=__codelineno-0-125></a> <span class=k>raise</span> <span class=n>TemplateSyntaxError</span><span class=p>(</span>
<a id=__codelineno-0-126 name=__codelineno-0-126></a> <span class=s2>&quot;Provide tag received a non-identifier string. Key must be non-empty and a valid identifier.&quot;</span>
<a id=__codelineno-0-127 name=__codelineno-0-127></a> <span class=p>)</span>
<a id=__codelineno-0-128 name=__codelineno-0-128></a>
<a id=__codelineno-0-129 name=__codelineno-0-129></a> <span class=c1># We turn the kwargs into a NamedTuple so that the object that&#39;s &quot;provided&quot;</span>
<a id=__codelineno-0-130 name=__codelineno-0-130></a> <span class=c1># is immutable. This ensures that the data returned from `inject` will always</span>
<a id=__codelineno-0-131 name=__codelineno-0-131></a> <span class=c1># have all the keys that were passed to the `provide` tag.</span>
<a id=__codelineno-0-132 name=__codelineno-0-132></a> <span class=n>tpl_cls</span> <span class=o>=</span> <span class=n>namedtuple</span><span class=p>(</span><span class=s2>&quot;DepInject&quot;</span><span class=p>,</span> <span class=n>provided_kwargs</span><span class=o>.</span><span class=n>keys</span><span class=p>())</span> <span class=c1># type: ignore[misc]</span>
<a id=__codelineno-0-133 name=__codelineno-0-133></a> <span class=n>payload</span> <span class=o>=</span> <span class=n>tpl_cls</span><span class=p>(</span><span class=o>**</span><span class=n>provided_kwargs</span><span class=p>)</span>
<a id=__codelineno-0-134 name=__codelineno-0-134></a>
<a id=__codelineno-0-135 name=__codelineno-0-135></a> <span class=n>internal_key</span> <span class=o>=</span> <span class=n>_INJECT_CONTEXT_KEY_PREFIX</span> <span class=o>+</span> <span class=n>key</span>
<a id=__codelineno-0-136 name=__codelineno-0-136></a> <span class=n>context</span><span class=p>[</span><span class=n>internal_key</span><span class=p>]</span> <span class=o>=</span> <span class=n>payload</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.expression class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">expression</span> <a href=#django_components.expression class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.expression.process_aggregate_kwargs class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">process_aggregate_kwargs</span> <a href=#django_components.expression.process_aggregate_kwargs class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>process_aggregate_kwargs</span><span class=p>(</span><span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Mapping href=https://docs.python.org/3.12/library/typing.html#typing.Mapping>Mapping</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>This function aggregates "prefixed" kwargs into dicts. "Prefixed" kwargs start with some prefix delimited with <code>:</code> (e.g. <code>attrs:</code>).</p> <p>Example: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>process_component_kwargs</span><span class=p>({</span><span class=s2>&quot;abc:one&quot;</span><span class=p>:</span> <span class=mi>1</span><span class=p>,</span> <span class=s2>&quot;abc:two&quot;</span><span class=p>:</span> <span class=mi>2</span><span class=p>,</span> <span class=s2>&quot;def:three&quot;</span><span class=p>:</span> <span class=mi>3</span><span class=p>,</span> <span class=s2>&quot;four&quot;</span><span class=p>:</span> <span class=mi>4</span><span class=p>})</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=c1># {&quot;abc&quot;: {&quot;one&quot;: 1, &quot;two&quot;: 2}, &quot;def&quot;: {&quot;three&quot;: 3}, &quot;four&quot;: 4}</span>
</code></pre></div></p> <hr> <p>We want to support a use case similar to Vue's fallthrough attributes. In other words, where a component author can designate a prop (input) which is a dict and which will be rendered as HTML attributes.</p> <p>This is useful for allowing component users to tweak styling or add event handling to the underlying HTML. E.g.:</p> <p><code>class="pa-4 d-flex text-black"</code> or <code>@click.stop="alert('clicked!')"</code></p> <p>So if the prop is <code>attrs</code>, and the component is called like so: <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;my_comp&quot;</span> <span class=nv>attrs</span><span class=o>=</span><span class=nv>attrs</span> <span class=cp>%}</span>
</code></pre></div></p> <p>then, if <code>attrs</code> is: <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=p>{</span><span class=s2>&quot;class&quot;</span><span class=p>:</span> <span class=s2>&quot;text-red pa-4&quot;</span><span class=p>,</span> <span class=s2>&quot;@click&quot;</span><span class=p>:</span> <span class=s2>&quot;dispatch(&#39;my_event&#39;, 123)&quot;</span><span class=p>}</span>
</code></pre></div></p> <p>and the component template is: <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a><span class=x>&lt;div </span><span class=cp>{%</span> <span class=k>html_attrs</span> <span class=nv>attrs</span> <span class=nv>add</span><span class=o>:</span><span class=nv>class</span><span class=o>=</span><span class=s2>&quot;extra-class&quot;</span> <span class=cp>%}</span><span class=x>&gt;&lt;/div&gt;</span>
</code></pre></div></p> <p>Then this renders: <div class=highlight><pre><span></span><code><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a><span class=p>&lt;</span><span class=nt>div</span> <span class=na>class</span><span class=o>=</span><span class=s>&quot;text-red pa-4 extra-class&quot;</span> <span class=err>@</span><span class=na>click</span><span class=o>=</span><span class=s>&quot;dispatch(&#39;my_event&#39;, 123)&quot;</span> <span class=p>&gt;&lt;/</span><span class=nt>div</span><span class=p>&gt;</span>
</code></pre></div></p> <p>However, this way it is difficult for the component user to define the <code>attrs</code> variable, especially if they want to combine static and dynamic values. Because they will need to pre-process the <code>attrs</code> dict.</p> <p>So, instead, we allow to "aggregate" props into a dict. So all props that start with <code>attrs:</code>, like <code>attrs:class="text-red"</code>, will be collected into a dict at key <code>attrs</code>.</p> <p>This provides sufficient flexiblity to make it easy for component users to provide "fallthrough attributes", and sufficiently easy for component authors to process that input while still being able to provide their own keys.</p> <details class=quote> <summary>Source code in <code>src/django_components/expression.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-75> 75</a></span>
<span class=normal><a href=#__codelineno-0-76> 76</a></span>
<span class=normal><a href=#__codelineno-0-77> 77</a></span>
<span class=normal><a href=#__codelineno-0-78> 78</a></span>
<span class=normal><a href=#__codelineno-0-79> 79</a></span>
<span class=normal><a href=#__codelineno-0-80> 80</a></span>
<span class=normal><a href=#__codelineno-0-81> 81</a></span>
<span class=normal><a href=#__codelineno-0-82> 82</a></span>
<span class=normal><a href=#__codelineno-0-83> 83</a></span>
<span class=normal><a href=#__codelineno-0-84> 84</a></span>
<span class=normal><a href=#__codelineno-0-85> 85</a></span>
<span class=normal><a href=#__codelineno-0-86> 86</a></span>
<span class=normal><a href=#__codelineno-0-87> 87</a></span>
<span class=normal><a href=#__codelineno-0-88> 88</a></span>
<span class=normal><a href=#__codelineno-0-89> 89</a></span>
<span class=normal><a href=#__codelineno-0-90> 90</a></span>
<span class=normal><a href=#__codelineno-0-91> 91</a></span>
<span class=normal><a href=#__codelineno-0-92> 92</a></span>
<span class=normal><a href=#__codelineno-0-93> 93</a></span>
<span class=normal><a href=#__codelineno-0-94> 94</a></span>
<span class=normal><a href=#__codelineno-0-95> 95</a></span>
<span class=normal><a href=#__codelineno-0-96> 96</a></span>
<span class=normal><a href=#__codelineno-0-97> 97</a></span>
<span class=normal><a href=#__codelineno-0-98> 98</a></span>
<span class=normal><a href=#__codelineno-0-99> 99</a></span>
<span class=normal><a href=#__codelineno-0-100>100</a></span>
<span class=normal><a href=#__codelineno-0-101>101</a></span>
<span class=normal><a href=#__codelineno-0-102>102</a></span>
<span class=normal><a href=#__codelineno-0-103>103</a></span>
<span class=normal><a href=#__codelineno-0-104>104</a></span>
<span class=normal><a href=#__codelineno-0-105>105</a></span>
<span class=normal><a href=#__codelineno-0-106>106</a></span>
<span class=normal><a href=#__codelineno-0-107>107</a></span>
<span class=normal><a href=#__codelineno-0-108>108</a></span>
<span class=normal><a href=#__codelineno-0-109>109</a></span>
<span class=normal><a href=#__codelineno-0-110>110</a></span>
<span class=normal><a href=#__codelineno-0-111>111</a></span>
<span class=normal><a href=#__codelineno-0-112>112</a></span>
<span class=normal><a href=#__codelineno-0-113>113</a></span>
<span class=normal><a href=#__codelineno-0-114>114</a></span>
<span class=normal><a href=#__codelineno-0-115>115</a></span>
<span class=normal><a href=#__codelineno-0-116>116</a></span>
<span class=normal><a href=#__codelineno-0-117>117</a></span>
<span class=normal><a href=#__codelineno-0-118>118</a></span>
<span class=normal><a href=#__codelineno-0-119>119</a></span>
<span class=normal><a href=#__codelineno-0-120>120</a></span>
<span class=normal><a href=#__codelineno-0-121>121</a></span>
<span class=normal><a href=#__codelineno-0-122>122</a></span>
<span class=normal><a href=#__codelineno-0-123>123</a></span>
<span class=normal><a href=#__codelineno-0-124>124</a></span>
<span class=normal><a href=#__codelineno-0-125>125</a></span>
<span class=normal><a href=#__codelineno-0-126>126</a></span>
<span class=normal><a href=#__codelineno-0-127>127</a></span>
<span class=normal><a href=#__codelineno-0-128>128</a></span>
<span class=normal><a href=#__codelineno-0-129>129</a></span>
<span class=normal><a href=#__codelineno-0-130>130</a></span>
<span class=normal><a href=#__codelineno-0-131>131</a></span>
<span class=normal><a href=#__codelineno-0-132>132</a></span>
<span class=normal><a href=#__codelineno-0-133>133</a></span>
<span class=normal><a href=#__codelineno-0-134>134</a></span>
<span class=normal><a href=#__codelineno-0-135>135</a></span>
<span class=normal><a href=#__codelineno-0-136>136</a></span>
<span class=normal><a href=#__codelineno-0-137>137</a></span>
<span class=normal><a href=#__codelineno-0-138>138</a></span>
<span class=normal><a href=#__codelineno-0-139>139</a></span>
<span class=normal><a href=#__codelineno-0-140>140</a></span>
<span class=normal><a href=#__codelineno-0-141>141</a></span>
<span class=normal><a href=#__codelineno-0-142>142</a></span>
<span class=normal><a href=#__codelineno-0-143>143</a></span>
<span class=normal><a href=#__codelineno-0-144>144</a></span>
<span class=normal><a href=#__codelineno-0-145>145</a></span>
<span class=normal><a href=#__codelineno-0-146>146</a></span>
<span class=normal><a href=#__codelineno-0-147>147</a></span>
<span class=normal><a href=#__codelineno-0-148>148</a></span>
<span class=normal><a href=#__codelineno-0-149>149</a></span>
<span class=normal><a href=#__codelineno-0-150>150</a></span>
<span class=normal><a href=#__codelineno-0-151>151</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-75 name=__codelineno-0-75></a><span class=k>def</span> <span class=nf>process_aggregate_kwargs</span><span class=p>(</span><span class=n>kwargs</span><span class=p>:</span> <span class=n>Mapping</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>]:</span>
<a id=__codelineno-0-76 name=__codelineno-0-76></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-77 name=__codelineno-0-77></a><span class=sd> This function aggregates &quot;prefixed&quot; kwargs into dicts. &quot;Prefixed&quot; kwargs</span>
<a id=__codelineno-0-78 name=__codelineno-0-78></a><span class=sd> start with some prefix delimited with `:` (e.g. `attrs:`).</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a>
<a id=__codelineno-0-80 name=__codelineno-0-80></a><span class=sd> Example:</span>
<a id=__codelineno-0-81 name=__codelineno-0-81></a><span class=sd> ```py</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a><span class=sd> process_component_kwargs({&quot;abc:one&quot;: 1, &quot;abc:two&quot;: 2, &quot;def:three&quot;: 3, &quot;four&quot;: 4})</span>
<a id=__codelineno-0-83 name=__codelineno-0-83></a><span class=sd> # {&quot;abc&quot;: {&quot;one&quot;: 1, &quot;two&quot;: 2}, &quot;def&quot;: {&quot;three&quot;: 3}, &quot;four&quot;: 4}</span>
<a id=__codelineno-0-84 name=__codelineno-0-84></a><span class=sd> ```</span>
<a id=__codelineno-0-85 name=__codelineno-0-85></a>
<a id=__codelineno-0-86 name=__codelineno-0-86></a><span class=sd> ---</span>
<a id=__codelineno-0-87 name=__codelineno-0-87></a>
<a id=__codelineno-0-88 name=__codelineno-0-88></a><span class=sd> We want to support a use case similar to Vue&#39;s fallthrough attributes.</span>
<a id=__codelineno-0-89 name=__codelineno-0-89></a><span class=sd> In other words, where a component author can designate a prop (input)</span>
<a id=__codelineno-0-90 name=__codelineno-0-90></a><span class=sd> which is a dict and which will be rendered as HTML attributes.</span>
<a id=__codelineno-0-91 name=__codelineno-0-91></a>
<a id=__codelineno-0-92 name=__codelineno-0-92></a><span class=sd> This is useful for allowing component users to tweak styling or add</span>
<a id=__codelineno-0-93 name=__codelineno-0-93></a><span class=sd> event handling to the underlying HTML. E.g.:</span>
<a id=__codelineno-0-94 name=__codelineno-0-94></a>
<a id=__codelineno-0-95 name=__codelineno-0-95></a><span class=sd> `class=&quot;pa-4 d-flex text-black&quot;` or `@click.stop=&quot;alert(&#39;clicked!&#39;)&quot;`</span>
<a id=__codelineno-0-96 name=__codelineno-0-96></a>
<a id=__codelineno-0-97 name=__codelineno-0-97></a><span class=sd> So if the prop is `attrs`, and the component is called like so:</span>
<a id=__codelineno-0-98 name=__codelineno-0-98></a><span class=sd> ```django</span>
<a id=__codelineno-0-99 name=__codelineno-0-99></a><span class=sd> {% component &quot;my_comp&quot; attrs=attrs %}</span>
<a id=__codelineno-0-100 name=__codelineno-0-100></a><span class=sd> ```</span>
<a id=__codelineno-0-101 name=__codelineno-0-101></a>
<a id=__codelineno-0-102 name=__codelineno-0-102></a><span class=sd> then, if `attrs` is:</span>
<a id=__codelineno-0-103 name=__codelineno-0-103></a><span class=sd> ```py</span>
<a id=__codelineno-0-104 name=__codelineno-0-104></a><span class=sd> {&quot;class&quot;: &quot;text-red pa-4&quot;, &quot;@click&quot;: &quot;dispatch(&#39;my_event&#39;, 123)&quot;}</span>
<a id=__codelineno-0-105 name=__codelineno-0-105></a><span class=sd> ```</span>
<a id=__codelineno-0-106 name=__codelineno-0-106></a>
<a id=__codelineno-0-107 name=__codelineno-0-107></a><span class=sd> and the component template is:</span>
<a id=__codelineno-0-108 name=__codelineno-0-108></a><span class=sd> ```django</span>
<a id=__codelineno-0-109 name=__codelineno-0-109></a><span class=sd> &lt;div {% html_attrs attrs add:class=&quot;extra-class&quot; %}&gt;&lt;/div&gt;</span>
<a id=__codelineno-0-110 name=__codelineno-0-110></a><span class=sd> ```</span>
<a id=__codelineno-0-111 name=__codelineno-0-111></a>
<a id=__codelineno-0-112 name=__codelineno-0-112></a><span class=sd> Then this renders:</span>
<a id=__codelineno-0-113 name=__codelineno-0-113></a><span class=sd> ```html</span>
<a id=__codelineno-0-114 name=__codelineno-0-114></a><span class=sd> &lt;div class=&quot;text-red pa-4 extra-class&quot; @click=&quot;dispatch(&#39;my_event&#39;, 123)&quot; &gt;&lt;/div&gt;</span>
<a id=__codelineno-0-115 name=__codelineno-0-115></a><span class=sd> ```</span>
<a id=__codelineno-0-116 name=__codelineno-0-116></a>
<a id=__codelineno-0-117 name=__codelineno-0-117></a><span class=sd> However, this way it is difficult for the component user to define the `attrs`</span>
<a id=__codelineno-0-118 name=__codelineno-0-118></a><span class=sd> variable, especially if they want to combine static and dynamic values. Because</span>
<a id=__codelineno-0-119 name=__codelineno-0-119></a><span class=sd> they will need to pre-process the `attrs` dict.</span>
<a id=__codelineno-0-120 name=__codelineno-0-120></a>
<a id=__codelineno-0-121 name=__codelineno-0-121></a><span class=sd> So, instead, we allow to &quot;aggregate&quot; props into a dict. So all props that start</span>
<a id=__codelineno-0-122 name=__codelineno-0-122></a><span class=sd> with `attrs:`, like `attrs:class=&quot;text-red&quot;`, will be collected into a dict</span>
<a id=__codelineno-0-123 name=__codelineno-0-123></a><span class=sd> at key `attrs`.</span>
<a id=__codelineno-0-124 name=__codelineno-0-124></a>
<a id=__codelineno-0-125 name=__codelineno-0-125></a><span class=sd> This provides sufficient flexiblity to make it easy for component users to provide</span>
<a id=__codelineno-0-126 name=__codelineno-0-126></a><span class=sd> &quot;fallthrough attributes&quot;, and sufficiently easy for component authors to process</span>
<a id=__codelineno-0-127 name=__codelineno-0-127></a><span class=sd> that input while still being able to provide their own keys.</span>
<a id=__codelineno-0-128 name=__codelineno-0-128></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-129 name=__codelineno-0-129></a> <span class=n>processed_kwargs</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-130 name=__codelineno-0-130></a> <span class=n>nested_kwargs</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>]]</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-131 name=__codelineno-0-131></a> <span class=k>for</span> <span class=n>key</span><span class=p>,</span> <span class=n>val</span> <span class=ow>in</span> <span class=n>kwargs</span><span class=o>.</span><span class=n>items</span><span class=p>():</span>
<a id=__codelineno-0-132 name=__codelineno-0-132></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>is_aggregate_key</span><span class=p>(</span><span class=n>key</span><span class=p>):</span>
<a id=__codelineno-0-133 name=__codelineno-0-133></a> <span class=n>processed_kwargs</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>=</span> <span class=n>val</span>
<a id=__codelineno-0-134 name=__codelineno-0-134></a> <span class=k>continue</span>
<a id=__codelineno-0-135 name=__codelineno-0-135></a>
<a id=__codelineno-0-136 name=__codelineno-0-136></a> <span class=c1># NOTE: Trim off the prefix from keys</span>
<a id=__codelineno-0-137 name=__codelineno-0-137></a> <span class=n>prefix</span><span class=p>,</span> <span class=n>sub_key</span> <span class=o>=</span> <span class=n>key</span><span class=o>.</span><span class=n>split</span><span class=p>(</span><span class=s2>&quot;:&quot;</span><span class=p>,</span> <span class=mi>1</span><span class=p>)</span>
<a id=__codelineno-0-138 name=__codelineno-0-138></a> <span class=k>if</span> <span class=n>prefix</span> <span class=ow>not</span> <span class=ow>in</span> <span class=n>nested_kwargs</span><span class=p>:</span>
<a id=__codelineno-0-139 name=__codelineno-0-139></a> <span class=n>nested_kwargs</span><span class=p>[</span><span class=n>prefix</span><span class=p>]</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-140 name=__codelineno-0-140></a> <span class=n>nested_kwargs</span><span class=p>[</span><span class=n>prefix</span><span class=p>][</span><span class=n>sub_key</span><span class=p>]</span> <span class=o>=</span> <span class=n>val</span>
<a id=__codelineno-0-141 name=__codelineno-0-141></a>
<a id=__codelineno-0-142 name=__codelineno-0-142></a> <span class=c1># Assign aggregated values into normal input</span>
<a id=__codelineno-0-143 name=__codelineno-0-143></a> <span class=k>for</span> <span class=n>key</span><span class=p>,</span> <span class=n>val</span> <span class=ow>in</span> <span class=n>nested_kwargs</span><span class=o>.</span><span class=n>items</span><span class=p>():</span>
<a id=__codelineno-0-144 name=__codelineno-0-144></a> <span class=k>if</span> <span class=n>key</span> <span class=ow>in</span> <span class=n>processed_kwargs</span><span class=p>:</span>
<a id=__codelineno-0-145 name=__codelineno-0-145></a> <span class=k>raise</span> <span class=n>TemplateSyntaxError</span><span class=p>(</span>
<a id=__codelineno-0-146 name=__codelineno-0-146></a> <span class=sa>f</span><span class=s2>&quot;Received argument &#39;</span><span class=si>{</span><span class=n>key</span><span class=si>}</span><span class=s2>&#39; both as a regular input (</span><span class=si>{</span><span class=n>key</span><span class=si>}</span><span class=s2>=...)&quot;</span>
<a id=__codelineno-0-147 name=__codelineno-0-147></a> <span class=sa>f</span><span class=s2>&quot; and as an aggregate dict (&#39;</span><span class=si>{</span><span class=n>key</span><span class=si>}</span><span class=s2>:key=...&#39;). Must be only one of the two&quot;</span>
<a id=__codelineno-0-148 name=__codelineno-0-148></a> <span class=p>)</span>
<a id=__codelineno-0-149 name=__codelineno-0-149></a> <span class=n>processed_kwargs</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>=</span> <span class=n>val</span>
<a id=__codelineno-0-150 name=__codelineno-0-150></a>
<a id=__codelineno-0-151 name=__codelineno-0-151></a> <span class=k>return</span> <span class=n>processed_kwargs</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.library class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">library</span> <a href=#django_components.library class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p>Module for interfacing with Django's Library (<code>django.template.library</code>)</p> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h3 id=django_components.library.PROTECTED_TAGS class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">PROTECTED_TAGS</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small> </span> <a href=#django_components.library.PROTECTED_TAGS class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>PROTECTED_TAGS</span> <span class=o>=</span> <span class=p>[</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=s2>&quot;component_dependencies&quot;</span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=s2>&quot;component_css_dependencies&quot;</span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=s2>&quot;component_js_dependencies&quot;</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=s2>&quot;fill&quot;</span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=s2>&quot;html_attrs&quot;</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=s2>&quot;provide&quot;</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> <span class=s2>&quot;slot&quot;</span><span class=p>,</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>These are the names that users cannot choose for their components, as they would conflict with other tags in the Library.</p> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.logger class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">logger</span> <a href=#django_components.logger class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.logger.trace class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">trace</span> <a href=#django_components.logger.trace class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>trace</span><span class=p>(</span><span class=n>logger</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=logging.Logger href=https://docs.python.org/3.12/library/logging.html#logging.Logger>Logger</a></span><span class=p>,</span> <span class=n>message</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=o>*</span><span class=n>args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>TRACE level logger.</p> <p>To display TRACE logs, set the logging level to 5.</p> <p>Example: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>LOGGING</span> <span class=o>=</span> <span class=p>{</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=s2>&quot;version&quot;</span><span class=p>:</span> <span class=mi>1</span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=s2>&quot;disable_existing_loggers&quot;</span><span class=p>:</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=s2>&quot;handlers&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=s2>&quot;console&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=s2>&quot;class&quot;</span><span class=p>:</span> <span class=s2>&quot;logging.StreamHandler&quot;</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=s2>&quot;stream&quot;</span><span class=p>:</span> <span class=n>sys</span><span class=o>.</span><span class=n>stdout</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> <span class=p>},</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a> <span class=p>},</span>
<a id=__codelineno-0-10 name=__codelineno-0-10 href=#__codelineno-0-10></a> <span class=s2>&quot;loggers&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-11 name=__codelineno-0-11 href=#__codelineno-0-11></a> <span class=s2>&quot;django_components&quot;</span><span class=p>:</span> <span class=p>{</span>
<a id=__codelineno-0-12 name=__codelineno-0-12 href=#__codelineno-0-12></a> <span class=s2>&quot;level&quot;</span><span class=p>:</span> <span class=mi>5</span><span class=p>,</span>
<a id=__codelineno-0-13 name=__codelineno-0-13 href=#__codelineno-0-13></a> <span class=s2>&quot;handlers&quot;</span><span class=p>:</span> <span class=p>[</span><span class=s2>&quot;console&quot;</span><span class=p>],</span>
<a id=__codelineno-0-14 name=__codelineno-0-14 href=#__codelineno-0-14></a> <span class=p>},</span>
<a id=__codelineno-0-15 name=__codelineno-0-15 href=#__codelineno-0-15></a> <span class=p>},</span>
<a id=__codelineno-0-16 name=__codelineno-0-16 href=#__codelineno-0-16></a><span class=p>}</span>
</code></pre></div></p> <details class=quote> <summary>Source code in <code>src/django_components/logger.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-32>32</a></span>
<span class=normal><a href=#__codelineno-0-33>33</a></span>
<span class=normal><a href=#__codelineno-0-34>34</a></span>
<span class=normal><a href=#__codelineno-0-35>35</a></span>
<span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span>
<span class=normal><a href=#__codelineno-0-41>41</a></span>
<span class=normal><a href=#__codelineno-0-42>42</a></span>
<span class=normal><a href=#__codelineno-0-43>43</a></span>
<span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span>
<span class=normal><a href=#__codelineno-0-46>46</a></span>
<span class=normal><a href=#__codelineno-0-47>47</a></span>
<span class=normal><a href=#__codelineno-0-48>48</a></span>
<span class=normal><a href=#__codelineno-0-49>49</a></span>
<span class=normal><a href=#__codelineno-0-50>50</a></span>
<span class=normal><a href=#__codelineno-0-51>51</a></span>
<span class=normal><a href=#__codelineno-0-52>52</a></span>
<span class=normal><a href=#__codelineno-0-53>53</a></span>
<span class=normal><a href=#__codelineno-0-54>54</a></span>
<span class=normal><a href=#__codelineno-0-55>55</a></span>
<span class=normal><a href=#__codelineno-0-56>56</a></span>
<span class=normal><a href=#__codelineno-0-57>57</a></span>
<span class=normal><a href=#__codelineno-0-58>58</a></span>
<span class=normal><a href=#__codelineno-0-59>59</a></span>
<span class=normal><a href=#__codelineno-0-60>60</a></span>
<span class=normal><a href=#__codelineno-0-61>61</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-32 name=__codelineno-0-32></a><span class=k>def</span> <span class=nf>trace</span><span class=p>(</span><span class=n>logger</span><span class=p>:</span> <span class=n>logging</span><span class=o>.</span><span class=n>Logger</span><span class=p>,</span> <span class=n>message</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span> <span class=o>*</span><span class=n>args</span><span class=p>:</span> <span class=n>Any</span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>:</span> <span class=n>Any</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-33 name=__codelineno-0-33></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-34 name=__codelineno-0-34></a><span class=sd> TRACE level logger.</span>
<a id=__codelineno-0-35 name=__codelineno-0-35></a>
<a id=__codelineno-0-36 name=__codelineno-0-36></a><span class=sd> To display TRACE logs, set the logging level to 5.</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a>
<a id=__codelineno-0-38 name=__codelineno-0-38></a><span class=sd> Example:</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a><span class=sd> ```py</span>
<a id=__codelineno-0-40 name=__codelineno-0-40></a><span class=sd> LOGGING = {</span>
<a id=__codelineno-0-41 name=__codelineno-0-41></a><span class=sd> &quot;version&quot;: 1,</span>
<a id=__codelineno-0-42 name=__codelineno-0-42></a><span class=sd> &quot;disable_existing_loggers&quot;: False,</span>
<a id=__codelineno-0-43 name=__codelineno-0-43></a><span class=sd> &quot;handlers&quot;: {</span>
<a id=__codelineno-0-44 name=__codelineno-0-44></a><span class=sd> &quot;console&quot;: {</span>
<a id=__codelineno-0-45 name=__codelineno-0-45></a><span class=sd> &quot;class&quot;: &quot;logging.StreamHandler&quot;,</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a><span class=sd> &quot;stream&quot;: sys.stdout,</span>
<a id=__codelineno-0-47 name=__codelineno-0-47></a><span class=sd> },</span>
<a id=__codelineno-0-48 name=__codelineno-0-48></a><span class=sd> },</span>
<a id=__codelineno-0-49 name=__codelineno-0-49></a><span class=sd> &quot;loggers&quot;: {</span>
<a id=__codelineno-0-50 name=__codelineno-0-50></a><span class=sd> &quot;django_components&quot;: {</span>
<a id=__codelineno-0-51 name=__codelineno-0-51></a><span class=sd> &quot;level&quot;: 5,</span>
<a id=__codelineno-0-52 name=__codelineno-0-52></a><span class=sd> &quot;handlers&quot;: [&quot;console&quot;],</span>
<a id=__codelineno-0-53 name=__codelineno-0-53></a><span class=sd> },</span>
<a id=__codelineno-0-54 name=__codelineno-0-54></a><span class=sd> },</span>
<a id=__codelineno-0-55 name=__codelineno-0-55></a><span class=sd> }</span>
<a id=__codelineno-0-56 name=__codelineno-0-56></a><span class=sd> ```</span>
<a id=__codelineno-0-57 name=__codelineno-0-57></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-58 name=__codelineno-0-58></a> <span class=k>if</span> <span class=n>actual_trace_level_num</span> <span class=o>==</span> <span class=o>-</span><span class=mi>1</span><span class=p>:</span>
<a id=__codelineno-0-59 name=__codelineno-0-59></a> <span class=n>setup_logging</span><span class=p>()</span>
<a id=__codelineno-0-60 name=__codelineno-0-60></a> <span class=k>if</span> <span class=n>logger</span><span class=o>.</span><span class=n>isEnabledFor</span><span class=p>(</span><span class=n>actual_trace_level_num</span><span class=p>):</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a> <span class=n>logger</span><span class=o>.</span><span class=n>log</span><span class=p>(</span><span class=n>actual_trace_level_num</span><span class=p>,</span> <span class=n>message</span><span class=p>,</span> <span class=o>*</span><span class=n>args</span><span class=p>,</span> <span class=o>**</span><span class=n>kwargs</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.logger.trace_msg class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">trace_msg</span> <a href=#django_components.logger.trace_msg class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>trace_msg</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>action</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Literal href=https://docs.python.org/3.12/library/typing.html#typing.Literal>Literal</a></span><span class=p>[</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;ASSOC&quot;</span><span class=p>,</span> <span class=s2>&quot;RENDR&quot;</span><span class=p>,</span> <span class=s2>&quot;GET&quot;</span><span class=p>,</span> <span class=s2>&quot;SET&quot;</span><span class=p>],</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>node_type</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Literal href=https://docs.python.org/3.12/library/typing.html#typing.Literal>Literal</a></span><span class=p>[</span><span class=s2>&quot;COMP&quot;</span><span class=p>,</span> <span class=s2>&quot;FILL&quot;</span><span class=p>,</span> <span class=s2>&quot;SLOT&quot;</span><span class=p>,</span> <span class=s2>&quot;PROVIDE&quot;</span><span class=p>,</span> <span class=s2>&quot;N/A&quot;</span><span class=p>],</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>node_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>node_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>msg</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span> <span class=o>=</span> <span class=s2>&quot;&quot;</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=n>component_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>TRACE level logger with opinionated format for tracing interaction of components, nodes, and slots. Formats messages like so:</p> <p><code>"ASSOC SLOT test_slot ID 0088 TO COMP 0087"</code></p> <details class=quote> <summary>Source code in <code>src/django_components/logger.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-64>64</a></span>
<span class=normal><a href=#__codelineno-0-65>65</a></span>
<span class=normal><a href=#__codelineno-0-66>66</a></span>
<span class=normal><a href=#__codelineno-0-67>67</a></span>
<span class=normal><a href=#__codelineno-0-68>68</a></span>
<span class=normal><a href=#__codelineno-0-69>69</a></span>
<span class=normal><a href=#__codelineno-0-70>70</a></span>
<span class=normal><a href=#__codelineno-0-71>71</a></span>
<span class=normal><a href=#__codelineno-0-72>72</a></span>
<span class=normal><a href=#__codelineno-0-73>73</a></span>
<span class=normal><a href=#__codelineno-0-74>74</a></span>
<span class=normal><a href=#__codelineno-0-75>75</a></span>
<span class=normal><a href=#__codelineno-0-76>76</a></span>
<span class=normal><a href=#__codelineno-0-77>77</a></span>
<span class=normal><a href=#__codelineno-0-78>78</a></span>
<span class=normal><a href=#__codelineno-0-79>79</a></span>
<span class=normal><a href=#__codelineno-0-80>80</a></span>
<span class=normal><a href=#__codelineno-0-81>81</a></span>
<span class=normal><a href=#__codelineno-0-82>82</a></span>
<span class=normal><a href=#__codelineno-0-83>83</a></span>
<span class=normal><a href=#__codelineno-0-84>84</a></span>
<span class=normal><a href=#__codelineno-0-85>85</a></span>
<span class=normal><a href=#__codelineno-0-86>86</a></span>
<span class=normal><a href=#__codelineno-0-87>87</a></span>
<span class=normal><a href=#__codelineno-0-88>88</a></span>
<span class=normal><a href=#__codelineno-0-89>89</a></span>
<span class=normal><a href=#__codelineno-0-90>90</a></span>
<span class=normal><a href=#__codelineno-0-91>91</a></span>
<span class=normal><a href=#__codelineno-0-92>92</a></span>
<span class=normal><a href=#__codelineno-0-93>93</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-64 name=__codelineno-0-64></a><span class=k>def</span> <span class=nf>trace_msg</span><span class=p>(</span>
<a id=__codelineno-0-65 name=__codelineno-0-65></a> <span class=n>action</span><span class=p>:</span> <span class=n>Literal</span><span class=p>[</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;ASSOC&quot;</span><span class=p>,</span> <span class=s2>&quot;RENDR&quot;</span><span class=p>,</span> <span class=s2>&quot;GET&quot;</span><span class=p>,</span> <span class=s2>&quot;SET&quot;</span><span class=p>],</span>
<a id=__codelineno-0-66 name=__codelineno-0-66></a> <span class=n>node_type</span><span class=p>:</span> <span class=n>Literal</span><span class=p>[</span><span class=s2>&quot;COMP&quot;</span><span class=p>,</span> <span class=s2>&quot;FILL&quot;</span><span class=p>,</span> <span class=s2>&quot;SLOT&quot;</span><span class=p>,</span> <span class=s2>&quot;PROVIDE&quot;</span><span class=p>,</span> <span class=s2>&quot;N/A&quot;</span><span class=p>],</span>
<a id=__codelineno-0-67 name=__codelineno-0-67></a> <span class=n>node_name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-68 name=__codelineno-0-68></a> <span class=n>node_id</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-69 name=__codelineno-0-69></a> <span class=n>msg</span><span class=p>:</span> <span class=nb>str</span> <span class=o>=</span> <span class=s2>&quot;&quot;</span><span class=p>,</span>
<a id=__codelineno-0-70 name=__codelineno-0-70></a> <span class=n>component_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-71 name=__codelineno-0-71></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-72 name=__codelineno-0-72></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-73 name=__codelineno-0-73></a><span class=sd> TRACE level logger with opinionated format for tracing interaction of components,</span>
<a id=__codelineno-0-74 name=__codelineno-0-74></a><span class=sd> nodes, and slots. Formats messages like so:</span>
<a id=__codelineno-0-75 name=__codelineno-0-75></a>
<a id=__codelineno-0-76 name=__codelineno-0-76></a><span class=sd> `&quot;ASSOC SLOT test_slot ID 0088 TO COMP 0087&quot;`</span>
<a id=__codelineno-0-77 name=__codelineno-0-77></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-78 name=__codelineno-0-78></a> <span class=n>msg_prefix</span> <span class=o>=</span> <span class=s2>&quot;&quot;</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a> <span class=k>if</span> <span class=n>action</span> <span class=o>==</span> <span class=s2>&quot;ASSOC&quot;</span><span class=p>:</span>
<a id=__codelineno-0-80 name=__codelineno-0-80></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>component_id</span><span class=p>:</span>
<a id=__codelineno-0-81 name=__codelineno-0-81></a> <span class=k>raise</span> <span class=ne>ValueError</span><span class=p>(</span><span class=s2>&quot;component_id must be set for the ASSOC action&quot;</span><span class=p>)</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a> <span class=n>msg_prefix</span> <span class=o>=</span> <span class=sa>f</span><span class=s2>&quot;TO COMP </span><span class=si>{</span><span class=n>component_id</span><span class=si>}</span><span class=s2>&quot;</span>
<a id=__codelineno-0-83 name=__codelineno-0-83></a> <span class=k>elif</span> <span class=n>action</span> <span class=o>==</span> <span class=s2>&quot;RENDR&quot;</span> <span class=ow>and</span> <span class=n>node_type</span> <span class=o>==</span> <span class=s2>&quot;FILL&quot;</span><span class=p>:</span>
<a id=__codelineno-0-84 name=__codelineno-0-84></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>component_id</span><span class=p>:</span>
<a id=__codelineno-0-85 name=__codelineno-0-85></a> <span class=k>raise</span> <span class=ne>ValueError</span><span class=p>(</span><span class=s2>&quot;component_id must be set for the RENDER action&quot;</span><span class=p>)</span>
<a id=__codelineno-0-86 name=__codelineno-0-86></a> <span class=n>msg_prefix</span> <span class=o>=</span> <span class=sa>f</span><span class=s2>&quot;FOR COMP </span><span class=si>{</span><span class=n>component_id</span><span class=si>}</span><span class=s2>&quot;</span>
<a id=__codelineno-0-87 name=__codelineno-0-87></a>
<a id=__codelineno-0-88 name=__codelineno-0-88></a> <span class=n>msg_parts</span> <span class=o>=</span> <span class=p>[</span><span class=sa>f</span><span class=s2>&quot;</span><span class=si>{</span><span class=n>action</span><span class=si>}</span><span class=s2> </span><span class=si>{</span><span class=n>node_type</span><span class=si>}</span><span class=s2> </span><span class=si>{</span><span class=n>node_name</span><span class=si>}</span><span class=s2> ID </span><span class=si>{</span><span class=n>node_id</span><span class=si>}</span><span class=s2>&quot;</span><span class=p>,</span> <span class=o>*</span><span class=p>([</span><span class=n>msg_prefix</span><span class=p>]</span> <span class=k>if</span> <span class=n>msg_prefix</span> <span class=k>else</span> <span class=p>[]),</span> <span class=n>msg</span><span class=p>]</span>
<a id=__codelineno-0-89 name=__codelineno-0-89></a> <span class=n>full_msg</span> <span class=o>=</span> <span class=s2>&quot; &quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>msg_parts</span><span class=p>)</span>
<a id=__codelineno-0-90 name=__codelineno-0-90></a>
<a id=__codelineno-0-91 name=__codelineno-0-91></a> <span class=c1># NOTE: When debugging tests during development, it may be easier to change</span>
<a id=__codelineno-0-92 name=__codelineno-0-92></a> <span class=c1># this to `print()`</span>
<a id=__codelineno-0-93 name=__codelineno-0-93></a> <span class=n>trace</span><span class=p>(</span><span class=n>logger</span><span class=p>,</span> <span class=n>full_msg</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.management class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">management</span> <a href=#django_components.management class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-module"> <h3 id=django_components.management.commands class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">commands</span> <a href=#django_components.management.commands class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-module"> <h4 id=django_components.management.commands.upgradecomponent class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">upgradecomponent</span> <a href=#django_components.management.commands.upgradecomponent class=headerlink title="Permanent link">¤</a></h4> <div class="doc doc-contents "> <div class="doc doc-children"> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.middleware class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">middleware</span> <a href=#django_components.middleware class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.middleware.ComponentDependencyMiddleware class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ComponentDependencyMiddleware</span> <a href=#django_components.middleware.ComponentDependencyMiddleware class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>ComponentDependencyMiddleware</span><span class=p>(</span><span class=n>get_response</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=collections.abc.Callable href=https://docs.python.org/3.12/library/collections.abc.html#collections.abc.Callable>Callable</a></span><span class=p>[[</span><span class=n><a class="autorefs autorefs-external" title=django.http.HttpRequest href=https://docs.djangoproject.com/en/5.0/ref/request-response/#django.http.HttpRequest>HttpRequest</a></span><span class=p>],</span> <span class=n><a class="autorefs autorefs-external" title=django.http.HttpResponse href=https://docs.djangoproject.com/en/5.0/ref/request-response/#django.http.HttpResponse>HttpResponse</a></span><span class=p>])</span>
</code></pre></div> <div class="doc doc-contents "> <p>Middleware that inserts CSS/JS dependencies for all rendered components at points marked with template tags.</p> <details class=quote> <summary>Source code in <code>src/django_components/middleware.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-36 name=__codelineno-0-36></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>get_response</span><span class=p>:</span> <span class=s2>&quot;Callable[[HttpRequest], HttpResponse]&quot;</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a> <span class=bp>self</span><span class=o>.</span><span class=n>get_response</span> <span class=o>=</span> <span class=n>get_response</span>
<a id=__codelineno-0-38 name=__codelineno-0-38></a>
<a id=__codelineno-0-39 name=__codelineno-0-39></a> <span class=k>if</span> <span class=n>iscoroutinefunction</span><span class=p>(</span><span class=bp>self</span><span class=o>.</span><span class=n>get_response</span><span class=p>):</span>
<a id=__codelineno-0-40 name=__codelineno-0-40></a> <span class=n>markcoroutinefunction</span><span class=p>(</span><span class=bp>self</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.middleware.DependencyReplacer class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">DependencyReplacer</span> <a href=#django_components.middleware.DependencyReplacer class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>DependencyReplacer</span><span class=p>(</span><span class=n>css_string</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#bytes>bytes</a></span><span class=p>,</span> <span class=n>js_string</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#bytes>bytes</a></span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p>Replacer for use in re.sub that replaces the first placeholder CSS and JS tags it encounters and removes any subsequent ones.</p> <details class=quote> <summary>Source code in <code>src/django_components/middleware.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-88>88</a></span>
<span class=normal><a href=#__codelineno-0-89>89</a></span>
<span class=normal><a href=#__codelineno-0-90>90</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-88 name=__codelineno-0-88></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>css_string</span><span class=p>:</span> <span class=nb>bytes</span><span class=p>,</span> <span class=n>js_string</span><span class=p>:</span> <span class=nb>bytes</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-89 name=__codelineno-0-89></a> <span class=bp>self</span><span class=o>.</span><span class=n>js_string</span> <span class=o>=</span> <span class=n>js_string</span>
<a id=__codelineno-0-90 name=__codelineno-0-90></a> <span class=bp>self</span><span class=o>.</span><span class=n>css_string</span> <span class=o>=</span> <span class=n>css_string</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.middleware.join_media class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">join_media</span> <a href=#django_components.middleware.join_media class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>join_media</span><span class=p>(</span><span class=n>components</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Iterable href=https://docs.python.org/3.12/library/typing.html#typing.Iterable>Iterable</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.component.Component href=component/#django_components.component.Component>Component</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n><span title=django.forms.Media>Media</span></span>
</code></pre></div> <div class="doc doc-contents "> <p>Return combined media object for iterable of components.</p> <details class=quote> <summary>Source code in <code>src/django_components/middleware.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-102>102</a></span>
<span class=normal><a href=#__codelineno-0-103>103</a></span>
<span class=normal><a href=#__codelineno-0-104>104</a></span>
<span class=normal><a href=#__codelineno-0-105>105</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-102 name=__codelineno-0-102></a><span class=k>def</span> <span class=nf>join_media</span><span class=p>(</span><span class=n>components</span><span class=p>:</span> <span class=n>Iterable</span><span class=p>[</span><span class=s2>&quot;Component&quot;</span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n>Media</span><span class=p>:</span>
<a id=__codelineno-0-103 name=__codelineno-0-103></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Return combined media object for iterable of components.&quot;&quot;&quot;</span>
<a id=__codelineno-0-104 name=__codelineno-0-104></a>
<a id=__codelineno-0-105 name=__codelineno-0-105></a> <span class=k>return</span> <span class=nb>sum</span><span class=p>([</span><span class=n>component</span><span class=o>.</span><span class=n>media</span> <span class=k>for</span> <span class=n>component</span> <span class=ow>in</span> <span class=n>components</span><span class=p>],</span> <span class=n>Media</span><span class=p>())</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.node class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">node</span> <a href=#django_components.node class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.node.BaseNode class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">BaseNode</span> <a href=#django_components.node.BaseNode class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>BaseNode</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>nodelist</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django.template.base.NodeList>NodeList</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>node_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>args</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><span title=django_components.expression.Expression>Expression</span></span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.expression.RuntimeKwargs>RuntimeKwargs</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><span title=django.template.base.Node>Node</span></code></p> <p>Shared behavior for our subclasses of Django's <code>Node</code></p> <details class=quote> <summary>Source code in <code>src/django_components/node.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-15>15</a></span>
<span class=normal><a href=#__codelineno-0-16>16</a></span>
<span class=normal><a href=#__codelineno-0-17>17</a></span>
<span class=normal><a href=#__codelineno-0-18>18</a></span>
<span class=normal><a href=#__codelineno-0-19>19</a></span>
<span class=normal><a href=#__codelineno-0-20>20</a></span>
<span class=normal><a href=#__codelineno-0-21>21</a></span>
<span class=normal><a href=#__codelineno-0-22>22</a></span>
<span class=normal><a href=#__codelineno-0-23>23</a></span>
<span class=normal><a href=#__codelineno-0-24>24</a></span>
<span class=normal><a href=#__codelineno-0-25>25</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-15 name=__codelineno-0-15></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span>
<a id=__codelineno-0-16 name=__codelineno-0-16></a> <span class=bp>self</span><span class=p>,</span>
<a id=__codelineno-0-17 name=__codelineno-0-17></a> <span class=n>nodelist</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>NodeList</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-18 name=__codelineno-0-18></a> <span class=n>node_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-19 name=__codelineno-0-19></a> <span class=n>args</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>List</span><span class=p>[</span><span class=n>Expression</span><span class=p>]]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-20 name=__codelineno-0-20></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>RuntimeKwargs</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-21 name=__codelineno-0-21></a><span class=p>):</span>
<a id=__codelineno-0-22 name=__codelineno-0-22></a> <span class=bp>self</span><span class=o>.</span><span class=n>nodelist</span> <span class=o>=</span> <span class=n>nodelist</span> <span class=ow>or</span> <span class=n>NodeList</span><span class=p>()</span>
<a id=__codelineno-0-23 name=__codelineno-0-23></a> <span class=bp>self</span><span class=o>.</span><span class=n>node_id</span> <span class=o>=</span> <span class=n>node_id</span> <span class=ow>or</span> <span class=n>gen_id</span><span class=p>()</span>
<a id=__codelineno-0-24 name=__codelineno-0-24></a> <span class=bp>self</span><span class=o>.</span><span class=n>args</span> <span class=o>=</span> <span class=n>args</span> <span class=ow>or</span> <span class=p>[]</span>
<a id=__codelineno-0-25 name=__codelineno-0-25></a> <span class=bp>self</span><span class=o>.</span><span class=n>kwargs</span> <span class=o>=</span> <span class=n>kwargs</span> <span class=ow>or</span> <span class=n>RuntimeKwargs</span><span class=p>({})</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.node.get_node_children class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_node_children</span> <a href=#django_components.node.get_node_children class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>get_node_children</span><span class=p>(</span><span class=n>node</span><span class=p>:</span> <span class=n><span title=django.template.base.Node>Node</span></span><span class=p>,</span> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><span title=django.template.base.NodeList>NodeList</span></span>
</code></pre></div> <div class="doc doc-contents "> <p>Get child Nodes from Node's nodelist atribute.</p> <p>This function is taken from <code>get_nodes_by_type</code> method of <code>django.template.base.Node</code>.</p> <details class=quote> <summary>Source code in <code>src/django_components/node.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-59>59</a></span>
<span class=normal><a href=#__codelineno-0-60>60</a></span>
<span class=normal><a href=#__codelineno-0-61>61</a></span>
<span class=normal><a href=#__codelineno-0-62>62</a></span>
<span class=normal><a href=#__codelineno-0-63>63</a></span>
<span class=normal><a href=#__codelineno-0-64>64</a></span>
<span class=normal><a href=#__codelineno-0-65>65</a></span>
<span class=normal><a href=#__codelineno-0-66>66</a></span>
<span class=normal><a href=#__codelineno-0-67>67</a></span>
<span class=normal><a href=#__codelineno-0-68>68</a></span>
<span class=normal><a href=#__codelineno-0-69>69</a></span>
<span class=normal><a href=#__codelineno-0-70>70</a></span>
<span class=normal><a href=#__codelineno-0-71>71</a></span>
<span class=normal><a href=#__codelineno-0-72>72</a></span>
<span class=normal><a href=#__codelineno-0-73>73</a></span>
<span class=normal><a href=#__codelineno-0-74>74</a></span>
<span class=normal><a href=#__codelineno-0-75>75</a></span>
<span class=normal><a href=#__codelineno-0-76>76</a></span>
<span class=normal><a href=#__codelineno-0-77>77</a></span>
<span class=normal><a href=#__codelineno-0-78>78</a></span>
<span class=normal><a href=#__codelineno-0-79>79</a></span>
<span class=normal><a href=#__codelineno-0-80>80</a></span>
<span class=normal><a href=#__codelineno-0-81>81</a></span>
<span class=normal><a href=#__codelineno-0-82>82</a></span>
<span class=normal><a href=#__codelineno-0-83>83</a></span>
<span class=normal><a href=#__codelineno-0-84>84</a></span>
<span class=normal><a href=#__codelineno-0-85>85</a></span>
<span class=normal><a href=#__codelineno-0-86>86</a></span>
<span class=normal><a href=#__codelineno-0-87>87</a></span>
<span class=normal><a href=#__codelineno-0-88>88</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-59 name=__codelineno-0-59></a><span class=k>def</span> <span class=nf>get_node_children</span><span class=p>(</span><span class=n>node</span><span class=p>:</span> <span class=n>Node</span><span class=p>,</span> <span class=n>context</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Context</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>NodeList</span><span class=p>:</span>
<a id=__codelineno-0-60 name=__codelineno-0-60></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a><span class=sd> Get child Nodes from Node&#39;s nodelist atribute.</span>
<a id=__codelineno-0-62 name=__codelineno-0-62></a>
<a id=__codelineno-0-63 name=__codelineno-0-63></a><span class=sd> This function is taken from `get_nodes_by_type` method of `django.template.base.Node`.</span>
<a id=__codelineno-0-64 name=__codelineno-0-64></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-65 name=__codelineno-0-65></a> <span class=c1># Special case - {% extends %} tag - Load the template and go deeper</span>
<a id=__codelineno-0-66 name=__codelineno-0-66></a> <span class=k>if</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>node</span><span class=p>,</span> <span class=n>ExtendsNode</span><span class=p>):</span>
<a id=__codelineno-0-67 name=__codelineno-0-67></a> <span class=c1># NOTE: When {% extends %} node is being parsed, it collects all remaining template</span>
<a id=__codelineno-0-68 name=__codelineno-0-68></a> <span class=c1># under node.nodelist.</span>
<a id=__codelineno-0-69 name=__codelineno-0-69></a> <span class=c1># Hence, when we come across ExtendsNode in the template, we:</span>
<a id=__codelineno-0-70 name=__codelineno-0-70></a> <span class=c1># 1. Go over all nodes in the template using `node.nodelist`</span>
<a id=__codelineno-0-71 name=__codelineno-0-71></a> <span class=c1># 2. Go over all nodes in the &quot;parent&quot; template, via `node.get_parent`</span>
<a id=__codelineno-0-72 name=__codelineno-0-72></a> <span class=n>nodes</span> <span class=o>=</span> <span class=n>NodeList</span><span class=p>()</span>
<a id=__codelineno-0-73 name=__codelineno-0-73></a> <span class=n>nodes</span><span class=o>.</span><span class=n>extend</span><span class=p>(</span><span class=n>node</span><span class=o>.</span><span class=n>nodelist</span><span class=p>)</span>
<a id=__codelineno-0-74 name=__codelineno-0-74></a> <span class=n>template</span> <span class=o>=</span> <span class=n>node</span><span class=o>.</span><span class=n>get_parent</span><span class=p>(</span><span class=n>context</span><span class=p>)</span>
<a id=__codelineno-0-75 name=__codelineno-0-75></a> <span class=n>nodes</span><span class=o>.</span><span class=n>extend</span><span class=p>(</span><span class=n>template</span><span class=o>.</span><span class=n>nodelist</span><span class=p>)</span>
<a id=__codelineno-0-76 name=__codelineno-0-76></a> <span class=k>return</span> <span class=n>nodes</span>
<a id=__codelineno-0-77 name=__codelineno-0-77></a>
<a id=__codelineno-0-78 name=__codelineno-0-78></a> <span class=c1># Special case - {% include %} tag - Load the template and go deeper</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a> <span class=k>elif</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>node</span><span class=p>,</span> <span class=n>IncludeNode</span><span class=p>):</span>
<a id=__codelineno-0-80 name=__codelineno-0-80></a> <span class=n>template</span> <span class=o>=</span> <span class=n>get_template_for_include_node</span><span class=p>(</span><span class=n>node</span><span class=p>,</span> <span class=n>context</span><span class=p>)</span>
<a id=__codelineno-0-81 name=__codelineno-0-81></a> <span class=k>return</span> <span class=n>template</span><span class=o>.</span><span class=n>nodelist</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a>
<a id=__codelineno-0-83 name=__codelineno-0-83></a> <span class=n>nodes</span> <span class=o>=</span> <span class=n>NodeList</span><span class=p>()</span>
<a id=__codelineno-0-84 name=__codelineno-0-84></a> <span class=k>for</span> <span class=n>attr</span> <span class=ow>in</span> <span class=n>node</span><span class=o>.</span><span class=n>child_nodelists</span><span class=p>:</span>
<a id=__codelineno-0-85 name=__codelineno-0-85></a> <span class=n>nodelist</span> <span class=o>=</span> <span class=nb>getattr</span><span class=p>(</span><span class=n>node</span><span class=p>,</span> <span class=n>attr</span><span class=p>,</span> <span class=p>[])</span>
<a id=__codelineno-0-86 name=__codelineno-0-86></a> <span class=k>if</span> <span class=n>nodelist</span><span class=p>:</span>
<a id=__codelineno-0-87 name=__codelineno-0-87></a> <span class=n>nodes</span><span class=o>.</span><span class=n>extend</span><span class=p>(</span><span class=n>nodelist</span><span class=p>)</span>
<a id=__codelineno-0-88 name=__codelineno-0-88></a> <span class=k>return</span> <span class=n>nodes</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.node.get_template_for_include_node class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_template_for_include_node</span> <a href=#django_components.node.get_template_for_include_node class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>get_template_for_include_node</span><span class=p>(</span><span class=n>include_node</span><span class=p>:</span> <span class=n><span title=django.template.loader_tags.IncludeNode>IncludeNode</span></span><span class=p>,</span> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Template href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Template>Template</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>This snippet is taken directly from <code>IncludeNode.render()</code>. Unfortunately the render logic doesn't separate out template loading logic from rendering, so we have to copy the method.</p> <details class=quote> <summary>Source code in <code>src/django_components/node.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-91> 91</a></span>
<span class=normal><a href=#__codelineno-0-92> 92</a></span>
<span class=normal><a href=#__codelineno-0-93> 93</a></span>
<span class=normal><a href=#__codelineno-0-94> 94</a></span>
<span class=normal><a href=#__codelineno-0-95> 95</a></span>
<span class=normal><a href=#__codelineno-0-96> 96</a></span>
<span class=normal><a href=#__codelineno-0-97> 97</a></span>
<span class=normal><a href=#__codelineno-0-98> 98</a></span>
<span class=normal><a href=#__codelineno-0-99> 99</a></span>
<span class=normal><a href=#__codelineno-0-100>100</a></span>
<span class=normal><a href=#__codelineno-0-101>101</a></span>
<span class=normal><a href=#__codelineno-0-102>102</a></span>
<span class=normal><a href=#__codelineno-0-103>103</a></span>
<span class=normal><a href=#__codelineno-0-104>104</a></span>
<span class=normal><a href=#__codelineno-0-105>105</a></span>
<span class=normal><a href=#__codelineno-0-106>106</a></span>
<span class=normal><a href=#__codelineno-0-107>107</a></span>
<span class=normal><a href=#__codelineno-0-108>108</a></span>
<span class=normal><a href=#__codelineno-0-109>109</a></span>
<span class=normal><a href=#__codelineno-0-110>110</a></span>
<span class=normal><a href=#__codelineno-0-111>111</a></span>
<span class=normal><a href=#__codelineno-0-112>112</a></span>
<span class=normal><a href=#__codelineno-0-113>113</a></span>
<span class=normal><a href=#__codelineno-0-114>114</a></span>
<span class=normal><a href=#__codelineno-0-115>115</a></span>
<span class=normal><a href=#__codelineno-0-116>116</a></span>
<span class=normal><a href=#__codelineno-0-117>117</a></span>
<span class=normal><a href=#__codelineno-0-118>118</a></span>
<span class=normal><a href=#__codelineno-0-119>119</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-91 name=__codelineno-0-91></a><span class=k>def</span> <span class=nf>get_template_for_include_node</span><span class=p>(</span><span class=n>include_node</span><span class=p>:</span> <span class=n>IncludeNode</span><span class=p>,</span> <span class=n>context</span><span class=p>:</span> <span class=n>Context</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Template</span><span class=p>:</span>
<a id=__codelineno-0-92 name=__codelineno-0-92></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-93 name=__codelineno-0-93></a><span class=sd> This snippet is taken directly from `IncludeNode.render()`. Unfortunately the</span>
<a id=__codelineno-0-94 name=__codelineno-0-94></a><span class=sd> render logic doesn&#39;t separate out template loading logic from rendering, so we</span>
<a id=__codelineno-0-95 name=__codelineno-0-95></a><span class=sd> have to copy the method.</span>
<a id=__codelineno-0-96 name=__codelineno-0-96></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-97 name=__codelineno-0-97></a> <span class=n>template</span> <span class=o>=</span> <span class=n>include_node</span><span class=o>.</span><span class=n>template</span><span class=o>.</span><span class=n>resolve</span><span class=p>(</span><span class=n>context</span><span class=p>)</span>
<a id=__codelineno-0-98 name=__codelineno-0-98></a> <span class=c1># Does this quack like a Template?</span>
<a id=__codelineno-0-99 name=__codelineno-0-99></a> <span class=k>if</span> <span class=ow>not</span> <span class=nb>callable</span><span class=p>(</span><span class=nb>getattr</span><span class=p>(</span><span class=n>template</span><span class=p>,</span> <span class=s2>&quot;render&quot;</span><span class=p>,</span> <span class=kc>None</span><span class=p>)):</span>
<a id=__codelineno-0-100 name=__codelineno-0-100></a> <span class=c1># If not, try the cache and select_template().</span>
<a id=__codelineno-0-101 name=__codelineno-0-101></a> <span class=n>template_name</span> <span class=o>=</span> <span class=n>template</span> <span class=ow>or</span> <span class=p>()</span>
<a id=__codelineno-0-102 name=__codelineno-0-102></a> <span class=k>if</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>template_name</span><span class=p>,</span> <span class=nb>str</span><span class=p>):</span>
<a id=__codelineno-0-103 name=__codelineno-0-103></a> <span class=n>template_name</span> <span class=o>=</span> <span class=p>(</span>
<a id=__codelineno-0-104 name=__codelineno-0-104></a> <span class=n>construct_relative_path</span><span class=p>(</span>
<a id=__codelineno-0-105 name=__codelineno-0-105></a> <span class=n>include_node</span><span class=o>.</span><span class=n>origin</span><span class=o>.</span><span class=n>template_name</span><span class=p>,</span>
<a id=__codelineno-0-106 name=__codelineno-0-106></a> <span class=n>template_name</span><span class=p>,</span>
<a id=__codelineno-0-107 name=__codelineno-0-107></a> <span class=p>),</span>
<a id=__codelineno-0-108 name=__codelineno-0-108></a> <span class=p>)</span>
<a id=__codelineno-0-109 name=__codelineno-0-109></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-110 name=__codelineno-0-110></a> <span class=n>template_name</span> <span class=o>=</span> <span class=nb>tuple</span><span class=p>(</span><span class=n>template_name</span><span class=p>)</span>
<a id=__codelineno-0-111 name=__codelineno-0-111></a> <span class=n>cache</span> <span class=o>=</span> <span class=n>context</span><span class=o>.</span><span class=n>render_context</span><span class=o>.</span><span class=n>dicts</span><span class=p>[</span><span class=mi>0</span><span class=p>]</span><span class=o>.</span><span class=n>setdefault</span><span class=p>(</span><span class=n>include_node</span><span class=p>,</span> <span class=p>{})</span>
<a id=__codelineno-0-112 name=__codelineno-0-112></a> <span class=n>template</span> <span class=o>=</span> <span class=n>cache</span><span class=o>.</span><span class=n>get</span><span class=p>(</span><span class=n>template_name</span><span class=p>)</span>
<a id=__codelineno-0-113 name=__codelineno-0-113></a> <span class=k>if</span> <span class=n>template</span> <span class=ow>is</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-114 name=__codelineno-0-114></a> <span class=n>template</span> <span class=o>=</span> <span class=n>context</span><span class=o>.</span><span class=n>template</span><span class=o>.</span><span class=n>engine</span><span class=o>.</span><span class=n>select_template</span><span class=p>(</span><span class=n>template_name</span><span class=p>)</span>
<a id=__codelineno-0-115 name=__codelineno-0-115></a> <span class=n>cache</span><span class=p>[</span><span class=n>template_name</span><span class=p>]</span> <span class=o>=</span> <span class=n>template</span>
<a id=__codelineno-0-116 name=__codelineno-0-116></a> <span class=c1># Use the base.Template of a backends.django.Template.</span>
<a id=__codelineno-0-117 name=__codelineno-0-117></a> <span class=k>elif</span> <span class=nb>hasattr</span><span class=p>(</span><span class=n>template</span><span class=p>,</span> <span class=s2>&quot;template&quot;</span><span class=p>):</span>
<a id=__codelineno-0-118 name=__codelineno-0-118></a> <span class=n>template</span> <span class=o>=</span> <span class=n>template</span><span class=o>.</span><span class=n>template</span>
<a id=__codelineno-0-119 name=__codelineno-0-119></a> <span class=k>return</span> <span class=n>template</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.node.walk_nodelist class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">walk_nodelist</span> <a href=#django_components.node.walk_nodelist class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>walk_nodelist</span><span class=p>(</span><span class=n>nodes</span><span class=p>:</span> <span class=n><span title=django.template.base.NodeList>NodeList</span></span><span class=p>,</span> <span class=n>callback</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Callable href=https://docs.python.org/3.12/library/typing.html#typing.Callable>Callable</a></span><span class=p>[[</span><span class=n><span title=django.template.base.Node>Node</span></span><span class=p>],</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]],</span> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span>
</code></pre></div> <div class="doc doc-contents "> <p>Recursively walk a NodeList, calling <code>callback</code> for each Node.</p> <details class=quote> <summary>Source code in <code>src/django_components/node.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span>
<span class=normal><a href=#__codelineno-0-46>46</a></span>
<span class=normal><a href=#__codelineno-0-47>47</a></span>
<span class=normal><a href=#__codelineno-0-48>48</a></span>
<span class=normal><a href=#__codelineno-0-49>49</a></span>
<span class=normal><a href=#__codelineno-0-50>50</a></span>
<span class=normal><a href=#__codelineno-0-51>51</a></span>
<span class=normal><a href=#__codelineno-0-52>52</a></span>
<span class=normal><a href=#__codelineno-0-53>53</a></span>
<span class=normal><a href=#__codelineno-0-54>54</a></span>
<span class=normal><a href=#__codelineno-0-55>55</a></span>
<span class=normal><a href=#__codelineno-0-56>56</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-44 name=__codelineno-0-44></a><span class=k>def</span> <span class=nf>walk_nodelist</span><span class=p>(</span>
<a id=__codelineno-0-45 name=__codelineno-0-45></a> <span class=n>nodes</span><span class=p>:</span> <span class=n>NodeList</span><span class=p>,</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a> <span class=n>callback</span><span class=p>:</span> <span class=n>Callable</span><span class=p>[[</span><span class=n>Node</span><span class=p>],</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]],</span>
<a id=__codelineno-0-47 name=__codelineno-0-47></a> <span class=n>context</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>Context</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-48 name=__codelineno-0-48></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-49 name=__codelineno-0-49></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Recursively walk a NodeList, calling `callback` for each Node.&quot;&quot;&quot;</span>
<a id=__codelineno-0-50 name=__codelineno-0-50></a> <span class=n>node_queue</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>NodeTraverse</span><span class=p>]</span> <span class=o>=</span> <span class=p>[</span><span class=n>NodeTraverse</span><span class=p>(</span><span class=n>node</span><span class=o>=</span><span class=n>node</span><span class=p>,</span> <span class=n>parent</span><span class=o>=</span><span class=kc>None</span><span class=p>)</span> <span class=k>for</span> <span class=n>node</span> <span class=ow>in</span> <span class=n>nodes</span><span class=p>]</span>
<a id=__codelineno-0-51 name=__codelineno-0-51></a> <span class=k>while</span> <span class=nb>len</span><span class=p>(</span><span class=n>node_queue</span><span class=p>):</span>
<a id=__codelineno-0-52 name=__codelineno-0-52></a> <span class=n>traverse</span> <span class=o>=</span> <span class=n>node_queue</span><span class=o>.</span><span class=n>pop</span><span class=p>()</span>
<a id=__codelineno-0-53 name=__codelineno-0-53></a> <span class=n>callback</span><span class=p>(</span><span class=n>traverse</span><span class=p>)</span>
<a id=__codelineno-0-54 name=__codelineno-0-54></a> <span class=n>child_nodes</span> <span class=o>=</span> <span class=n>get_node_children</span><span class=p>(</span><span class=n>traverse</span><span class=o>.</span><span class=n>node</span><span class=p>,</span> <span class=n>context</span><span class=p>)</span>
<a id=__codelineno-0-55 name=__codelineno-0-55></a> <span class=n>child_traverses</span> <span class=o>=</span> <span class=p>[</span><span class=n>NodeTraverse</span><span class=p>(</span><span class=n>node</span><span class=o>=</span><span class=n>child_node</span><span class=p>,</span> <span class=n>parent</span><span class=o>=</span><span class=n>traverse</span><span class=p>)</span> <span class=k>for</span> <span class=n>child_node</span> <span class=ow>in</span> <span class=n>child_nodes</span><span class=p>]</span>
<a id=__codelineno-0-56 name=__codelineno-0-56></a> <span class=n>node_queue</span><span class=o>.</span><span class=n>extend</span><span class=p>(</span><span class=n>child_traverses</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.provide class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">provide</span> <a href=#django_components.provide class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.provide.ProvideNode class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ProvideNode</span> <a href=#django_components.provide.ProvideNode class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>ProvideNode</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n>nodelist</span><span class=p>:</span> <span class=n><span title=django.template.base.NodeList>NodeList</span></span><span class=p>,</span> <span class=n>node_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span> <span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.expression.RuntimeKwargs>RuntimeKwargs</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-internal" title=django_components.node.BaseNode href=node/#django_components.node.BaseNode>BaseNode</a></code></p> <p>Implementation of the <code>{% provide %}</code> tag. For more info see <code>Component.inject</code>.</p> <details class=quote> <summary>Source code in <code>src/django_components/provide.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-20>20</a></span>
<span class=normal><a href=#__codelineno-0-21>21</a></span>
<span class=normal><a href=#__codelineno-0-22>22</a></span>
<span class=normal><a href=#__codelineno-0-23>23</a></span>
<span class=normal><a href=#__codelineno-0-24>24</a></span>
<span class=normal><a href=#__codelineno-0-25>25</a></span>
<span class=normal><a href=#__codelineno-0-26>26</a></span>
<span class=normal><a href=#__codelineno-0-27>27</a></span>
<span class=normal><a href=#__codelineno-0-28>28</a></span>
<span class=normal><a href=#__codelineno-0-29>29</a></span>
<span class=normal><a href=#__codelineno-0-30>30</a></span>
<span class=normal><a href=#__codelineno-0-31>31</a></span>
<span class=normal><a href=#__codelineno-0-32>32</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-20 name=__codelineno-0-20></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span>
<a id=__codelineno-0-21 name=__codelineno-0-21></a> <span class=bp>self</span><span class=p>,</span>
<a id=__codelineno-0-22 name=__codelineno-0-22></a> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-23 name=__codelineno-0-23></a> <span class=n>nodelist</span><span class=p>:</span> <span class=n>NodeList</span><span class=p>,</span>
<a id=__codelineno-0-24 name=__codelineno-0-24></a> <span class=n>node_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-25 name=__codelineno-0-25></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>RuntimeKwargs</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-26 name=__codelineno-0-26></a><span class=p>):</span>
<a id=__codelineno-0-27 name=__codelineno-0-27></a> <span class=nb>super</span><span class=p>()</span><span class=o>.</span><span class=fm>__init__</span><span class=p>(</span><span class=n>nodelist</span><span class=o>=</span><span class=n>nodelist</span><span class=p>,</span> <span class=n>args</span><span class=o>=</span><span class=kc>None</span><span class=p>,</span> <span class=n>kwargs</span><span class=o>=</span><span class=n>kwargs</span><span class=p>,</span> <span class=n>node_id</span><span class=o>=</span><span class=n>node_id</span><span class=p>)</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a>
<a id=__codelineno-0-29 name=__codelineno-0-29></a> <span class=bp>self</span><span class=o>.</span><span class=n>name</span> <span class=o>=</span> <span class=n>name</span>
<a id=__codelineno-0-30 name=__codelineno-0-30></a> <span class=bp>self</span><span class=o>.</span><span class=n>nodelist</span> <span class=o>=</span> <span class=n>nodelist</span>
<a id=__codelineno-0-31 name=__codelineno-0-31></a> <span class=bp>self</span><span class=o>.</span><span class=n>node_id</span> <span class=o>=</span> <span class=n>node_id</span> <span class=ow>or</span> <span class=n>gen_id</span><span class=p>()</span>
<a id=__codelineno-0-32 name=__codelineno-0-32></a> <span class=bp>self</span><span class=o>.</span><span class=n>kwargs</span> <span class=o>=</span> <span class=n>kwargs</span> <span class=ow>or</span> <span class=n>RuntimeKwargs</span><span class=p>({})</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.safer_staticfiles class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">safer_staticfiles</span> <a href=#django_components.safer_staticfiles class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-module"> <h3 id=django_components.safer_staticfiles.apps class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">apps</span> <a href=#django_components.safer_staticfiles.apps class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h4 id=django_components.safer_staticfiles.apps.SaferStaticFilesConfig class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">SaferStaticFilesConfig</span> <a href=#django_components.safer_staticfiles.apps.SaferStaticFilesConfig class=headerlink title="Permanent link">¤</a></h4> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><span title=django.contrib.staticfiles.apps.StaticFilesConfig>StaticFilesConfig</span></code></p> <p>Extend the <code>ignore_patterns</code> class attr of StaticFilesConfig to include Python modules and HTML files.</p> <p>When this class is registered as an installed app, <code>$ ./manage.py collectstatic</code> will ignore .py and .html files, preventing potentially sensitive backend logic from being leaked by the static file server.</p> <p>See <a href=https://docs.djangoproject.com/en/5.0/ref/contrib/staticfiles/#customizing-the-ignored-pattern-list>https://docs.djangoproject.com/en/5.0/ref/contrib/staticfiles/#customizing-the-ignored-pattern-list</a></p> <div class="doc doc-children"> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.slots class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">slots</span> <a href=#django_components.slots class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.slots.FillContent class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">FillContent</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-dataclass"><code>dataclass</code></small> </span> <a href=#django_components.slots.FillContent class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>FillContent</span><span class=p>(</span><span class=n>content_func</span><span class=p>:</span> <span class=n><span title=django_components.slots.SlotFunc>SlotFunc</span></span><span class=p>[</span><span class=n><span title=django_components.slots.TSlotData>TSlotData</span></span><span class=p>],</span> <span class=n>slot_default_var</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.slots.SlotDefaultName>SlotDefaultName</span></span><span class=p>],</span> <span class=n>slot_data_var</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.slots.SlotDataName>SlotDataName</span></span><span class=p>])</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=typing.Generic href=https://docs.python.org/3.12/library/typing.html#typing.Generic>Generic</a>[<span title=django_components.slots.TSlotData>TSlotData</span>]</code></p> <p>This represents content set with the <code>{% fill %}</code> tag, e.g.:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;my_comp&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> </span><span class=cp>{%</span> <span class=k>fill</span> <span class=s2>&quot;first_slot&quot;</span> <span class=cp>%}</span><span class=x> &lt;--- This</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> hi</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=x> </span><span class=cp>{{</span> <span class=nv>my_var</span> <span class=cp>}}</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=x> hello</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=x> </span><span class=cp>{%</span> <span class=k>endfill</span> <span class=cp>%}</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a><span class=cp>{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
</code></pre></div> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.slots.FillNode class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">FillNode</span> <a href=#django_components.slots.FillNode class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>FillNode</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><span title=django.template.base.FilterExpression>FilterExpression</span></span><span class=p>,</span> <span class=n>nodelist</span><span class=p>:</span> <span class=n><span title=django.template.base.NodeList>NodeList</span></span><span class=p>,</span> <span class=n>kwargs</span><span class=p>:</span> <span class=n><span title=django_components.expression.RuntimeKwargs>RuntimeKwargs</span></span><span class=p>,</span> <span class=n>node_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span> <span class=n>is_implicit</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span> <span class=o>=</span> <span class=kc>False</span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-internal" title=django_components.node.BaseNode href=node/#django_components.node.BaseNode>BaseNode</a></code></p> <p>Set when a <code>component</code> tag pair is passed template content that excludes <code>fill</code> tags. Nodes of this type contribute their nodelists to slots marked as 'default'.</p> <details class=quote> <summary>Source code in <code>src/django_components/slots.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-231>231</a></span>
<span class=normal><a href=#__codelineno-0-232>232</a></span>
<span class=normal><a href=#__codelineno-0-233>233</a></span>
<span class=normal><a href=#__codelineno-0-234>234</a></span>
<span class=normal><a href=#__codelineno-0-235>235</a></span>
<span class=normal><a href=#__codelineno-0-236>236</a></span>
<span class=normal><a href=#__codelineno-0-237>237</a></span>
<span class=normal><a href=#__codelineno-0-238>238</a></span>
<span class=normal><a href=#__codelineno-0-239>239</a></span>
<span class=normal><a href=#__codelineno-0-240>240</a></span>
<span class=normal><a href=#__codelineno-0-241>241</a></span>
<span class=normal><a href=#__codelineno-0-242>242</a></span>
<span class=normal><a href=#__codelineno-0-243>243</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-231 name=__codelineno-0-231></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span>
<a id=__codelineno-0-232 name=__codelineno-0-232></a> <span class=bp>self</span><span class=p>,</span>
<a id=__codelineno-0-233 name=__codelineno-0-233></a> <span class=n>name</span><span class=p>:</span> <span class=n>FilterExpression</span><span class=p>,</span>
<a id=__codelineno-0-234 name=__codelineno-0-234></a> <span class=n>nodelist</span><span class=p>:</span> <span class=n>NodeList</span><span class=p>,</span>
<a id=__codelineno-0-235 name=__codelineno-0-235></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>RuntimeKwargs</span><span class=p>,</span>
<a id=__codelineno-0-236 name=__codelineno-0-236></a> <span class=n>node_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-237 name=__codelineno-0-237></a> <span class=n>is_implicit</span><span class=p>:</span> <span class=nb>bool</span> <span class=o>=</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-238 name=__codelineno-0-238></a><span class=p>):</span>
<a id=__codelineno-0-239 name=__codelineno-0-239></a> <span class=nb>super</span><span class=p>()</span><span class=o>.</span><span class=fm>__init__</span><span class=p>(</span><span class=n>nodelist</span><span class=o>=</span><span class=n>nodelist</span><span class=p>,</span> <span class=n>args</span><span class=o>=</span><span class=kc>None</span><span class=p>,</span> <span class=n>kwargs</span><span class=o>=</span><span class=n>kwargs</span><span class=p>,</span> <span class=n>node_id</span><span class=o>=</span><span class=n>node_id</span><span class=p>)</span>
<a id=__codelineno-0-240 name=__codelineno-0-240></a>
<a id=__codelineno-0-241 name=__codelineno-0-241></a> <span class=bp>self</span><span class=o>.</span><span class=n>name</span> <span class=o>=</span> <span class=n>name</span>
<a id=__codelineno-0-242 name=__codelineno-0-242></a> <span class=bp>self</span><span class=o>.</span><span class=n>is_implicit</span> <span class=o>=</span> <span class=n>is_implicit</span>
<a id=__codelineno-0-243 name=__codelineno-0-243></a> <span class=bp>self</span><span class=o>.</span><span class=n>component_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.slots.Slot class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Slot</span> <a href=#django_components.slots.Slot class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=typing.NamedTuple href=https://docs.python.org/3.12/library/typing.html#typing.NamedTuple>NamedTuple</a></code></p> <p>This represents content set with the <code>{% slot %}</code> tag, e.g.:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>slot</span> <span class=s2>&quot;my_comp&quot;</span> <span class=nv>default</span> <span class=cp>%}</span><span class=x> &lt;--- This</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> hi</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> </span><span class=cp>{{</span> <span class=nv>my_var</span> <span class=cp>}}</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=x> hello</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=cp>{%</span> <span class=k>endslot</span> <span class=cp>%}</span>
</code></pre></div> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.slots.SlotFill class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">SlotFill</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-dataclass"><code>dataclass</code></small> </span> <a href=#django_components.slots.SlotFill class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>SlotFill</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>escaped_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>is_filled</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>content_func</span><span class=p>:</span> <span class=n><span title=django_components.slots.SlotFunc>SlotFunc</span></span><span class=p>[</span><span class=n><span title=django_components.slots.TSlotData>TSlotData</span></span><span class=p>],</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>context_data</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Mapping href=https://docs.python.org/3.12/library/typing.html#typing.Mapping>Mapping</a></span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=n>slot_default_var</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.slots.SlotDefaultName>SlotDefaultName</span></span><span class=p>],</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a> <span class=n>slot_data_var</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.slots.SlotDataName>SlotDataName</span></span><span class=p>],</span>
<a id=__codelineno-0-9 name=__codelineno-0-9 href=#__codelineno-0-9></a><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=typing.Generic href=https://docs.python.org/3.12/library/typing.html#typing.Generic>Generic</a>[<span title=django_components.slots.TSlotData>TSlotData</span>]</code></p> <p>SlotFill describes what WILL be rendered.</p> <p>It is a Slot that has been resolved against FillContents passed to a Component.</p> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.slots.SlotNode class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">SlotNode</span> <a href=#django_components.slots.SlotNode class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>SlotNode</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>nodelist</span><span class=p>:</span> <span class=n><span title=django.template.base.NodeList>NodeList</span></span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>node_id</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><span title=django_components.expression.RuntimeKwargs>RuntimeKwargs</span></span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>is_required</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span> <span class=o>=</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a> <span class=n>is_default</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#bool>bool</a></span> <span class=o>=</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-internal" title=django_components.node.BaseNode href=node/#django_components.node.BaseNode>BaseNode</a></code></p> <details class=quote> <summary>Source code in <code>src/django_components/slots.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-128>128</a></span>
<span class=normal><a href=#__codelineno-0-129>129</a></span>
<span class=normal><a href=#__codelineno-0-130>130</a></span>
<span class=normal><a href=#__codelineno-0-131>131</a></span>
<span class=normal><a href=#__codelineno-0-132>132</a></span>
<span class=normal><a href=#__codelineno-0-133>133</a></span>
<span class=normal><a href=#__codelineno-0-134>134</a></span>
<span class=normal><a href=#__codelineno-0-135>135</a></span>
<span class=normal><a href=#__codelineno-0-136>136</a></span>
<span class=normal><a href=#__codelineno-0-137>137</a></span>
<span class=normal><a href=#__codelineno-0-138>138</a></span>
<span class=normal><a href=#__codelineno-0-139>139</a></span>
<span class=normal><a href=#__codelineno-0-140>140</a></span>
<span class=normal><a href=#__codelineno-0-141>141</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-128 name=__codelineno-0-128></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span>
<a id=__codelineno-0-129 name=__codelineno-0-129></a> <span class=bp>self</span><span class=p>,</span>
<a id=__codelineno-0-130 name=__codelineno-0-130></a> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-131 name=__codelineno-0-131></a> <span class=n>nodelist</span><span class=p>:</span> <span class=n>NodeList</span><span class=p>,</span>
<a id=__codelineno-0-132 name=__codelineno-0-132></a> <span class=n>node_id</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-133 name=__codelineno-0-133></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=n>RuntimeKwargs</span><span class=p>]</span> <span class=o>=</span> <span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-134 name=__codelineno-0-134></a> <span class=n>is_required</span><span class=p>:</span> <span class=nb>bool</span> <span class=o>=</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-135 name=__codelineno-0-135></a> <span class=n>is_default</span><span class=p>:</span> <span class=nb>bool</span> <span class=o>=</span> <span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-136 name=__codelineno-0-136></a><span class=p>):</span>
<a id=__codelineno-0-137 name=__codelineno-0-137></a> <span class=nb>super</span><span class=p>()</span><span class=o>.</span><span class=fm>__init__</span><span class=p>(</span><span class=n>nodelist</span><span class=o>=</span><span class=n>nodelist</span><span class=p>,</span> <span class=n>args</span><span class=o>=</span><span class=kc>None</span><span class=p>,</span> <span class=n>kwargs</span><span class=o>=</span><span class=n>kwargs</span><span class=p>,</span> <span class=n>node_id</span><span class=o>=</span><span class=n>node_id</span><span class=p>)</span>
<a id=__codelineno-0-138 name=__codelineno-0-138></a>
<a id=__codelineno-0-139 name=__codelineno-0-139></a> <span class=bp>self</span><span class=o>.</span><span class=n>name</span> <span class=o>=</span> <span class=n>name</span>
<a id=__codelineno-0-140 name=__codelineno-0-140></a> <span class=bp>self</span><span class=o>.</span><span class=n>is_required</span> <span class=o>=</span> <span class=n>is_required</span>
<a id=__codelineno-0-141 name=__codelineno-0-141></a> <span class=bp>self</span><span class=o>.</span><span class=n>is_default</span> <span class=o>=</span> <span class=n>is_default</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.slots.SlotRef class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">SlotRef</span> <a href=#django_components.slots.SlotRef class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>SlotRef</span><span class=p>(</span><span class=n>slot</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.slots.SlotNode href=slots/#django_components.slots.SlotNode>SlotNode</a></span><span class=p>,</span> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p>SlotRef allows to treat a slot as a variable. The slot is rendered only once the instance is coerced to string.</p> <p>This is used to access slots as variables inside the templates. When a SlotRef is rendered in the template with <code>{{ my_lazy_slot }}</code>, it will output the contents of the slot.</p> <details class=quote> <summary>Source code in <code>src/django_components/slots.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-118>118</a></span>
<span class=normal><a href=#__codelineno-0-119>119</a></span>
<span class=normal><a href=#__codelineno-0-120>120</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-118 name=__codelineno-0-118></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>slot</span><span class=p>:</span> <span class=s2>&quot;SlotNode&quot;</span><span class=p>,</span> <span class=n>context</span><span class=p>:</span> <span class=n>Context</span><span class=p>):</span>
<a id=__codelineno-0-119 name=__codelineno-0-119></a> <span class=bp>self</span><span class=o>.</span><span class=n>_slot</span> <span class=o>=</span> <span class=n>slot</span>
<a id=__codelineno-0-120 name=__codelineno-0-120></a> <span class=bp>self</span><span class=o>.</span><span class=n>_context</span> <span class=o>=</span> <span class=n>context</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.slots.parse_slot_fill_nodes_from_component_nodelist class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">parse_slot_fill_nodes_from_component_nodelist</span> <a href=#django_components.slots.parse_slot_fill_nodes_from_component_nodelist class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>parse_slot_fill_nodes_from_component_nodelist</span><span class=p>(</span><span class=n>component_nodelist</span><span class=p>:</span> <span class=n><span title=django.template.base.NodeList>NodeList</span></span><span class=p>,</span> <span class=n>ComponentNodeCls</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Type href=https://docs.python.org/3.12/library/typing.html#typing.Type>Type</a></span><span class=p>[</span><span class=n><span title=django.template.base.Node>Node</span></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-internal" title=django_components.slots.FillNode href=slots/#django_components.slots.FillNode>FillNode</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Given a component body (<code>django.template.NodeList</code>), find all slot fills, whether defined explicitly with <code>{% fill %}</code> or implicitly.</p> <p>So if we have a component body: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;mycomponent&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> </span><span class=cp>{%</span> <span class=k>fill</span> <span class=s2>&quot;first_fill&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> Hello!</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=x> </span><span class=cp>{%</span> <span class=k>endfill</span> <span class=cp>%}</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=x> </span><span class=cp>{%</span> <span class=k>fill</span> <span class=s2>&quot;second_fill&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a><span class=x> Hello too!</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a><span class=x> </span><span class=cp>{%</span> <span class=k>endfill</span> <span class=cp>%}</span>
<a id=__codelineno-0-8 name=__codelineno-0-8 href=#__codelineno-0-8></a><span class=cp>{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
</code></pre></div> Then this function returns the nodes (<code>django.template.Node</code>) for <code>fill "first_fill"</code> and <code>fill "second_fill"</code>.</p> <details class=quote> <summary>Source code in <code>src/django_components/slots.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-293>293</a></span>
<span class=normal><a href=#__codelineno-0-294>294</a></span>
<span class=normal><a href=#__codelineno-0-295>295</a></span>
<span class=normal><a href=#__codelineno-0-296>296</a></span>
<span class=normal><a href=#__codelineno-0-297>297</a></span>
<span class=normal><a href=#__codelineno-0-298>298</a></span>
<span class=normal><a href=#__codelineno-0-299>299</a></span>
<span class=normal><a href=#__codelineno-0-300>300</a></span>
<span class=normal><a href=#__codelineno-0-301>301</a></span>
<span class=normal><a href=#__codelineno-0-302>302</a></span>
<span class=normal><a href=#__codelineno-0-303>303</a></span>
<span class=normal><a href=#__codelineno-0-304>304</a></span>
<span class=normal><a href=#__codelineno-0-305>305</a></span>
<span class=normal><a href=#__codelineno-0-306>306</a></span>
<span class=normal><a href=#__codelineno-0-307>307</a></span>
<span class=normal><a href=#__codelineno-0-308>308</a></span>
<span class=normal><a href=#__codelineno-0-309>309</a></span>
<span class=normal><a href=#__codelineno-0-310>310</a></span>
<span class=normal><a href=#__codelineno-0-311>311</a></span>
<span class=normal><a href=#__codelineno-0-312>312</a></span>
<span class=normal><a href=#__codelineno-0-313>313</a></span>
<span class=normal><a href=#__codelineno-0-314>314</a></span>
<span class=normal><a href=#__codelineno-0-315>315</a></span>
<span class=normal><a href=#__codelineno-0-316>316</a></span>
<span class=normal><a href=#__codelineno-0-317>317</a></span>
<span class=normal><a href=#__codelineno-0-318>318</a></span>
<span class=normal><a href=#__codelineno-0-319>319</a></span>
<span class=normal><a href=#__codelineno-0-320>320</a></span>
<span class=normal><a href=#__codelineno-0-321>321</a></span>
<span class=normal><a href=#__codelineno-0-322>322</a></span>
<span class=normal><a href=#__codelineno-0-323>323</a></span>
<span class=normal><a href=#__codelineno-0-324>324</a></span>
<span class=normal><a href=#__codelineno-0-325>325</a></span>
<span class=normal><a href=#__codelineno-0-326>326</a></span>
<span class=normal><a href=#__codelineno-0-327>327</a></span>
<span class=normal><a href=#__codelineno-0-328>328</a></span>
<span class=normal><a href=#__codelineno-0-329>329</a></span>
<span class=normal><a href=#__codelineno-0-330>330</a></span>
<span class=normal><a href=#__codelineno-0-331>331</a></span>
<span class=normal><a href=#__codelineno-0-332>332</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-293 name=__codelineno-0-293></a><span class=k>def</span> <span class=nf>parse_slot_fill_nodes_from_component_nodelist</span><span class=p>(</span>
<a id=__codelineno-0-294 name=__codelineno-0-294></a> <span class=n>component_nodelist</span><span class=p>:</span> <span class=n>NodeList</span><span class=p>,</span>
<a id=__codelineno-0-295 name=__codelineno-0-295></a> <span class=n>ComponentNodeCls</span><span class=p>:</span> <span class=n>Type</span><span class=p>[</span><span class=n>Node</span><span class=p>],</span>
<a id=__codelineno-0-296 name=__codelineno-0-296></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=n>FillNode</span><span class=p>]:</span>
<a id=__codelineno-0-297 name=__codelineno-0-297></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-298 name=__codelineno-0-298></a><span class=sd> Given a component body (`django.template.NodeList`), find all slot fills,</span>
<a id=__codelineno-0-299 name=__codelineno-0-299></a><span class=sd> whether defined explicitly with `{% fill %}` or implicitly.</span>
<a id=__codelineno-0-300 name=__codelineno-0-300></a>
<a id=__codelineno-0-301 name=__codelineno-0-301></a><span class=sd> So if we have a component body:</span>
<a id=__codelineno-0-302 name=__codelineno-0-302></a><span class=sd> ```django</span>
<a id=__codelineno-0-303 name=__codelineno-0-303></a><span class=sd> {% component &quot;mycomponent&quot; %}</span>
<a id=__codelineno-0-304 name=__codelineno-0-304></a><span class=sd> {% fill &quot;first_fill&quot; %}</span>
<a id=__codelineno-0-305 name=__codelineno-0-305></a><span class=sd> Hello!</span>
<a id=__codelineno-0-306 name=__codelineno-0-306></a><span class=sd> {% endfill %}</span>
<a id=__codelineno-0-307 name=__codelineno-0-307></a><span class=sd> {% fill &quot;second_fill&quot; %}</span>
<a id=__codelineno-0-308 name=__codelineno-0-308></a><span class=sd> Hello too!</span>
<a id=__codelineno-0-309 name=__codelineno-0-309></a><span class=sd> {% endfill %}</span>
<a id=__codelineno-0-310 name=__codelineno-0-310></a><span class=sd> {% endcomponent %}</span>
<a id=__codelineno-0-311 name=__codelineno-0-311></a><span class=sd> ```</span>
<a id=__codelineno-0-312 name=__codelineno-0-312></a><span class=sd> Then this function returns the nodes (`django.template.Node`) for `fill &quot;first_fill&quot;`</span>
<a id=__codelineno-0-313 name=__codelineno-0-313></a><span class=sd> and `fill &quot;second_fill&quot;`.</span>
<a id=__codelineno-0-314 name=__codelineno-0-314></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-315 name=__codelineno-0-315></a> <span class=n>fill_nodes</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>FillNode</span><span class=p>]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-316 name=__codelineno-0-316></a> <span class=k>if</span> <span class=n>nodelist_has_content</span><span class=p>(</span><span class=n>component_nodelist</span><span class=p>):</span>
<a id=__codelineno-0-317 name=__codelineno-0-317></a> <span class=k>for</span> <span class=n>parse_fn</span> <span class=ow>in</span> <span class=p>(</span>
<a id=__codelineno-0-318 name=__codelineno-0-318></a> <span class=n>_try_parse_as_default_fill</span><span class=p>,</span>
<a id=__codelineno-0-319 name=__codelineno-0-319></a> <span class=n>_try_parse_as_named_fill_tag_set</span><span class=p>,</span>
<a id=__codelineno-0-320 name=__codelineno-0-320></a> <span class=p>):</span>
<a id=__codelineno-0-321 name=__codelineno-0-321></a> <span class=n>curr_fill_nodes</span> <span class=o>=</span> <span class=n>parse_fn</span><span class=p>(</span><span class=n>component_nodelist</span><span class=p>,</span> <span class=n>ComponentNodeCls</span><span class=p>)</span>
<a id=__codelineno-0-322 name=__codelineno-0-322></a> <span class=k>if</span> <span class=n>curr_fill_nodes</span><span class=p>:</span>
<a id=__codelineno-0-323 name=__codelineno-0-323></a> <span class=n>fill_nodes</span> <span class=o>=</span> <span class=n>curr_fill_nodes</span>
<a id=__codelineno-0-324 name=__codelineno-0-324></a> <span class=k>break</span>
<a id=__codelineno-0-325 name=__codelineno-0-325></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-326 name=__codelineno-0-326></a> <span class=k>raise</span> <span class=n>TemplateSyntaxError</span><span class=p>(</span>
<a id=__codelineno-0-327 name=__codelineno-0-327></a> <span class=s2>&quot;Illegal content passed to &#39;component&#39; tag pair. &quot;</span>
<a id=__codelineno-0-328 name=__codelineno-0-328></a> <span class=s2>&quot;Possible causes: 1) Explicit &#39;fill&#39; tags cannot occur alongside other &quot;</span>
<a id=__codelineno-0-329 name=__codelineno-0-329></a> <span class=s2>&quot;tags except comment tags; 2) Default (default slot-targeting) content &quot;</span>
<a id=__codelineno-0-330 name=__codelineno-0-330></a> <span class=s2>&quot;is mixed with explict &#39;fill&#39; tags.&quot;</span>
<a id=__codelineno-0-331 name=__codelineno-0-331></a> <span class=p>)</span>
<a id=__codelineno-0-332 name=__codelineno-0-332></a> <span class=k>return</span> <span class=n>fill_nodes</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.slots.resolve_slots class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">resolve_slots</span> <a href=#django_components.slots.resolve_slots class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>resolve_slots</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>context</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Context href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Context>Context</a></span><span class=p>,</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a> <span class=n>template</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=django.template.Template href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.Template>Template</a></span><span class=p>,</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a> <span class=n>component_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Optional href=https://docs.python.org/3.12/library/typing.html#typing.Optional>Optional</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>],</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a> <span class=n>context_data</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Mapping href=https://docs.python.org/3.12/library/typing.html#typing.Mapping>Mapping</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-external" title=typing.Any href=https://docs.python.org/3.12/library/typing.html#typing.Any>Any</a></span><span class=p>],</span>
<a id=__codelineno-0-6 name=__codelineno-0-6 href=#__codelineno-0-6></a> <span class=n>fill_content</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><span title=django_components.slots.SlotName>SlotName</span></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.slots.FillContent href=slots/#django_components.slots.FillContent>FillContent</a></span><span class=p>],</span>
<a id=__codelineno-0-7 name=__codelineno-0-7 href=#__codelineno-0-7></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Tuple href=https://docs.python.org/3.12/library/typing.html#typing.Tuple>Tuple</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><span title=django_components.slots.SlotId>SlotId</span></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.slots.Slot href=slots/#django_components.slots.Slot>Slot</a></span><span class=p>],</span> <span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><span title=django_components.slots.SlotId>SlotId</span></span><span class=p>,</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.slots.SlotFill href=slots/#django_components.slots.SlotFill>SlotFill</a></span><span class=p>]]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Search the template for all SlotNodes, and associate the slots with the given fills.</p> <p>Returns tuple of: - Slots defined in the component's Template with <code>{% slot %}</code> tag - SlotFills (AKA slots matched with fills) describing what will be rendered for each slot.</p> <details class=quote> <summary>Source code in <code>src/django_components/slots.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-393>393</a></span>
<span class=normal><a href=#__codelineno-0-394>394</a></span>
<span class=normal><a href=#__codelineno-0-395>395</a></span>
<span class=normal><a href=#__codelineno-0-396>396</a></span>
<span class=normal><a href=#__codelineno-0-397>397</a></span>
<span class=normal><a href=#__codelineno-0-398>398</a></span>
<span class=normal><a href=#__codelineno-0-399>399</a></span>
<span class=normal><a href=#__codelineno-0-400>400</a></span>
<span class=normal><a href=#__codelineno-0-401>401</a></span>
<span class=normal><a href=#__codelineno-0-402>402</a></span>
<span class=normal><a href=#__codelineno-0-403>403</a></span>
<span class=normal><a href=#__codelineno-0-404>404</a></span>
<span class=normal><a href=#__codelineno-0-405>405</a></span>
<span class=normal><a href=#__codelineno-0-406>406</a></span>
<span class=normal><a href=#__codelineno-0-407>407</a></span>
<span class=normal><a href=#__codelineno-0-408>408</a></span>
<span class=normal><a href=#__codelineno-0-409>409</a></span>
<span class=normal><a href=#__codelineno-0-410>410</a></span>
<span class=normal><a href=#__codelineno-0-411>411</a></span>
<span class=normal><a href=#__codelineno-0-412>412</a></span>
<span class=normal><a href=#__codelineno-0-413>413</a></span>
<span class=normal><a href=#__codelineno-0-414>414</a></span>
<span class=normal><a href=#__codelineno-0-415>415</a></span>
<span class=normal><a href=#__codelineno-0-416>416</a></span>
<span class=normal><a href=#__codelineno-0-417>417</a></span>
<span class=normal><a href=#__codelineno-0-418>418</a></span>
<span class=normal><a href=#__codelineno-0-419>419</a></span>
<span class=normal><a href=#__codelineno-0-420>420</a></span>
<span class=normal><a href=#__codelineno-0-421>421</a></span>
<span class=normal><a href=#__codelineno-0-422>422</a></span>
<span class=normal><a href=#__codelineno-0-423>423</a></span>
<span class=normal><a href=#__codelineno-0-424>424</a></span>
<span class=normal><a href=#__codelineno-0-425>425</a></span>
<span class=normal><a href=#__codelineno-0-426>426</a></span>
<span class=normal><a href=#__codelineno-0-427>427</a></span>
<span class=normal><a href=#__codelineno-0-428>428</a></span>
<span class=normal><a href=#__codelineno-0-429>429</a></span>
<span class=normal><a href=#__codelineno-0-430>430</a></span>
<span class=normal><a href=#__codelineno-0-431>431</a></span>
<span class=normal><a href=#__codelineno-0-432>432</a></span>
<span class=normal><a href=#__codelineno-0-433>433</a></span>
<span class=normal><a href=#__codelineno-0-434>434</a></span>
<span class=normal><a href=#__codelineno-0-435>435</a></span>
<span class=normal><a href=#__codelineno-0-436>436</a></span>
<span class=normal><a href=#__codelineno-0-437>437</a></span>
<span class=normal><a href=#__codelineno-0-438>438</a></span>
<span class=normal><a href=#__codelineno-0-439>439</a></span>
<span class=normal><a href=#__codelineno-0-440>440</a></span>
<span class=normal><a href=#__codelineno-0-441>441</a></span>
<span class=normal><a href=#__codelineno-0-442>442</a></span>
<span class=normal><a href=#__codelineno-0-443>443</a></span>
<span class=normal><a href=#__codelineno-0-444>444</a></span>
<span class=normal><a href=#__codelineno-0-445>445</a></span>
<span class=normal><a href=#__codelineno-0-446>446</a></span>
<span class=normal><a href=#__codelineno-0-447>447</a></span>
<span class=normal><a href=#__codelineno-0-448>448</a></span>
<span class=normal><a href=#__codelineno-0-449>449</a></span>
<span class=normal><a href=#__codelineno-0-450>450</a></span>
<span class=normal><a href=#__codelineno-0-451>451</a></span>
<span class=normal><a href=#__codelineno-0-452>452</a></span>
<span class=normal><a href=#__codelineno-0-453>453</a></span>
<span class=normal><a href=#__codelineno-0-454>454</a></span>
<span class=normal><a href=#__codelineno-0-455>455</a></span>
<span class=normal><a href=#__codelineno-0-456>456</a></span>
<span class=normal><a href=#__codelineno-0-457>457</a></span>
<span class=normal><a href=#__codelineno-0-458>458</a></span>
<span class=normal><a href=#__codelineno-0-459>459</a></span>
<span class=normal><a href=#__codelineno-0-460>460</a></span>
<span class=normal><a href=#__codelineno-0-461>461</a></span>
<span class=normal><a href=#__codelineno-0-462>462</a></span>
<span class=normal><a href=#__codelineno-0-463>463</a></span>
<span class=normal><a href=#__codelineno-0-464>464</a></span>
<span class=normal><a href=#__codelineno-0-465>465</a></span>
<span class=normal><a href=#__codelineno-0-466>466</a></span>
<span class=normal><a href=#__codelineno-0-467>467</a></span>
<span class=normal><a href=#__codelineno-0-468>468</a></span>
<span class=normal><a href=#__codelineno-0-469>469</a></span>
<span class=normal><a href=#__codelineno-0-470>470</a></span>
<span class=normal><a href=#__codelineno-0-471>471</a></span>
<span class=normal><a href=#__codelineno-0-472>472</a></span>
<span class=normal><a href=#__codelineno-0-473>473</a></span>
<span class=normal><a href=#__codelineno-0-474>474</a></span>
<span class=normal><a href=#__codelineno-0-475>475</a></span>
<span class=normal><a href=#__codelineno-0-476>476</a></span>
<span class=normal><a href=#__codelineno-0-477>477</a></span>
<span class=normal><a href=#__codelineno-0-478>478</a></span>
<span class=normal><a href=#__codelineno-0-479>479</a></span>
<span class=normal><a href=#__codelineno-0-480>480</a></span>
<span class=normal><a href=#__codelineno-0-481>481</a></span>
<span class=normal><a href=#__codelineno-0-482>482</a></span>
<span class=normal><a href=#__codelineno-0-483>483</a></span>
<span class=normal><a href=#__codelineno-0-484>484</a></span>
<span class=normal><a href=#__codelineno-0-485>485</a></span>
<span class=normal><a href=#__codelineno-0-486>486</a></span>
<span class=normal><a href=#__codelineno-0-487>487</a></span>
<span class=normal><a href=#__codelineno-0-488>488</a></span>
<span class=normal><a href=#__codelineno-0-489>489</a></span>
<span class=normal><a href=#__codelineno-0-490>490</a></span>
<span class=normal><a href=#__codelineno-0-491>491</a></span>
<span class=normal><a href=#__codelineno-0-492>492</a></span>
<span class=normal><a href=#__codelineno-0-493>493</a></span>
<span class=normal><a href=#__codelineno-0-494>494</a></span>
<span class=normal><a href=#__codelineno-0-495>495</a></span>
<span class=normal><a href=#__codelineno-0-496>496</a></span>
<span class=normal><a href=#__codelineno-0-497>497</a></span>
<span class=normal><a href=#__codelineno-0-498>498</a></span>
<span class=normal><a href=#__codelineno-0-499>499</a></span>
<span class=normal><a href=#__codelineno-0-500>500</a></span>
<span class=normal><a href=#__codelineno-0-501>501</a></span>
<span class=normal><a href=#__codelineno-0-502>502</a></span>
<span class=normal><a href=#__codelineno-0-503>503</a></span>
<span class=normal><a href=#__codelineno-0-504>504</a></span>
<span class=normal><a href=#__codelineno-0-505>505</a></span>
<span class=normal><a href=#__codelineno-0-506>506</a></span>
<span class=normal><a href=#__codelineno-0-507>507</a></span>
<span class=normal><a href=#__codelineno-0-508>508</a></span>
<span class=normal><a href=#__codelineno-0-509>509</a></span>
<span class=normal><a href=#__codelineno-0-510>510</a></span>
<span class=normal><a href=#__codelineno-0-511>511</a></span>
<span class=normal><a href=#__codelineno-0-512>512</a></span>
<span class=normal><a href=#__codelineno-0-513>513</a></span>
<span class=normal><a href=#__codelineno-0-514>514</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-393 name=__codelineno-0-393></a><span class=k>def</span> <span class=nf>resolve_slots</span><span class=p>(</span>
<a id=__codelineno-0-394 name=__codelineno-0-394></a> <span class=n>context</span><span class=p>:</span> <span class=n>Context</span><span class=p>,</span>
<a id=__codelineno-0-395 name=__codelineno-0-395></a> <span class=n>template</span><span class=p>:</span> <span class=n>Template</span><span class=p>,</span>
<a id=__codelineno-0-396 name=__codelineno-0-396></a> <span class=n>component_name</span><span class=p>:</span> <span class=n>Optional</span><span class=p>[</span><span class=nb>str</span><span class=p>],</span>
<a id=__codelineno-0-397 name=__codelineno-0-397></a> <span class=n>context_data</span><span class=p>:</span> <span class=n>Mapping</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>Any</span><span class=p>],</span>
<a id=__codelineno-0-398 name=__codelineno-0-398></a> <span class=n>fill_content</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=n>SlotName</span><span class=p>,</span> <span class=n>FillContent</span><span class=p>],</span>
<a id=__codelineno-0-399 name=__codelineno-0-399></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Tuple</span><span class=p>[</span><span class=n>Dict</span><span class=p>[</span><span class=n>SlotId</span><span class=p>,</span> <span class=n>Slot</span><span class=p>],</span> <span class=n>Dict</span><span class=p>[</span><span class=n>SlotId</span><span class=p>,</span> <span class=n>SlotFill</span><span class=p>]]:</span>
<a id=__codelineno-0-400 name=__codelineno-0-400></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-401 name=__codelineno-0-401></a><span class=sd> Search the template for all SlotNodes, and associate the slots</span>
<a id=__codelineno-0-402 name=__codelineno-0-402></a><span class=sd> with the given fills.</span>
<a id=__codelineno-0-403 name=__codelineno-0-403></a>
<a id=__codelineno-0-404 name=__codelineno-0-404></a><span class=sd> Returns tuple of:</span>
<a id=__codelineno-0-405 name=__codelineno-0-405></a><span class=sd> - Slots defined in the component&#39;s Template with `{% slot %}` tag</span>
<a id=__codelineno-0-406 name=__codelineno-0-406></a><span class=sd> - SlotFills (AKA slots matched with fills) describing what will be rendered for each slot.</span>
<a id=__codelineno-0-407 name=__codelineno-0-407></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-408 name=__codelineno-0-408></a> <span class=n>slot_fills</span> <span class=o>=</span> <span class=p>{</span>
<a id=__codelineno-0-409 name=__codelineno-0-409></a> <span class=n>name</span><span class=p>:</span> <span class=n>SlotFill</span><span class=p>(</span>
<a id=__codelineno-0-410 name=__codelineno-0-410></a> <span class=n>name</span><span class=o>=</span><span class=n>name</span><span class=p>,</span>
<a id=__codelineno-0-411 name=__codelineno-0-411></a> <span class=n>escaped_name</span><span class=o>=</span><span class=n>_escape_slot_name</span><span class=p>(</span><span class=n>name</span><span class=p>),</span>
<a id=__codelineno-0-412 name=__codelineno-0-412></a> <span class=n>is_filled</span><span class=o>=</span><span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-413 name=__codelineno-0-413></a> <span class=n>content_func</span><span class=o>=</span><span class=n>fill</span><span class=o>.</span><span class=n>content_func</span><span class=p>,</span>
<a id=__codelineno-0-414 name=__codelineno-0-414></a> <span class=n>context_data</span><span class=o>=</span><span class=n>context_data</span><span class=p>,</span>
<a id=__codelineno-0-415 name=__codelineno-0-415></a> <span class=n>slot_default_var</span><span class=o>=</span><span class=n>fill</span><span class=o>.</span><span class=n>slot_default_var</span><span class=p>,</span>
<a id=__codelineno-0-416 name=__codelineno-0-416></a> <span class=n>slot_data_var</span><span class=o>=</span><span class=n>fill</span><span class=o>.</span><span class=n>slot_data_var</span><span class=p>,</span>
<a id=__codelineno-0-417 name=__codelineno-0-417></a> <span class=p>)</span>
<a id=__codelineno-0-418 name=__codelineno-0-418></a> <span class=k>for</span> <span class=n>name</span><span class=p>,</span> <span class=n>fill</span> <span class=ow>in</span> <span class=n>fill_content</span><span class=o>.</span><span class=n>items</span><span class=p>()</span>
<a id=__codelineno-0-419 name=__codelineno-0-419></a> <span class=p>}</span>
<a id=__codelineno-0-420 name=__codelineno-0-420></a>
<a id=__codelineno-0-421 name=__codelineno-0-421></a> <span class=n>slots</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=n>SlotId</span><span class=p>,</span> <span class=n>Slot</span><span class=p>]</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-422 name=__codelineno-0-422></a> <span class=c1># This holds info on which slot (key) has which slots nested in it (value list)</span>
<a id=__codelineno-0-423 name=__codelineno-0-423></a> <span class=n>slot_children</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=n>SlotId</span><span class=p>,</span> <span class=n>List</span><span class=p>[</span><span class=n>SlotId</span><span class=p>]]</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-424 name=__codelineno-0-424></a>
<a id=__codelineno-0-425 name=__codelineno-0-425></a> <span class=k>def</span> <span class=nf>on_node</span><span class=p>(</span><span class=n>entry</span><span class=p>:</span> <span class=n>NodeTraverse</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-426 name=__codelineno-0-426></a> <span class=n>node</span> <span class=o>=</span> <span class=n>entry</span><span class=o>.</span><span class=n>node</span>
<a id=__codelineno-0-427 name=__codelineno-0-427></a> <span class=k>if</span> <span class=ow>not</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>node</span><span class=p>,</span> <span class=n>SlotNode</span><span class=p>):</span>
<a id=__codelineno-0-428 name=__codelineno-0-428></a> <span class=k>return</span>
<a id=__codelineno-0-429 name=__codelineno-0-429></a>
<a id=__codelineno-0-430 name=__codelineno-0-430></a> <span class=c1># 1. Collect slots</span>
<a id=__codelineno-0-431 name=__codelineno-0-431></a> <span class=c1># Basically we take all the important info form the SlotNode, so the logic is</span>
<a id=__codelineno-0-432 name=__codelineno-0-432></a> <span class=c1># less coupled to Django&#39;s Template/Node. Plain tuples should also help with</span>
<a id=__codelineno-0-433 name=__codelineno-0-433></a> <span class=c1># troubleshooting.</span>
<a id=__codelineno-0-434 name=__codelineno-0-434></a> <span class=n>slot</span> <span class=o>=</span> <span class=n>Slot</span><span class=p>(</span>
<a id=__codelineno-0-435 name=__codelineno-0-435></a> <span class=nb>id</span><span class=o>=</span><span class=n>node</span><span class=o>.</span><span class=n>node_id</span><span class=p>,</span>
<a id=__codelineno-0-436 name=__codelineno-0-436></a> <span class=n>name</span><span class=o>=</span><span class=n>node</span><span class=o>.</span><span class=n>name</span><span class=p>,</span>
<a id=__codelineno-0-437 name=__codelineno-0-437></a> <span class=n>nodelist</span><span class=o>=</span><span class=n>node</span><span class=o>.</span><span class=n>nodelist</span><span class=p>,</span>
<a id=__codelineno-0-438 name=__codelineno-0-438></a> <span class=n>is_default</span><span class=o>=</span><span class=n>node</span><span class=o>.</span><span class=n>is_default</span><span class=p>,</span>
<a id=__codelineno-0-439 name=__codelineno-0-439></a> <span class=n>is_required</span><span class=o>=</span><span class=n>node</span><span class=o>.</span><span class=n>is_required</span><span class=p>,</span>
<a id=__codelineno-0-440 name=__codelineno-0-440></a> <span class=p>)</span>
<a id=__codelineno-0-441 name=__codelineno-0-441></a> <span class=n>slots</span><span class=p>[</span><span class=n>node</span><span class=o>.</span><span class=n>node_id</span><span class=p>]</span> <span class=o>=</span> <span class=n>slot</span>
<a id=__codelineno-0-442 name=__codelineno-0-442></a>
<a id=__codelineno-0-443 name=__codelineno-0-443></a> <span class=c1># 2. Figure out which Slots are nested in other Slots, so we can render</span>
<a id=__codelineno-0-444 name=__codelineno-0-444></a> <span class=c1># them from outside-inwards, so we can skip inner Slots if fills are provided.</span>
<a id=__codelineno-0-445 name=__codelineno-0-445></a> <span class=c1># We should end up with a graph-like data like:</span>
<a id=__codelineno-0-446 name=__codelineno-0-446></a> <span class=c1># - 0001: [0002]</span>
<a id=__codelineno-0-447 name=__codelineno-0-447></a> <span class=c1># - 0002: []</span>
<a id=__codelineno-0-448 name=__codelineno-0-448></a> <span class=c1># - 0003: [0004]</span>
<a id=__codelineno-0-449 name=__codelineno-0-449></a> <span class=c1># In other words, the data tells us that slot ID 0001 is PARENT of slot 0002.</span>
<a id=__codelineno-0-450 name=__codelineno-0-450></a> <span class=n>curr_entry</span> <span class=o>=</span> <span class=n>entry</span><span class=o>.</span><span class=n>parent</span>
<a id=__codelineno-0-451 name=__codelineno-0-451></a> <span class=k>while</span> <span class=n>curr_entry</span> <span class=ow>and</span> <span class=n>curr_entry</span><span class=o>.</span><span class=n>parent</span> <span class=ow>is</span> <span class=ow>not</span> <span class=kc>None</span><span class=p>:</span>
<a id=__codelineno-0-452 name=__codelineno-0-452></a> <span class=k>if</span> <span class=ow>not</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>curr_entry</span><span class=o>.</span><span class=n>node</span><span class=p>,</span> <span class=n>SlotNode</span><span class=p>):</span>
<a id=__codelineno-0-453 name=__codelineno-0-453></a> <span class=n>curr_entry</span> <span class=o>=</span> <span class=n>curr_entry</span><span class=o>.</span><span class=n>parent</span>
<a id=__codelineno-0-454 name=__codelineno-0-454></a> <span class=k>continue</span>
<a id=__codelineno-0-455 name=__codelineno-0-455></a>
<a id=__codelineno-0-456 name=__codelineno-0-456></a> <span class=n>parent_slot_id</span> <span class=o>=</span> <span class=n>curr_entry</span><span class=o>.</span><span class=n>node</span><span class=o>.</span><span class=n>node_id</span>
<a id=__codelineno-0-457 name=__codelineno-0-457></a> <span class=k>if</span> <span class=n>parent_slot_id</span> <span class=ow>not</span> <span class=ow>in</span> <span class=n>slot_children</span><span class=p>:</span>
<a id=__codelineno-0-458 name=__codelineno-0-458></a> <span class=n>slot_children</span><span class=p>[</span><span class=n>parent_slot_id</span><span class=p>]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-459 name=__codelineno-0-459></a> <span class=n>slot_children</span><span class=p>[</span><span class=n>parent_slot_id</span><span class=p>]</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>node</span><span class=o>.</span><span class=n>node_id</span><span class=p>)</span>
<a id=__codelineno-0-460 name=__codelineno-0-460></a> <span class=k>break</span>
<a id=__codelineno-0-461 name=__codelineno-0-461></a>
<a id=__codelineno-0-462 name=__codelineno-0-462></a> <span class=n>walk_nodelist</span><span class=p>(</span><span class=n>template</span><span class=o>.</span><span class=n>nodelist</span><span class=p>,</span> <span class=n>on_node</span><span class=p>,</span> <span class=n>context</span><span class=p>)</span>
<a id=__codelineno-0-463 name=__codelineno-0-463></a>
<a id=__codelineno-0-464 name=__codelineno-0-464></a> <span class=c1># 3. Figure out which slot the default/implicit fill belongs to</span>
<a id=__codelineno-0-465 name=__codelineno-0-465></a> <span class=n>slot_fills</span> <span class=o>=</span> <span class=n>_resolve_default_slot</span><span class=p>(</span>
<a id=__codelineno-0-466 name=__codelineno-0-466></a> <span class=n>template_name</span><span class=o>=</span><span class=n>template</span><span class=o>.</span><span class=n>name</span><span class=p>,</span>
<a id=__codelineno-0-467 name=__codelineno-0-467></a> <span class=n>component_name</span><span class=o>=</span><span class=n>component_name</span><span class=p>,</span>
<a id=__codelineno-0-468 name=__codelineno-0-468></a> <span class=n>slots</span><span class=o>=</span><span class=n>slots</span><span class=p>,</span>
<a id=__codelineno-0-469 name=__codelineno-0-469></a> <span class=n>slot_fills</span><span class=o>=</span><span class=n>slot_fills</span><span class=p>,</span>
<a id=__codelineno-0-470 name=__codelineno-0-470></a> <span class=p>)</span>
<a id=__codelineno-0-471 name=__codelineno-0-471></a>
<a id=__codelineno-0-472 name=__codelineno-0-472></a> <span class=c1># 4. Detect any errors with slots/fills</span>
<a id=__codelineno-0-473 name=__codelineno-0-473></a> <span class=n>_report_slot_errors</span><span class=p>(</span><span class=n>slots</span><span class=p>,</span> <span class=n>slot_fills</span><span class=p>,</span> <span class=n>component_name</span><span class=p>)</span>
<a id=__codelineno-0-474 name=__codelineno-0-474></a>
<a id=__codelineno-0-475 name=__codelineno-0-475></a> <span class=c1># 5. Find roots of the slot relationships</span>
<a id=__codelineno-0-476 name=__codelineno-0-476></a> <span class=n>top_level_slot_ids</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>SlotId</span><span class=p>]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-477 name=__codelineno-0-477></a> <span class=k>for</span> <span class=n>node_id</span><span class=p>,</span> <span class=n>slot</span> <span class=ow>in</span> <span class=n>slots</span><span class=o>.</span><span class=n>items</span><span class=p>():</span>
<a id=__codelineno-0-478 name=__codelineno-0-478></a> <span class=k>if</span> <span class=n>node_id</span> <span class=ow>not</span> <span class=ow>in</span> <span class=n>slot_children</span> <span class=ow>or</span> <span class=ow>not</span> <span class=n>slot_children</span><span class=p>[</span><span class=n>node_id</span><span class=p>]:</span>
<a id=__codelineno-0-479 name=__codelineno-0-479></a> <span class=n>top_level_slot_ids</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>node_id</span><span class=p>)</span>
<a id=__codelineno-0-480 name=__codelineno-0-480></a>
<a id=__codelineno-0-481 name=__codelineno-0-481></a> <span class=c1># 6. Walk from out-most slots inwards, and decide whether and how</span>
<a id=__codelineno-0-482 name=__codelineno-0-482></a> <span class=c1># we will render each slot.</span>
<a id=__codelineno-0-483 name=__codelineno-0-483></a> <span class=n>resolved_slots</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=n>SlotId</span><span class=p>,</span> <span class=n>SlotFill</span><span class=p>]</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-484 name=__codelineno-0-484></a> <span class=n>slot_ids_queue</span> <span class=o>=</span> <span class=n>deque</span><span class=p>([</span><span class=o>*</span><span class=n>top_level_slot_ids</span><span class=p>])</span>
<a id=__codelineno-0-485 name=__codelineno-0-485></a> <span class=k>while</span> <span class=nb>len</span><span class=p>(</span><span class=n>slot_ids_queue</span><span class=p>):</span>
<a id=__codelineno-0-486 name=__codelineno-0-486></a> <span class=n>slot_id</span> <span class=o>=</span> <span class=n>slot_ids_queue</span><span class=o>.</span><span class=n>pop</span><span class=p>()</span>
<a id=__codelineno-0-487 name=__codelineno-0-487></a> <span class=n>slot</span> <span class=o>=</span> <span class=n>slots</span><span class=p>[</span><span class=n>slot_id</span><span class=p>]</span>
<a id=__codelineno-0-488 name=__codelineno-0-488></a>
<a id=__codelineno-0-489 name=__codelineno-0-489></a> <span class=c1># Check if there is a slot fill for given slot name</span>
<a id=__codelineno-0-490 name=__codelineno-0-490></a> <span class=k>if</span> <span class=n>slot</span><span class=o>.</span><span class=n>name</span> <span class=ow>in</span> <span class=n>slot_fills</span><span class=p>:</span>
<a id=__codelineno-0-491 name=__codelineno-0-491></a> <span class=c1># If yes, we remember which slot we want to replace with already-rendered fills</span>
<a id=__codelineno-0-492 name=__codelineno-0-492></a> <span class=n>resolved_slots</span><span class=p>[</span><span class=n>slot_id</span><span class=p>]</span> <span class=o>=</span> <span class=n>slot_fills</span><span class=p>[</span><span class=n>slot</span><span class=o>.</span><span class=n>name</span><span class=p>]</span>
<a id=__codelineno-0-493 name=__codelineno-0-493></a> <span class=c1># Since the fill cannot include other slots, we can leave this path</span>
<a id=__codelineno-0-494 name=__codelineno-0-494></a> <span class=k>continue</span>
<a id=__codelineno-0-495 name=__codelineno-0-495></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-496 name=__codelineno-0-496></a> <span class=c1># If no, then the slot is NOT filled, and we will render the slot&#39;s default (what&#39;s</span>
<a id=__codelineno-0-497 name=__codelineno-0-497></a> <span class=c1># between the slot tags)</span>
<a id=__codelineno-0-498 name=__codelineno-0-498></a> <span class=n>resolved_slots</span><span class=p>[</span><span class=n>slot_id</span><span class=p>]</span> <span class=o>=</span> <span class=n>SlotFill</span><span class=p>(</span>
<a id=__codelineno-0-499 name=__codelineno-0-499></a> <span class=n>name</span><span class=o>=</span><span class=n>slot</span><span class=o>.</span><span class=n>name</span><span class=p>,</span>
<a id=__codelineno-0-500 name=__codelineno-0-500></a> <span class=n>escaped_name</span><span class=o>=</span><span class=n>_escape_slot_name</span><span class=p>(</span><span class=n>slot</span><span class=o>.</span><span class=n>name</span><span class=p>),</span>
<a id=__codelineno-0-501 name=__codelineno-0-501></a> <span class=n>is_filled</span><span class=o>=</span><span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-502 name=__codelineno-0-502></a> <span class=n>content_func</span><span class=o>=</span><span class=n>_nodelist_to_slot_render_func</span><span class=p>(</span><span class=n>slot</span><span class=o>.</span><span class=n>nodelist</span><span class=p>),</span>
<a id=__codelineno-0-503 name=__codelineno-0-503></a> <span class=n>context_data</span><span class=o>=</span><span class=n>context_data</span><span class=p>,</span>
<a id=__codelineno-0-504 name=__codelineno-0-504></a> <span class=n>slot_default_var</span><span class=o>=</span><span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-505 name=__codelineno-0-505></a> <span class=n>slot_data_var</span><span class=o>=</span><span class=kc>None</span><span class=p>,</span>
<a id=__codelineno-0-506 name=__codelineno-0-506></a> <span class=p>)</span>
<a id=__codelineno-0-507 name=__codelineno-0-507></a> <span class=c1># Since the slot&#39;s default CAN include other slots (because it&#39;s defined in</span>
<a id=__codelineno-0-508 name=__codelineno-0-508></a> <span class=c1># the same template), we need to enqueue the slot&#39;s children</span>
<a id=__codelineno-0-509 name=__codelineno-0-509></a> <span class=k>if</span> <span class=n>slot_id</span> <span class=ow>in</span> <span class=n>slot_children</span> <span class=ow>and</span> <span class=n>slot_children</span><span class=p>[</span><span class=n>slot_id</span><span class=p>]:</span>
<a id=__codelineno-0-510 name=__codelineno-0-510></a> <span class=n>slot_ids_queue</span><span class=o>.</span><span class=n>extend</span><span class=p>(</span><span class=n>slot_children</span><span class=p>[</span><span class=n>slot_id</span><span class=p>])</span>
<a id=__codelineno-0-511 name=__codelineno-0-511></a>
<a id=__codelineno-0-512 name=__codelineno-0-512></a> <span class=c1># By the time we get here, we should know, for each slot, how it will be rendered</span>
<a id=__codelineno-0-513 name=__codelineno-0-513></a> <span class=c1># -&gt; Whether it will be replaced with a fill, or whether we render slot&#39;s defaults.</span>
<a id=__codelineno-0-514 name=__codelineno-0-514></a> <span class=k>return</span> <span class=n>slots</span><span class=p>,</span> <span class=n>resolved_slots</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.tag_formatter class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">tag_formatter</span> <a href=#django_components.tag_formatter class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.tag_formatter.ComponentFormatter class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ComponentFormatter</span> <a href=#django_components.tag_formatter.ComponentFormatter class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>ComponentFormatter</span><span class=p>(</span><span class=n>tag</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-internal" title=django_components.tag_formatter.TagFormatterABC href=tag_formatter/#django_components.tag_formatter.TagFormatterABC>TagFormatterABC</a></code></p> <p>The original django_component's component tag formatter, it uses the <code>component</code> and <code>endcomponent</code> tags, and the component name is gives as the first positional arg.</p> <p>Example as block: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;mycomp&quot;</span> <span class=nv>abc</span><span class=o>=</span><span class=m>123</span> <span class=cp>%}</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> </span><span class=cp>{%</span> <span class=k>fill</span> <span class=s2>&quot;myfill&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> ...</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=x> </span><span class=cp>{%</span> <span class=k>endfill</span> <span class=cp>%}</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=cp>{%</span> <span class=k>endcomponent</span> <span class=cp>%}</span>
</code></pre></div></p> <p>Example as inlined tag: <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;mycomp&quot;</span> <span class=nv>abc</span><span class=o>=</span><span class=m>123</span> <span class=o>/</span> <span class=cp>%}</span>
</code></pre></div></p> <details class=quote> <summary>Source code in <code>src/django_components/tag_formatter.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-122>122</a></span>
<span class=normal><a href=#__codelineno-0-123>123</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-122 name=__codelineno-0-122></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>tag</span><span class=p>:</span> <span class=nb>str</span><span class=p>):</span>
<a id=__codelineno-0-123 name=__codelineno-0-123></a> <span class=bp>self</span><span class=o>.</span><span class=n>tag</span> <span class=o>=</span> <span class=n>tag</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.tag_formatter.InternalTagFormatter class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">InternalTagFormatter</span> <a href=#django_components.tag_formatter.InternalTagFormatter class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>InternalTagFormatter</span><span class=p>(</span><span class=n>tag_formatter</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.tag_formatter.TagFormatterABC href=tag_formatter/#django_components.tag_formatter.TagFormatterABC>TagFormatterABC</a></span><span class=p>)</span>
</code></pre></div> <div class="doc doc-contents "> <p>Internal wrapper around user-provided TagFormatters, so that we validate the outputs.</p> <details class=quote> <summary>Source code in <code>src/django_components/tag_formatter.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-69>69</a></span>
<span class=normal><a href=#__codelineno-0-70>70</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-69 name=__codelineno-0-69></a><span class=k>def</span> <span class=fm>__init__</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>tag_formatter</span><span class=p>:</span> <span class=n>TagFormatterABC</span><span class=p>):</span>
<a id=__codelineno-0-70 name=__codelineno-0-70></a> <span class=bp>self</span><span class=o>.</span><span class=n>tag_formatter</span> <span class=o>=</span> <span class=n>tag_formatter</span>
</code></pre></div></td></tr></table></div> </details> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.tag_formatter.ShorthandComponentFormatter class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">ShorthandComponentFormatter</span> <a href=#django_components.tag_formatter.ShorthandComponentFormatter class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-internal" title=django_components.tag_formatter.TagFormatterABC href=tag_formatter/#django_components.tag_formatter.TagFormatterABC>TagFormatterABC</a></code></p> <p>The component tag formatter that uses <code>&lt;name&gt;</code> / <code>end&lt;name&gt;</code> tags.</p> <p>This is similar to django-web-components and django-slippers syntax.</p> <p>Example as block: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>mycomp</span> <span class=nv>abc</span><span class=o>=</span><span class=m>123</span> <span class=cp>%}</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a><span class=x> </span><span class=cp>{%</span> <span class=k>fill</span> <span class=s2>&quot;myfill&quot;</span> <span class=cp>%}</span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=x> ...</span>
<a id=__codelineno-0-4 name=__codelineno-0-4 href=#__codelineno-0-4></a><span class=x> </span><span class=cp>{%</span> <span class=k>endfill</span> <span class=cp>%}</span>
<a id=__codelineno-0-5 name=__codelineno-0-5 href=#__codelineno-0-5></a><span class=cp>{%</span> <span class=k>endmycomp</span> <span class=cp>%}</span>
</code></pre></div></p> <p>Example as inlined tag: <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=cp>{%</span> <span class=k>mycomp</span> <span class=nv>abc</span><span class=o>=</span><span class=m>123</span> <span class=o>/</span> <span class=cp>%}</span>
</code></pre></div></p> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.tag_formatter.TagFormatterABC class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">TagFormatterABC</span> <a href=#django_components.tag_formatter.TagFormatterABC class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=abc.ABC href=https://docs.python.org/3.12/library/abc.html#abc.ABC>ABC</a></code></p> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h4 id=django_components.tag_formatter.TagFormatterABC.end_tag class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">end_tag</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small> </span> <a href=#django_components.tag_formatter.TagFormatterABC.end_tag class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>end_tag</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Formats the end tag of a block component.</p> <details class=quote> <summary>Source code in <code>src/django_components/tag_formatter.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-31>31</a></span>
<span class=normal><a href=#__codelineno-0-32>32</a></span>
<span class=normal><a href=#__codelineno-0-33>33</a></span>
<span class=normal><a href=#__codelineno-0-34>34</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-31 name=__codelineno-0-31></a><span class=nd>@abc</span><span class=o>.</span><span class=n>abstractmethod</span>
<a id=__codelineno-0-32 name=__codelineno-0-32></a><span class=k>def</span> <span class=nf>end_tag</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=nb>str</span><span class=p>:</span>
<a id=__codelineno-0-33 name=__codelineno-0-33></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Formats the end tag of a block component.&quot;&quot;&quot;</span>
<a id=__codelineno-0-34 name=__codelineno-0-34></a> <span class=o>...</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.tag_formatter.TagFormatterABC.parse class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">parse</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small> </span> <a href=#django_components.tag_formatter.TagFormatterABC.parse class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>parse</span><span class=p>(</span><span class=n>tokens</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.tag_formatter.TagResult href=tag_formatter/#django_components.tag_formatter.TagResult>TagResult</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Given the tokens (words) of a component start tag, this function extracts the component name from the tokens list, and returns <code>TagResult</code>, which is a tuple of <code>(component_name, remaining_tokens)</code>.</p> <p>Example:</p> <p>Given a component declarations:</p> <p><code>{% component "my_comp" key=val key2=val2 %}</code></p> <p>This function receives a list of tokens</p> <p><code>['component', '"my_comp"', 'key=val', 'key2=val2']</code></p> <p><code>component</code> is the tag name, which we drop. <code>"my_comp"</code> is the component name, but we must remove the extra quotes. And we pass remaining tokens unmodified, as that's the input to the component.</p> <p>So in the end, we return a tuple:</p> <p><code>('my_comp', ['key=val', 'key2=val2'])</code></p> <details class=quote> <summary>Source code in <code>src/django_components/tag_formatter.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span>
<span class=normal><a href=#__codelineno-0-41>41</a></span>
<span class=normal><a href=#__codelineno-0-42>42</a></span>
<span class=normal><a href=#__codelineno-0-43>43</a></span>
<span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span>
<span class=normal><a href=#__codelineno-0-46>46</a></span>
<span class=normal><a href=#__codelineno-0-47>47</a></span>
<span class=normal><a href=#__codelineno-0-48>48</a></span>
<span class=normal><a href=#__codelineno-0-49>49</a></span>
<span class=normal><a href=#__codelineno-0-50>50</a></span>
<span class=normal><a href=#__codelineno-0-51>51</a></span>
<span class=normal><a href=#__codelineno-0-52>52</a></span>
<span class=normal><a href=#__codelineno-0-53>53</a></span>
<span class=normal><a href=#__codelineno-0-54>54</a></span>
<span class=normal><a href=#__codelineno-0-55>55</a></span>
<span class=normal><a href=#__codelineno-0-56>56</a></span>
<span class=normal><a href=#__codelineno-0-57>57</a></span>
<span class=normal><a href=#__codelineno-0-58>58</a></span>
<span class=normal><a href=#__codelineno-0-59>59</a></span>
<span class=normal><a href=#__codelineno-0-60>60</a></span>
<span class=normal><a href=#__codelineno-0-61>61</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-36 name=__codelineno-0-36></a><span class=nd>@abc</span><span class=o>.</span><span class=n>abstractmethod</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a><span class=k>def</span> <span class=nf>parse</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>tokens</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=nb>str</span><span class=p>])</span> <span class=o>-&gt;</span> <span class=n>TagResult</span><span class=p>:</span>
<a id=__codelineno-0-38 name=__codelineno-0-38></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a><span class=sd> Given the tokens (words) of a component start tag, this function extracts</span>
<a id=__codelineno-0-40 name=__codelineno-0-40></a><span class=sd> the component name from the tokens list, and returns `TagResult`, which</span>
<a id=__codelineno-0-41 name=__codelineno-0-41></a><span class=sd> is a tuple of `(component_name, remaining_tokens)`.</span>
<a id=__codelineno-0-42 name=__codelineno-0-42></a>
<a id=__codelineno-0-43 name=__codelineno-0-43></a><span class=sd> Example:</span>
<a id=__codelineno-0-44 name=__codelineno-0-44></a>
<a id=__codelineno-0-45 name=__codelineno-0-45></a><span class=sd> Given a component declarations:</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a>
<a id=__codelineno-0-47 name=__codelineno-0-47></a><span class=sd> `{% component &quot;my_comp&quot; key=val key2=val2 %}`</span>
<a id=__codelineno-0-48 name=__codelineno-0-48></a>
<a id=__codelineno-0-49 name=__codelineno-0-49></a><span class=sd> This function receives a list of tokens</span>
<a id=__codelineno-0-50 name=__codelineno-0-50></a>
<a id=__codelineno-0-51 name=__codelineno-0-51></a><span class=sd> `[&#39;component&#39;, &#39;&quot;my_comp&quot;&#39;, &#39;key=val&#39;, &#39;key2=val2&#39;]`</span>
<a id=__codelineno-0-52 name=__codelineno-0-52></a>
<a id=__codelineno-0-53 name=__codelineno-0-53></a><span class=sd> `component` is the tag name, which we drop. `&quot;my_comp&quot;` is the component name,</span>
<a id=__codelineno-0-54 name=__codelineno-0-54></a><span class=sd> but we must remove the extra quotes. And we pass remaining tokens unmodified,</span>
<a id=__codelineno-0-55 name=__codelineno-0-55></a><span class=sd> as that&#39;s the input to the component.</span>
<a id=__codelineno-0-56 name=__codelineno-0-56></a>
<a id=__codelineno-0-57 name=__codelineno-0-57></a><span class=sd> So in the end, we return a tuple:</span>
<a id=__codelineno-0-58 name=__codelineno-0-58></a>
<a id=__codelineno-0-59 name=__codelineno-0-59></a><span class=sd> `(&#39;my_comp&#39;, [&#39;key=val&#39;, &#39;key2=val2&#39;])`</span>
<a id=__codelineno-0-60 name=__codelineno-0-60></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a> <span class=o>...</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.tag_formatter.TagFormatterABC.start_tag class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">start_tag</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small> </span> <a href=#django_components.tag_formatter.TagFormatterABC.start_tag class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>start_tag</span><span class=p>(</span><span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Formats the start tag of a component.</p> <details class=quote> <summary>Source code in <code>src/django_components/tag_formatter.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-26>26</a></span>
<span class=normal><a href=#__codelineno-0-27>27</a></span>
<span class=normal><a href=#__codelineno-0-28>28</a></span>
<span class=normal><a href=#__codelineno-0-29>29</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-26 name=__codelineno-0-26></a><span class=nd>@abc</span><span class=o>.</span><span class=n>abstractmethod</span>
<a id=__codelineno-0-27 name=__codelineno-0-27></a><span class=k>def</span> <span class=nf>start_tag</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=nb>str</span><span class=p>:</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Formats the start tag of a component.&quot;&quot;&quot;</span>
<a id=__codelineno-0-29 name=__codelineno-0-29></a> <span class=o>...</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-class"> <h3 id=django_components.tag_formatter.TagResult class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">TagResult</span> <a href=#django_components.tag_formatter.TagResult class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=typing.NamedTuple href=https://docs.python.org/3.12/library/typing.html#typing.NamedTuple>NamedTuple</a></code></p> <p>The return value from <code>TagFormatter.parse()</code></p> <div class="doc doc-children"> <div class="doc doc-object doc-attribute"> <h4 id=django_components.tag_formatter.TagResult.component_name class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">component_name</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.tag_formatter.TagResult.component_name class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>component_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Component name extracted from the template tag</p> </div> </div> <div class="doc doc-object doc-attribute"> <h4 id=django_components.tag_formatter.TagResult.tokens class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">tokens</span> <span class="doc doc-labels"> <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small> </span> <a href=#django_components.tag_formatter.TagResult.tokens class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>tokens</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Remaining tokens (words) that were passed to the tag, with component name removed</p> </div> </div> </div> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.tag_formatter.get_tag_formatter class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">get_tag_formatter</span> <a href=#django_components.tag_formatter.get_tag_formatter class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>get_tag_formatter</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.tag_formatter.InternalTagFormatter href=tag_formatter/#django_components.tag_formatter.InternalTagFormatter>InternalTagFormatter</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Returns an instance of the currently configured component tag formatter.</p> <details class=quote> <summary>Source code in <code>src/django_components/tag_formatter.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-204>204</a></span>
<span class=normal><a href=#__codelineno-0-205>205</a></span>
<span class=normal><a href=#__codelineno-0-206>206</a></span>
<span class=normal><a href=#__codelineno-0-207>207</a></span>
<span class=normal><a href=#__codelineno-0-208>208</a></span>
<span class=normal><a href=#__codelineno-0-209>209</a></span>
<span class=normal><a href=#__codelineno-0-210>210</a></span>
<span class=normal><a href=#__codelineno-0-211>211</a></span>
<span class=normal><a href=#__codelineno-0-212>212</a></span>
<span class=normal><a href=#__codelineno-0-213>213</a></span>
<span class=normal><a href=#__codelineno-0-214>214</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-204 name=__codelineno-0-204></a><span class=k>def</span> <span class=nf>get_tag_formatter</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n>InternalTagFormatter</span><span class=p>:</span>
<a id=__codelineno-0-205 name=__codelineno-0-205></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Returns an instance of the currently configured component tag formatter.&quot;&quot;&quot;</span>
<a id=__codelineno-0-206 name=__codelineno-0-206></a> <span class=c1># Allow users to configure the component TagFormatter</span>
<a id=__codelineno-0-207 name=__codelineno-0-207></a> <span class=n>formatter_cls_or_str</span> <span class=o>=</span> <span class=n>app_settings</span><span class=o>.</span><span class=n>TAG_FORMATTER</span>
<a id=__codelineno-0-208 name=__codelineno-0-208></a>
<a id=__codelineno-0-209 name=__codelineno-0-209></a> <span class=k>if</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>formatter_cls_or_str</span><span class=p>,</span> <span class=nb>str</span><span class=p>):</span>
<a id=__codelineno-0-210 name=__codelineno-0-210></a> <span class=n>tag_formatter</span><span class=p>:</span> <span class=n>TagFormatterABC</span> <span class=o>=</span> <span class=n>import_string</span><span class=p>(</span><span class=n>formatter_cls_or_str</span><span class=p>)</span>
<a id=__codelineno-0-211 name=__codelineno-0-211></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-212 name=__codelineno-0-212></a> <span class=n>tag_formatter</span> <span class=o>=</span> <span class=n>formatter_cls_or_str</span>
<a id=__codelineno-0-213 name=__codelineno-0-213></a>
<a id=__codelineno-0-214 name=__codelineno-0-214></a> <span class=k>return</span> <span class=n>InternalTagFormatter</span><span class=p>(</span><span class=n>tag_formatter</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.template_loader class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">template_loader</span> <a href=#django_components.template_loader class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p>Template loader that loads templates from each Django app's "components" directory.</p> <div class="doc doc-children"> <div class="doc doc-object doc-class"> <h3 id=django_components.template_loader.Loader class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">Loader</span> <a href=#django_components.template_loader.Loader class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <p class="doc doc-class-bases"> Bases: <code><a class="autorefs autorefs-external" title=django.template.loaders.filesystem.Loader href=https://docs.djangoproject.com/en/5.0/ref/templates/api/#django.template.loaders.filesystem.Loader>Loader</a></code></p> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h4 id=django_components.template_loader.Loader.get_dirs class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_dirs</span> <a href=#django_components.template_loader.Loader.get_dirs class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>get_dirs</span><span class=p>()</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=pathlib.Path href=https://docs.python.org/3.12/library/pathlib.html#pathlib.Path>Path</a></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Prepare directories that may contain component files:</p> <p>Searches for dirs set in <code>STATICFILES_DIRS</code> settings. If none set, defaults to searching for a "components" app. The dirs in <code>STATICFILES_DIRS</code> must be absolute paths.</p> <p>Paths are accepted only if they resolve to a directory. E.g. <code>/path/to/django_project/my_app/components/</code>.</p> <p>If <code>STATICFILES_DIRS</code> is not set or empty, then <code>BASE_DIR</code> is required.</p> <details class=quote> <summary>Source code in <code>src/django_components/template_loader.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-15>15</a></span>
<span class=normal><a href=#__codelineno-0-16>16</a></span>
<span class=normal><a href=#__codelineno-0-17>17</a></span>
<span class=normal><a href=#__codelineno-0-18>18</a></span>
<span class=normal><a href=#__codelineno-0-19>19</a></span>
<span class=normal><a href=#__codelineno-0-20>20</a></span>
<span class=normal><a href=#__codelineno-0-21>21</a></span>
<span class=normal><a href=#__codelineno-0-22>22</a></span>
<span class=normal><a href=#__codelineno-0-23>23</a></span>
<span class=normal><a href=#__codelineno-0-24>24</a></span>
<span class=normal><a href=#__codelineno-0-25>25</a></span>
<span class=normal><a href=#__codelineno-0-26>26</a></span>
<span class=normal><a href=#__codelineno-0-27>27</a></span>
<span class=normal><a href=#__codelineno-0-28>28</a></span>
<span class=normal><a href=#__codelineno-0-29>29</a></span>
<span class=normal><a href=#__codelineno-0-30>30</a></span>
<span class=normal><a href=#__codelineno-0-31>31</a></span>
<span class=normal><a href=#__codelineno-0-32>32</a></span>
<span class=normal><a href=#__codelineno-0-33>33</a></span>
<span class=normal><a href=#__codelineno-0-34>34</a></span>
<span class=normal><a href=#__codelineno-0-35>35</a></span>
<span class=normal><a href=#__codelineno-0-36>36</a></span>
<span class=normal><a href=#__codelineno-0-37>37</a></span>
<span class=normal><a href=#__codelineno-0-38>38</a></span>
<span class=normal><a href=#__codelineno-0-39>39</a></span>
<span class=normal><a href=#__codelineno-0-40>40</a></span>
<span class=normal><a href=#__codelineno-0-41>41</a></span>
<span class=normal><a href=#__codelineno-0-42>42</a></span>
<span class=normal><a href=#__codelineno-0-43>43</a></span>
<span class=normal><a href=#__codelineno-0-44>44</a></span>
<span class=normal><a href=#__codelineno-0-45>45</a></span>
<span class=normal><a href=#__codelineno-0-46>46</a></span>
<span class=normal><a href=#__codelineno-0-47>47</a></span>
<span class=normal><a href=#__codelineno-0-48>48</a></span>
<span class=normal><a href=#__codelineno-0-49>49</a></span>
<span class=normal><a href=#__codelineno-0-50>50</a></span>
<span class=normal><a href=#__codelineno-0-51>51</a></span>
<span class=normal><a href=#__codelineno-0-52>52</a></span>
<span class=normal><a href=#__codelineno-0-53>53</a></span>
<span class=normal><a href=#__codelineno-0-54>54</a></span>
<span class=normal><a href=#__codelineno-0-55>55</a></span>
<span class=normal><a href=#__codelineno-0-56>56</a></span>
<span class=normal><a href=#__codelineno-0-57>57</a></span>
<span class=normal><a href=#__codelineno-0-58>58</a></span>
<span class=normal><a href=#__codelineno-0-59>59</a></span>
<span class=normal><a href=#__codelineno-0-60>60</a></span>
<span class=normal><a href=#__codelineno-0-61>61</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-15 name=__codelineno-0-15></a><span class=k>def</span> <span class=nf>get_dirs</span><span class=p>(</span><span class=bp>self</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>List</span><span class=p>[</span><span class=n>Path</span><span class=p>]:</span>
<a id=__codelineno-0-16 name=__codelineno-0-16></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-17 name=__codelineno-0-17></a><span class=sd> Prepare directories that may contain component files:</span>
<a id=__codelineno-0-18 name=__codelineno-0-18></a>
<a id=__codelineno-0-19 name=__codelineno-0-19></a><span class=sd> Searches for dirs set in `STATICFILES_DIRS` settings. If none set, defaults to searching</span>
<a id=__codelineno-0-20 name=__codelineno-0-20></a><span class=sd> for a &quot;components&quot; app. The dirs in `STATICFILES_DIRS` must be absolute paths.</span>
<a id=__codelineno-0-21 name=__codelineno-0-21></a>
<a id=__codelineno-0-22 name=__codelineno-0-22></a><span class=sd> Paths are accepted only if they resolve to a directory.</span>
<a id=__codelineno-0-23 name=__codelineno-0-23></a><span class=sd> E.g. `/path/to/django_project/my_app/components/`.</span>
<a id=__codelineno-0-24 name=__codelineno-0-24></a>
<a id=__codelineno-0-25 name=__codelineno-0-25></a><span class=sd> If `STATICFILES_DIRS` is not set or empty, then `BASE_DIR` is required.</span>
<a id=__codelineno-0-26 name=__codelineno-0-26></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-27 name=__codelineno-0-27></a> <span class=c1># Allow to configure from settings which dirs should be checked for components</span>
<a id=__codelineno-0-28 name=__codelineno-0-28></a> <span class=k>if</span> <span class=nb>hasattr</span><span class=p>(</span><span class=n>settings</span><span class=p>,</span> <span class=s2>&quot;STATICFILES_DIRS&quot;</span><span class=p>)</span> <span class=ow>and</span> <span class=n>settings</span><span class=o>.</span><span class=n>STATICFILES_DIRS</span><span class=p>:</span>
<a id=__codelineno-0-29 name=__codelineno-0-29></a> <span class=n>component_dirs</span> <span class=o>=</span> <span class=n>settings</span><span class=o>.</span><span class=n>STATICFILES_DIRS</span>
<a id=__codelineno-0-30 name=__codelineno-0-30></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-31 name=__codelineno-0-31></a> <span class=n>component_dirs</span> <span class=o>=</span> <span class=p>[</span><span class=n>settings</span><span class=o>.</span><span class=n>BASE_DIR</span> <span class=o>/</span> <span class=s2>&quot;components&quot;</span><span class=p>]</span>
<a id=__codelineno-0-32 name=__codelineno-0-32></a>
<a id=__codelineno-0-33 name=__codelineno-0-33></a> <span class=n>logger</span><span class=o>.</span><span class=n>debug</span><span class=p>(</span>
<a id=__codelineno-0-34 name=__codelineno-0-34></a> <span class=s2>&quot;Template loader will search for valid template dirs from following options:</span><span class=se>\n</span><span class=s2>&quot;</span>
<a id=__codelineno-0-35 name=__codelineno-0-35></a> <span class=o>+</span> <span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>([</span><span class=sa>f</span><span class=s2>&quot; - </span><span class=si>{</span><span class=nb>str</span><span class=p>(</span><span class=n>d</span><span class=p>)</span><span class=si>}</span><span class=s2>&quot;</span> <span class=k>for</span> <span class=n>d</span> <span class=ow>in</span> <span class=n>component_dirs</span><span class=p>])</span>
<a id=__codelineno-0-36 name=__codelineno-0-36></a> <span class=p>)</span>
<a id=__codelineno-0-37 name=__codelineno-0-37></a>
<a id=__codelineno-0-38 name=__codelineno-0-38></a> <span class=n>directories</span><span class=p>:</span> <span class=n>Set</span><span class=p>[</span><span class=n>Path</span><span class=p>]</span> <span class=o>=</span> <span class=nb>set</span><span class=p>()</span>
<a id=__codelineno-0-39 name=__codelineno-0-39></a> <span class=k>for</span> <span class=n>component_dir</span> <span class=ow>in</span> <span class=n>component_dirs</span><span class=p>:</span>
<a id=__codelineno-0-40 name=__codelineno-0-40></a> <span class=c1># Consider tuples for STATICFILES_DIRS (See #489)</span>
<a id=__codelineno-0-41 name=__codelineno-0-41></a> <span class=c1># See https://docs.djangoproject.com/en/5.0/ref/settings/#prefixes-optional</span>
<a id=__codelineno-0-42 name=__codelineno-0-42></a> <span class=k>if</span> <span class=nb>isinstance</span><span class=p>(</span><span class=n>component_dir</span><span class=p>,</span> <span class=p>(</span><span class=nb>tuple</span><span class=p>,</span> <span class=nb>list</span><span class=p>))</span> <span class=ow>and</span> <span class=nb>len</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span> <span class=o>==</span> <span class=mi>2</span><span class=p>:</span>
<a id=__codelineno-0-43 name=__codelineno-0-43></a> <span class=n>component_dir</span> <span class=o>=</span> <span class=n>component_dir</span><span class=p>[</span><span class=mi>1</span><span class=p>]</span>
<a id=__codelineno-0-44 name=__codelineno-0-44></a> <span class=k>try</span><span class=p>:</span>
<a id=__codelineno-0-45 name=__codelineno-0-45></a> <span class=n>Path</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span>
<a id=__codelineno-0-46 name=__codelineno-0-46></a> <span class=k>except</span> <span class=ne>TypeError</span><span class=p>:</span>
<a id=__codelineno-0-47 name=__codelineno-0-47></a> <span class=n>logger</span><span class=o>.</span><span class=n>warning</span><span class=p>(</span>
<a id=__codelineno-0-48 name=__codelineno-0-48></a> <span class=sa>f</span><span class=s2>&quot;STATICFILES_DIRS expected str, bytes or os.PathLike object, or tuple/list of length 2. &quot;</span>
<a id=__codelineno-0-49 name=__codelineno-0-49></a> <span class=sa>f</span><span class=s2>&quot;See Django documentation. Got </span><span class=si>{</span><span class=nb>type</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span><span class=si>}</span><span class=s2> : </span><span class=si>{</span><span class=n>component_dir</span><span class=si>}</span><span class=s2>&quot;</span>
<a id=__codelineno-0-50 name=__codelineno-0-50></a> <span class=p>)</span>
<a id=__codelineno-0-51 name=__codelineno-0-51></a> <span class=k>continue</span>
<a id=__codelineno-0-52 name=__codelineno-0-52></a>
<a id=__codelineno-0-53 name=__codelineno-0-53></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>Path</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span><span class=o>.</span><span class=n>is_absolute</span><span class=p>():</span>
<a id=__codelineno-0-54 name=__codelineno-0-54></a> <span class=k>raise</span> <span class=ne>ValueError</span><span class=p>(</span><span class=sa>f</span><span class=s2>&quot;STATICFILES_DIRS must contain absolute paths, got &#39;</span><span class=si>{</span><span class=n>component_dir</span><span class=si>}</span><span class=s2>&#39;&quot;</span><span class=p>)</span>
<a id=__codelineno-0-55 name=__codelineno-0-55></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-56 name=__codelineno-0-56></a> <span class=n>directories</span><span class=o>.</span><span class=n>add</span><span class=p>(</span><span class=n>Path</span><span class=p>(</span><span class=n>component_dir</span><span class=p>)</span><span class=o>.</span><span class=n>resolve</span><span class=p>())</span>
<a id=__codelineno-0-57 name=__codelineno-0-57></a>
<a id=__codelineno-0-58 name=__codelineno-0-58></a> <span class=n>logger</span><span class=o>.</span><span class=n>debug</span><span class=p>(</span>
<a id=__codelineno-0-59 name=__codelineno-0-59></a> <span class=s2>&quot;Template loader matched following template dirs:</span><span class=se>\n</span><span class=s2>&quot;</span> <span class=o>+</span> <span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>([</span><span class=sa>f</span><span class=s2>&quot; - </span><span class=si>{</span><span class=nb>str</span><span class=p>(</span><span class=n>d</span><span class=p>)</span><span class=si>}</span><span class=s2>&quot;</span> <span class=k>for</span> <span class=n>d</span> <span class=ow>in</span> <span class=n>directories</span><span class=p>])</span>
<a id=__codelineno-0-60 name=__codelineno-0-60></a> <span class=p>)</span>
<a id=__codelineno-0-61 name=__codelineno-0-61></a> <span class=k>return</span> <span class=nb>list</span><span class=p>(</span><span class=n>directories</span><span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.template_parser class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">template_parser</span> <a href=#django_components.template_parser class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p>Overrides for the Django Template system to allow finer control over template parsing.</p> <p>Based on Django Slippers v0.6.2 - <a href=https://github.com/mixxorz/slippers/blob/main/slippers/template.py>https://github.com/mixxorz/slippers/blob/main/slippers/template.py</a></p> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.template_parser.parse_bits class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">parse_bits</span> <a href=#django_components.template_parser.parse_bits class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>parse_bits</span><span class=p>(</span>
<a id=__codelineno-0-2 name=__codelineno-0-2 href=#__codelineno-0-2></a> <span class=n>parser</span><span class=p>:</span> <span class=n><span title=django.template.base.Parser>Parser</span></span><span class=p>,</span> <span class=n>bits</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>],</span> <span class=n>params</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>],</span> <span class=n>name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
<a id=__codelineno-0-3 name=__codelineno-0-3 href=#__codelineno-0-3></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Tuple href=https://docs.python.org/3.12/library/typing.html#typing.Tuple>Tuple</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><span title=django.template.base.FilterExpression>FilterExpression</span></span><span class=p>],</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" title=typing.Tuple href=https://docs.python.org/3.12/library/typing.html#typing.Tuple>Tuple</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><span title=django.template.base.FilterExpression>FilterExpression</span></span><span class=p>]]]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Parse bits for template tag helpers simple_tag and inclusion_tag, in particular by detecting syntax errors and by extracting positional and keyword arguments.</p> <p>This is a simplified version of <code>django.template.library.parse_bits</code> where we use custom regex to handle special characters in keyword names.</p> <p>Furthermore, our version allows duplicate keys, and instead of return kwargs as a dict, we return it as a list of key-value pairs. So it is up to the user of this function to decide whether they support duplicate keys or not.</p> <details class=quote> <summary>Source code in <code>src/django_components/template_parser.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-155>155</a></span>
<span class=normal><a href=#__codelineno-0-156>156</a></span>
<span class=normal><a href=#__codelineno-0-157>157</a></span>
<span class=normal><a href=#__codelineno-0-158>158</a></span>
<span class=normal><a href=#__codelineno-0-159>159</a></span>
<span class=normal><a href=#__codelineno-0-160>160</a></span>
<span class=normal><a href=#__codelineno-0-161>161</a></span>
<span class=normal><a href=#__codelineno-0-162>162</a></span>
<span class=normal><a href=#__codelineno-0-163>163</a></span>
<span class=normal><a href=#__codelineno-0-164>164</a></span>
<span class=normal><a href=#__codelineno-0-165>165</a></span>
<span class=normal><a href=#__codelineno-0-166>166</a></span>
<span class=normal><a href=#__codelineno-0-167>167</a></span>
<span class=normal><a href=#__codelineno-0-168>168</a></span>
<span class=normal><a href=#__codelineno-0-169>169</a></span>
<span class=normal><a href=#__codelineno-0-170>170</a></span>
<span class=normal><a href=#__codelineno-0-171>171</a></span>
<span class=normal><a href=#__codelineno-0-172>172</a></span>
<span class=normal><a href=#__codelineno-0-173>173</a></span>
<span class=normal><a href=#__codelineno-0-174>174</a></span>
<span class=normal><a href=#__codelineno-0-175>175</a></span>
<span class=normal><a href=#__codelineno-0-176>176</a></span>
<span class=normal><a href=#__codelineno-0-177>177</a></span>
<span class=normal><a href=#__codelineno-0-178>178</a></span>
<span class=normal><a href=#__codelineno-0-179>179</a></span>
<span class=normal><a href=#__codelineno-0-180>180</a></span>
<span class=normal><a href=#__codelineno-0-181>181</a></span>
<span class=normal><a href=#__codelineno-0-182>182</a></span>
<span class=normal><a href=#__codelineno-0-183>183</a></span>
<span class=normal><a href=#__codelineno-0-184>184</a></span>
<span class=normal><a href=#__codelineno-0-185>185</a></span>
<span class=normal><a href=#__codelineno-0-186>186</a></span>
<span class=normal><a href=#__codelineno-0-187>187</a></span>
<span class=normal><a href=#__codelineno-0-188>188</a></span>
<span class=normal><a href=#__codelineno-0-189>189</a></span>
<span class=normal><a href=#__codelineno-0-190>190</a></span>
<span class=normal><a href=#__codelineno-0-191>191</a></span>
<span class=normal><a href=#__codelineno-0-192>192</a></span>
<span class=normal><a href=#__codelineno-0-193>193</a></span>
<span class=normal><a href=#__codelineno-0-194>194</a></span>
<span class=normal><a href=#__codelineno-0-195>195</a></span>
<span class=normal><a href=#__codelineno-0-196>196</a></span>
<span class=normal><a href=#__codelineno-0-197>197</a></span>
<span class=normal><a href=#__codelineno-0-198>198</a></span>
<span class=normal><a href=#__codelineno-0-199>199</a></span>
<span class=normal><a href=#__codelineno-0-200>200</a></span>
<span class=normal><a href=#__codelineno-0-201>201</a></span>
<span class=normal><a href=#__codelineno-0-202>202</a></span>
<span class=normal><a href=#__codelineno-0-203>203</a></span>
<span class=normal><a href=#__codelineno-0-204>204</a></span>
<span class=normal><a href=#__codelineno-0-205>205</a></span>
<span class=normal><a href=#__codelineno-0-206>206</a></span>
<span class=normal><a href=#__codelineno-0-207>207</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-155 name=__codelineno-0-155></a><span class=k>def</span> <span class=nf>parse_bits</span><span class=p>(</span>
<a id=__codelineno-0-156 name=__codelineno-0-156></a> <span class=n>parser</span><span class=p>:</span> <span class=n>Parser</span><span class=p>,</span>
<a id=__codelineno-0-157 name=__codelineno-0-157></a> <span class=n>bits</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=nb>str</span><span class=p>],</span>
<a id=__codelineno-0-158 name=__codelineno-0-158></a> <span class=n>params</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=nb>str</span><span class=p>],</span>
<a id=__codelineno-0-159 name=__codelineno-0-159></a> <span class=n>name</span><span class=p>:</span> <span class=nb>str</span><span class=p>,</span>
<a id=__codelineno-0-160 name=__codelineno-0-160></a><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Tuple</span><span class=p>[</span><span class=n>List</span><span class=p>[</span><span class=n>FilterExpression</span><span class=p>],</span> <span class=n>List</span><span class=p>[</span><span class=n>Tuple</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>FilterExpression</span><span class=p>]]]:</span>
<a id=__codelineno-0-161 name=__codelineno-0-161></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-162 name=__codelineno-0-162></a><span class=sd> Parse bits for template tag helpers simple_tag and inclusion_tag, in</span>
<a id=__codelineno-0-163 name=__codelineno-0-163></a><span class=sd> particular by detecting syntax errors and by extracting positional and</span>
<a id=__codelineno-0-164 name=__codelineno-0-164></a><span class=sd> keyword arguments.</span>
<a id=__codelineno-0-165 name=__codelineno-0-165></a>
<a id=__codelineno-0-166 name=__codelineno-0-166></a><span class=sd> This is a simplified version of `django.template.library.parse_bits`</span>
<a id=__codelineno-0-167 name=__codelineno-0-167></a><span class=sd> where we use custom regex to handle special characters in keyword names.</span>
<a id=__codelineno-0-168 name=__codelineno-0-168></a>
<a id=__codelineno-0-169 name=__codelineno-0-169></a><span class=sd> Furthermore, our version allows duplicate keys, and instead of return kwargs</span>
<a id=__codelineno-0-170 name=__codelineno-0-170></a><span class=sd> as a dict, we return it as a list of key-value pairs. So it is up to the</span>
<a id=__codelineno-0-171 name=__codelineno-0-171></a><span class=sd> user of this function to decide whether they support duplicate keys or not.</span>
<a id=__codelineno-0-172 name=__codelineno-0-172></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-173 name=__codelineno-0-173></a> <span class=n>args</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>FilterExpression</span><span class=p>]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-174 name=__codelineno-0-174></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=n>Tuple</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>FilterExpression</span><span class=p>]]</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-175 name=__codelineno-0-175></a> <span class=n>unhandled_params</span> <span class=o>=</span> <span class=nb>list</span><span class=p>(</span><span class=n>params</span><span class=p>)</span>
<a id=__codelineno-0-176 name=__codelineno-0-176></a> <span class=k>for</span> <span class=n>bit</span> <span class=ow>in</span> <span class=n>bits</span><span class=p>:</span>
<a id=__codelineno-0-177 name=__codelineno-0-177></a> <span class=c1># First we try to extract a potential kwarg from the bit</span>
<a id=__codelineno-0-178 name=__codelineno-0-178></a> <span class=n>kwarg</span> <span class=o>=</span> <span class=n>token_kwargs</span><span class=p>([</span><span class=n>bit</span><span class=p>],</span> <span class=n>parser</span><span class=p>)</span>
<a id=__codelineno-0-179 name=__codelineno-0-179></a> <span class=k>if</span> <span class=n>kwarg</span><span class=p>:</span>
<a id=__codelineno-0-180 name=__codelineno-0-180></a> <span class=c1># The kwarg was successfully extracted</span>
<a id=__codelineno-0-181 name=__codelineno-0-181></a> <span class=n>param</span><span class=p>,</span> <span class=n>value</span> <span class=o>=</span> <span class=n>kwarg</span><span class=o>.</span><span class=n>popitem</span><span class=p>()</span>
<a id=__codelineno-0-182 name=__codelineno-0-182></a> <span class=c1># All good, record the keyword argument</span>
<a id=__codelineno-0-183 name=__codelineno-0-183></a> <span class=n>kwargs</span><span class=o>.</span><span class=n>append</span><span class=p>((</span><span class=nb>str</span><span class=p>(</span><span class=n>param</span><span class=p>),</span> <span class=n>value</span><span class=p>))</span>
<a id=__codelineno-0-184 name=__codelineno-0-184></a> <span class=k>if</span> <span class=n>param</span> <span class=ow>in</span> <span class=n>unhandled_params</span><span class=p>:</span>
<a id=__codelineno-0-185 name=__codelineno-0-185></a> <span class=c1># If using the keyword syntax for a positional arg, then</span>
<a id=__codelineno-0-186 name=__codelineno-0-186></a> <span class=c1># consume it.</span>
<a id=__codelineno-0-187 name=__codelineno-0-187></a> <span class=n>unhandled_params</span><span class=o>.</span><span class=n>remove</span><span class=p>(</span><span class=n>param</span><span class=p>)</span>
<a id=__codelineno-0-188 name=__codelineno-0-188></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-189 name=__codelineno-0-189></a> <span class=k>if</span> <span class=n>kwargs</span><span class=p>:</span>
<a id=__codelineno-0-190 name=__codelineno-0-190></a> <span class=k>raise</span> <span class=n>TemplateSyntaxError</span><span class=p>(</span>
<a id=__codelineno-0-191 name=__codelineno-0-191></a> <span class=s2>&quot;&#39;</span><span class=si>%s</span><span class=s2>&#39; received some positional argument(s) after some &quot;</span> <span class=s2>&quot;keyword argument(s)&quot;</span> <span class=o>%</span> <span class=n>name</span>
<a id=__codelineno-0-192 name=__codelineno-0-192></a> <span class=p>)</span>
<a id=__codelineno-0-193 name=__codelineno-0-193></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-194 name=__codelineno-0-194></a> <span class=c1># Record the positional argument</span>
<a id=__codelineno-0-195 name=__codelineno-0-195></a> <span class=n>args</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>parser</span><span class=o>.</span><span class=n>compile_filter</span><span class=p>(</span><span class=n>bit</span><span class=p>))</span>
<a id=__codelineno-0-196 name=__codelineno-0-196></a> <span class=k>try</span><span class=p>:</span>
<a id=__codelineno-0-197 name=__codelineno-0-197></a> <span class=c1># Consume from the list of expected positional arguments</span>
<a id=__codelineno-0-198 name=__codelineno-0-198></a> <span class=n>unhandled_params</span><span class=o>.</span><span class=n>pop</span><span class=p>(</span><span class=mi>0</span><span class=p>)</span>
<a id=__codelineno-0-199 name=__codelineno-0-199></a> <span class=k>except</span> <span class=ne>IndexError</span><span class=p>:</span>
<a id=__codelineno-0-200 name=__codelineno-0-200></a> <span class=k>pass</span>
<a id=__codelineno-0-201 name=__codelineno-0-201></a> <span class=k>if</span> <span class=n>unhandled_params</span><span class=p>:</span>
<a id=__codelineno-0-202 name=__codelineno-0-202></a> <span class=c1># Some positional arguments were not supplied</span>
<a id=__codelineno-0-203 name=__codelineno-0-203></a> <span class=k>raise</span> <span class=n>TemplateSyntaxError</span><span class=p>(</span>
<a id=__codelineno-0-204 name=__codelineno-0-204></a> <span class=s2>&quot;&#39;</span><span class=si>%s</span><span class=s2>&#39; did not receive value(s) for the argument(s): </span><span class=si>%s</span><span class=s2>&quot;</span>
<a id=__codelineno-0-205 name=__codelineno-0-205></a> <span class=o>%</span> <span class=p>(</span><span class=n>name</span><span class=p>,</span> <span class=s2>&quot;, &quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=s2>&quot;&#39;</span><span class=si>%s</span><span class=s2>&#39;&quot;</span> <span class=o>%</span> <span class=n>p</span> <span class=k>for</span> <span class=n>p</span> <span class=ow>in</span> <span class=n>unhandled_params</span><span class=p>))</span>
<a id=__codelineno-0-206 name=__codelineno-0-206></a> <span class=p>)</span>
<a id=__codelineno-0-207 name=__codelineno-0-207></a> <span class=k>return</span> <span class=n>args</span><span class=p>,</span> <span class=n>kwargs</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h3 id=django_components.template_parser.token_kwargs class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">token_kwargs</span> <a href=#django_components.template_parser.token_kwargs class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>token_kwargs</span><span class=p>(</span><span class=n>bits</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" title=typing.List href=https://docs.python.org/3.12/library/typing.html#typing.List>List</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>],</span> <span class=n>parser</span><span class=p>:</span> <span class=n><span title=django.template.base.Parser>Parser</span></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=typing.Dict href=https://docs.python.org/3.12/library/typing.html#typing.Dict>Dict</a></span><span class=p>[</span><span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>,</span> <span class=n><span title=django.template.base.FilterExpression>FilterExpression</span></span><span class=p>]</span>
</code></pre></div> <div class="doc doc-contents "> <p>Parse token keyword arguments and return a dictionary of the arguments retrieved from the <code>bits</code> token list.</p> <p><code>bits</code> is a list containing the remainder of the token (split by spaces) that is to be checked for arguments. Valid arguments are removed from this list.</p> <p>There is no requirement for all remaining token <code>bits</code> to be keyword arguments, so return the dictionary as soon as an invalid argument format is reached.</p> <details class=quote> <summary>Source code in <code>src/django_components/template_parser.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-111>111</a></span>
<span class=normal><a href=#__codelineno-0-112>112</a></span>
<span class=normal><a href=#__codelineno-0-113>113</a></span>
<span class=normal><a href=#__codelineno-0-114>114</a></span>
<span class=normal><a href=#__codelineno-0-115>115</a></span>
<span class=normal><a href=#__codelineno-0-116>116</a></span>
<span class=normal><a href=#__codelineno-0-117>117</a></span>
<span class=normal><a href=#__codelineno-0-118>118</a></span>
<span class=normal><a href=#__codelineno-0-119>119</a></span>
<span class=normal><a href=#__codelineno-0-120>120</a></span>
<span class=normal><a href=#__codelineno-0-121>121</a></span>
<span class=normal><a href=#__codelineno-0-122>122</a></span>
<span class=normal><a href=#__codelineno-0-123>123</a></span>
<span class=normal><a href=#__codelineno-0-124>124</a></span>
<span class=normal><a href=#__codelineno-0-125>125</a></span>
<span class=normal><a href=#__codelineno-0-126>126</a></span>
<span class=normal><a href=#__codelineno-0-127>127</a></span>
<span class=normal><a href=#__codelineno-0-128>128</a></span>
<span class=normal><a href=#__codelineno-0-129>129</a></span>
<span class=normal><a href=#__codelineno-0-130>130</a></span>
<span class=normal><a href=#__codelineno-0-131>131</a></span>
<span class=normal><a href=#__codelineno-0-132>132</a></span>
<span class=normal><a href=#__codelineno-0-133>133</a></span>
<span class=normal><a href=#__codelineno-0-134>134</a></span>
<span class=normal><a href=#__codelineno-0-135>135</a></span>
<span class=normal><a href=#__codelineno-0-136>136</a></span>
<span class=normal><a href=#__codelineno-0-137>137</a></span>
<span class=normal><a href=#__codelineno-0-138>138</a></span>
<span class=normal><a href=#__codelineno-0-139>139</a></span>
<span class=normal><a href=#__codelineno-0-140>140</a></span>
<span class=normal><a href=#__codelineno-0-141>141</a></span>
<span class=normal><a href=#__codelineno-0-142>142</a></span>
<span class=normal><a href=#__codelineno-0-143>143</a></span>
<span class=normal><a href=#__codelineno-0-144>144</a></span>
<span class=normal><a href=#__codelineno-0-145>145</a></span>
<span class=normal><a href=#__codelineno-0-146>146</a></span>
<span class=normal><a href=#__codelineno-0-147>147</a></span>
<span class=normal><a href=#__codelineno-0-148>148</a></span>
<span class=normal><a href=#__codelineno-0-149>149</a></span>
<span class=normal><a href=#__codelineno-0-150>150</a></span>
<span class=normal><a href=#__codelineno-0-151>151</a></span>
<span class=normal><a href=#__codelineno-0-152>152</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-111 name=__codelineno-0-111></a><span class=k>def</span> <span class=nf>token_kwargs</span><span class=p>(</span><span class=n>bits</span><span class=p>:</span> <span class=n>List</span><span class=p>[</span><span class=nb>str</span><span class=p>],</span> <span class=n>parser</span><span class=p>:</span> <span class=n>Parser</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>FilterExpression</span><span class=p>]:</span>
<a id=__codelineno-0-112 name=__codelineno-0-112></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-113 name=__codelineno-0-113></a><span class=sd> Parse token keyword arguments and return a dictionary of the arguments</span>
<a id=__codelineno-0-114 name=__codelineno-0-114></a><span class=sd> retrieved from the ``bits`` token list.</span>
<a id=__codelineno-0-115 name=__codelineno-0-115></a>
<a id=__codelineno-0-116 name=__codelineno-0-116></a><span class=sd> `bits` is a list containing the remainder of the token (split by spaces)</span>
<a id=__codelineno-0-117 name=__codelineno-0-117></a><span class=sd> that is to be checked for arguments. Valid arguments are removed from this</span>
<a id=__codelineno-0-118 name=__codelineno-0-118></a><span class=sd> list.</span>
<a id=__codelineno-0-119 name=__codelineno-0-119></a>
<a id=__codelineno-0-120 name=__codelineno-0-120></a><span class=sd> There is no requirement for all remaining token ``bits`` to be keyword</span>
<a id=__codelineno-0-121 name=__codelineno-0-121></a><span class=sd> arguments, so return the dictionary as soon as an invalid argument format</span>
<a id=__codelineno-0-122 name=__codelineno-0-122></a><span class=sd> is reached.</span>
<a id=__codelineno-0-123 name=__codelineno-0-123></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-124 name=__codelineno-0-124></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>bits</span><span class=p>:</span>
<a id=__codelineno-0-125 name=__codelineno-0-125></a> <span class=k>return</span> <span class=p>{}</span>
<a id=__codelineno-0-126 name=__codelineno-0-126></a> <span class=n>match</span> <span class=o>=</span> <span class=n>kwarg_re</span><span class=o>.</span><span class=n>match</span><span class=p>(</span><span class=n>bits</span><span class=p>[</span><span class=mi>0</span><span class=p>])</span>
<a id=__codelineno-0-127 name=__codelineno-0-127></a> <span class=n>kwarg_format</span> <span class=o>=</span> <span class=n>match</span> <span class=ow>and</span> <span class=n>match</span><span class=p>[</span><span class=mi>1</span><span class=p>]</span>
<a id=__codelineno-0-128 name=__codelineno-0-128></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>kwarg_format</span><span class=p>:</span>
<a id=__codelineno-0-129 name=__codelineno-0-129></a> <span class=k>return</span> <span class=p>{}</span>
<a id=__codelineno-0-130 name=__codelineno-0-130></a>
<a id=__codelineno-0-131 name=__codelineno-0-131></a> <span class=n>kwargs</span><span class=p>:</span> <span class=n>Dict</span><span class=p>[</span><span class=nb>str</span><span class=p>,</span> <span class=n>FilterExpression</span><span class=p>]</span> <span class=o>=</span> <span class=p>{}</span>
<a id=__codelineno-0-132 name=__codelineno-0-132></a> <span class=k>while</span> <span class=n>bits</span><span class=p>:</span>
<a id=__codelineno-0-133 name=__codelineno-0-133></a> <span class=k>if</span> <span class=n>kwarg_format</span><span class=p>:</span>
<a id=__codelineno-0-134 name=__codelineno-0-134></a> <span class=n>match</span> <span class=o>=</span> <span class=n>kwarg_re</span><span class=o>.</span><span class=n>match</span><span class=p>(</span><span class=n>bits</span><span class=p>[</span><span class=mi>0</span><span class=p>])</span>
<a id=__codelineno-0-135 name=__codelineno-0-135></a> <span class=k>if</span> <span class=ow>not</span> <span class=n>match</span> <span class=ow>or</span> <span class=ow>not</span> <span class=n>match</span><span class=p>[</span><span class=mi>1</span><span class=p>]:</span>
<a id=__codelineno-0-136 name=__codelineno-0-136></a> <span class=k>return</span> <span class=n>kwargs</span>
<a id=__codelineno-0-137 name=__codelineno-0-137></a> <span class=n>key</span><span class=p>,</span> <span class=n>value</span> <span class=o>=</span> <span class=n>match</span><span class=o>.</span><span class=n>groups</span><span class=p>()</span>
<a id=__codelineno-0-138 name=__codelineno-0-138></a> <span class=k>del</span> <span class=n>bits</span><span class=p>[:</span><span class=mi>1</span><span class=p>]</span>
<a id=__codelineno-0-139 name=__codelineno-0-139></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-140 name=__codelineno-0-140></a> <span class=k>if</span> <span class=nb>len</span><span class=p>(</span><span class=n>bits</span><span class=p>)</span> <span class=o>&lt;</span> <span class=mi>3</span> <span class=ow>or</span> <span class=n>bits</span><span class=p>[</span><span class=mi>1</span><span class=p>]</span> <span class=o>!=</span> <span class=s2>&quot;as&quot;</span><span class=p>:</span>
<a id=__codelineno-0-141 name=__codelineno-0-141></a> <span class=k>return</span> <span class=n>kwargs</span>
<a id=__codelineno-0-142 name=__codelineno-0-142></a> <span class=n>key</span><span class=p>,</span> <span class=n>value</span> <span class=o>=</span> <span class=n>bits</span><span class=p>[</span><span class=mi>2</span><span class=p>],</span> <span class=n>bits</span><span class=p>[</span><span class=mi>0</span><span class=p>]</span>
<a id=__codelineno-0-143 name=__codelineno-0-143></a> <span class=k>del</span> <span class=n>bits</span><span class=p>[:</span><span class=mi>3</span><span class=p>]</span>
<a id=__codelineno-0-144 name=__codelineno-0-144></a>
<a id=__codelineno-0-145 name=__codelineno-0-145></a> <span class=c1># This is the only difference from the original token_kwargs. We use</span>
<a id=__codelineno-0-146 name=__codelineno-0-146></a> <span class=c1># the ComponentsFilterExpression instead of the original FilterExpression.</span>
<a id=__codelineno-0-147 name=__codelineno-0-147></a> <span class=n>kwargs</span><span class=p>[</span><span class=n>key</span><span class=p>]</span> <span class=o>=</span> <span class=n>ComponentsFilterExpression</span><span class=p>(</span><span class=n>value</span><span class=p>,</span> <span class=n>parser</span><span class=p>)</span>
<a id=__codelineno-0-148 name=__codelineno-0-148></a> <span class=k>if</span> <span class=n>bits</span> <span class=ow>and</span> <span class=ow>not</span> <span class=n>kwarg_format</span><span class=p>:</span>
<a id=__codelineno-0-149 name=__codelineno-0-149></a> <span class=k>if</span> <span class=n>bits</span><span class=p>[</span><span class=mi>0</span><span class=p>]</span> <span class=o>!=</span> <span class=s2>&quot;and&quot;</span><span class=p>:</span>
<a id=__codelineno-0-150 name=__codelineno-0-150></a> <span class=k>return</span> <span class=n>kwargs</span>
<a id=__codelineno-0-151 name=__codelineno-0-151></a> <span class=k>del</span> <span class=n>bits</span><span class=p>[:</span><span class=mi>1</span><span class=p>]</span>
<a id=__codelineno-0-152 name=__codelineno-0-152></a> <span class=k>return</span> <span class=n>kwargs</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.templatetags class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">templatetags</span> <a href=#django_components.templatetags class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-module"> <h3 id=django_components.templatetags.component_tags class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">component_tags</span> <a href=#django_components.templatetags.component_tags class=headerlink title="Permanent link">¤</a></h3> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h4 id=django_components.templatetags.component_tags.component class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">component</span> <a href=#django_components.templatetags.component_tags.component class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>component</span><span class=p>(</span><span class=n>parser</span><span class=p>:</span> <span class=n><span title=django.template.base.Parser>Parser</span></span><span class=p>,</span> <span class=n>token</span><span class=p>:</span> <span class=n><span title=django.template.base.Token>Token</span></span><span class=p>,</span> <span class=n>tag_name</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.component.ComponentNode href=component/#django_components.component.ComponentNode>ComponentNode</a></span>
</code></pre></div> <div class="doc doc-contents "> <details class=to-give-the-component-access-to-the-template-context open> <summary>To give the component access to the template context</summary> <p><code class=highlight><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;name&quot;</span> <span class=nv>positional_arg</span> <span class=nv>keyword_arg</span><span class=o>=</span><span class=nv>value</span> <span class=p>...</span> <span class=cp>%}</span></code></p> </details> <details class=to-render-the-component-in-an-isolated-context open> <summary>To render the component in an isolated context</summary> <p><code class=highlight><span class=cp>{%</span> <span class=k>component</span> <span class=s2>&quot;name&quot;</span> <span class=nv>positional_arg</span> <span class=nv>keyword_arg</span><span class=o>=</span><span class=nv>value</span> <span class=p>...</span> <span class=nv>only</span> <span class=cp>%}</span></code></p> </details> <p>Positional and keyword arguments can be literals or template variables. The component name must be a single- or double-quotes string and must be either the first positional argument or, if there are no positional arguments, passed as 'name'.</p> <details class=quote> <summary>Source code in <code>src/django_components/templatetags/component_tags.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-195>195</a></span>
<span class=normal><a href=#__codelineno-0-196>196</a></span>
<span class=normal><a href=#__codelineno-0-197>197</a></span>
<span class=normal><a href=#__codelineno-0-198>198</a></span>
<span class=normal><a href=#__codelineno-0-199>199</a></span>
<span class=normal><a href=#__codelineno-0-200>200</a></span>
<span class=normal><a href=#__codelineno-0-201>201</a></span>
<span class=normal><a href=#__codelineno-0-202>202</a></span>
<span class=normal><a href=#__codelineno-0-203>203</a></span>
<span class=normal><a href=#__codelineno-0-204>204</a></span>
<span class=normal><a href=#__codelineno-0-205>205</a></span>
<span class=normal><a href=#__codelineno-0-206>206</a></span>
<span class=normal><a href=#__codelineno-0-207>207</a></span>
<span class=normal><a href=#__codelineno-0-208>208</a></span>
<span class=normal><a href=#__codelineno-0-209>209</a></span>
<span class=normal><a href=#__codelineno-0-210>210</a></span>
<span class=normal><a href=#__codelineno-0-211>211</a></span>
<span class=normal><a href=#__codelineno-0-212>212</a></span>
<span class=normal><a href=#__codelineno-0-213>213</a></span>
<span class=normal><a href=#__codelineno-0-214>214</a></span>
<span class=normal><a href=#__codelineno-0-215>215</a></span>
<span class=normal><a href=#__codelineno-0-216>216</a></span>
<span class=normal><a href=#__codelineno-0-217>217</a></span>
<span class=normal><a href=#__codelineno-0-218>218</a></span>
<span class=normal><a href=#__codelineno-0-219>219</a></span>
<span class=normal><a href=#__codelineno-0-220>220</a></span>
<span class=normal><a href=#__codelineno-0-221>221</a></span>
<span class=normal><a href=#__codelineno-0-222>222</a></span>
<span class=normal><a href=#__codelineno-0-223>223</a></span>
<span class=normal><a href=#__codelineno-0-224>224</a></span>
<span class=normal><a href=#__codelineno-0-225>225</a></span>
<span class=normal><a href=#__codelineno-0-226>226</a></span>
<span class=normal><a href=#__codelineno-0-227>227</a></span>
<span class=normal><a href=#__codelineno-0-228>228</a></span>
<span class=normal><a href=#__codelineno-0-229>229</a></span>
<span class=normal><a href=#__codelineno-0-230>230</a></span>
<span class=normal><a href=#__codelineno-0-231>231</a></span>
<span class=normal><a href=#__codelineno-0-232>232</a></span>
<span class=normal><a href=#__codelineno-0-233>233</a></span>
<span class=normal><a href=#__codelineno-0-234>234</a></span>
<span class=normal><a href=#__codelineno-0-235>235</a></span>
<span class=normal><a href=#__codelineno-0-236>236</a></span>
<span class=normal><a href=#__codelineno-0-237>237</a></span>
<span class=normal><a href=#__codelineno-0-238>238</a></span>
<span class=normal><a href=#__codelineno-0-239>239</a></span>
<span class=normal><a href=#__codelineno-0-240>240</a></span>
<span class=normal><a href=#__codelineno-0-241>241</a></span>
<span class=normal><a href=#__codelineno-0-242>242</a></span>
<span class=normal><a href=#__codelineno-0-243>243</a></span>
<span class=normal><a href=#__codelineno-0-244>244</a></span>
<span class=normal><a href=#__codelineno-0-245>245</a></span>
<span class=normal><a href=#__codelineno-0-246>246</a></span>
<span class=normal><a href=#__codelineno-0-247>247</a></span>
<span class=normal><a href=#__codelineno-0-248>248</a></span>
<span class=normal><a href=#__codelineno-0-249>249</a></span>
<span class=normal><a href=#__codelineno-0-250>250</a></span>
<span class=normal><a href=#__codelineno-0-251>251</a></span>
<span class=normal><a href=#__codelineno-0-252>252</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-195 name=__codelineno-0-195></a><span class=k>def</span> <span class=nf>component</span><span class=p>(</span><span class=n>parser</span><span class=p>:</span> <span class=n>Parser</span><span class=p>,</span> <span class=n>token</span><span class=p>:</span> <span class=n>Token</span><span class=p>,</span> <span class=n>tag_name</span><span class=p>:</span> <span class=nb>str</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>ComponentNode</span><span class=p>:</span>
<a id=__codelineno-0-196 name=__codelineno-0-196></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-197 name=__codelineno-0-197></a><span class=sd> To give the component access to the template context:</span>
<a id=__codelineno-0-198 name=__codelineno-0-198></a><span class=sd> ```#!htmldjango {% component &quot;name&quot; positional_arg keyword_arg=value ... %}```</span>
<a id=__codelineno-0-199 name=__codelineno-0-199></a>
<a id=__codelineno-0-200 name=__codelineno-0-200></a><span class=sd> To render the component in an isolated context:</span>
<a id=__codelineno-0-201 name=__codelineno-0-201></a><span class=sd> ```#!htmldjango {% component &quot;name&quot; positional_arg keyword_arg=value ... only %}```</span>
<a id=__codelineno-0-202 name=__codelineno-0-202></a>
<a id=__codelineno-0-203 name=__codelineno-0-203></a><span class=sd> Positional and keyword arguments can be literals or template variables.</span>
<a id=__codelineno-0-204 name=__codelineno-0-204></a><span class=sd> The component name must be a single- or double-quotes string and must</span>
<a id=__codelineno-0-205 name=__codelineno-0-205></a><span class=sd> be either the first positional argument or, if there are no positional</span>
<a id=__codelineno-0-206 name=__codelineno-0-206></a><span class=sd> arguments, passed as &#39;name&#39;.</span>
<a id=__codelineno-0-207 name=__codelineno-0-207></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-208 name=__codelineno-0-208></a> <span class=n>bits</span> <span class=o>=</span> <span class=n>token</span><span class=o>.</span><span class=n>split_contents</span><span class=p>()</span>
<a id=__codelineno-0-209 name=__codelineno-0-209></a>
<a id=__codelineno-0-210 name=__codelineno-0-210></a> <span class=c1># Let the TagFormatter pre-process the tokens</span>
<a id=__codelineno-0-211 name=__codelineno-0-211></a> <span class=n>formatter</span> <span class=o>=</span> <span class=n>get_tag_formatter</span><span class=p>()</span>
<a id=__codelineno-0-212 name=__codelineno-0-212></a> <span class=n>result</span> <span class=o>=</span> <span class=n>formatter</span><span class=o>.</span><span class=n>parse</span><span class=p>([</span><span class=o>*</span><span class=n>bits</span><span class=p>])</span>
<a id=__codelineno-0-213 name=__codelineno-0-213></a> <span class=n>end_tag</span> <span class=o>=</span> <span class=n>formatter</span><span class=o>.</span><span class=n>end_tag</span><span class=p>(</span><span class=n>result</span><span class=o>.</span><span class=n>component_name</span><span class=p>)</span>
<a id=__codelineno-0-214 name=__codelineno-0-214></a>
<a id=__codelineno-0-215 name=__codelineno-0-215></a> <span class=c1># NOTE: The tokens returned from TagFormatter.parse do NOT include the tag itself</span>
<a id=__codelineno-0-216 name=__codelineno-0-216></a> <span class=n>bits</span> <span class=o>=</span> <span class=p>[</span><span class=n>bits</span><span class=p>[</span><span class=mi>0</span><span class=p>],</span> <span class=o>*</span><span class=n>result</span><span class=o>.</span><span class=n>tokens</span><span class=p>]</span>
<a id=__codelineno-0-217 name=__codelineno-0-217></a>
<a id=__codelineno-0-218 name=__codelineno-0-218></a> <span class=n>tag</span> <span class=o>=</span> <span class=n>_parse_tag</span><span class=p>(</span>
<a id=__codelineno-0-219 name=__codelineno-0-219></a> <span class=n>tag_name</span><span class=p>,</span>
<a id=__codelineno-0-220 name=__codelineno-0-220></a> <span class=n>parser</span><span class=p>,</span>
<a id=__codelineno-0-221 name=__codelineno-0-221></a> <span class=n>bits</span><span class=p>,</span>
<a id=__codelineno-0-222 name=__codelineno-0-222></a> <span class=n>params</span><span class=o>=</span><span class=kc>True</span><span class=p>,</span> <span class=c1># Allow many args</span>
<a id=__codelineno-0-223 name=__codelineno-0-223></a> <span class=n>flags</span><span class=o>=</span><span class=p>[</span><span class=s2>&quot;only&quot;</span><span class=p>],</span>
<a id=__codelineno-0-224 name=__codelineno-0-224></a> <span class=n>keywordonly_kwargs</span><span class=o>=</span><span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-225 name=__codelineno-0-225></a> <span class=n>repeatable_kwargs</span><span class=o>=</span><span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-226 name=__codelineno-0-226></a> <span class=n>end_tag</span><span class=o>=</span><span class=n>end_tag</span><span class=p>,</span>
<a id=__codelineno-0-227 name=__codelineno-0-227></a> <span class=p>)</span>
<a id=__codelineno-0-228 name=__codelineno-0-228></a>
<a id=__codelineno-0-229 name=__codelineno-0-229></a> <span class=c1># Check for isolated context keyword</span>
<a id=__codelineno-0-230 name=__codelineno-0-230></a> <span class=n>isolated_context</span> <span class=o>=</span> <span class=n>tag</span><span class=o>.</span><span class=n>flags</span><span class=p>[</span><span class=s2>&quot;only&quot;</span><span class=p>]</span> <span class=ow>or</span> <span class=n>app_settings</span><span class=o>.</span><span class=n>CONTEXT_BEHAVIOR</span> <span class=o>==</span> <span class=n>ContextBehavior</span><span class=o>.</span><span class=n>ISOLATED</span>
<a id=__codelineno-0-231 name=__codelineno-0-231></a>
<a id=__codelineno-0-232 name=__codelineno-0-232></a> <span class=n>trace_msg</span><span class=p>(</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;COMP&quot;</span><span class=p>,</span> <span class=n>result</span><span class=o>.</span><span class=n>component_name</span><span class=p>,</span> <span class=n>tag</span><span class=o>.</span><span class=n>id</span><span class=p>)</span>
<a id=__codelineno-0-233 name=__codelineno-0-233></a>
<a id=__codelineno-0-234 name=__codelineno-0-234></a> <span class=n>body</span> <span class=o>=</span> <span class=n>tag</span><span class=o>.</span><span class=n>parse_body</span><span class=p>()</span>
<a id=__codelineno-0-235 name=__codelineno-0-235></a> <span class=n>fill_nodes</span> <span class=o>=</span> <span class=n>parse_slot_fill_nodes_from_component_nodelist</span><span class=p>(</span><span class=n>body</span><span class=p>,</span> <span class=n>ComponentNode</span><span class=p>)</span>
<a id=__codelineno-0-236 name=__codelineno-0-236></a>
<a id=__codelineno-0-237 name=__codelineno-0-237></a> <span class=c1># Tag all fill nodes as children of this particular component instance</span>
<a id=__codelineno-0-238 name=__codelineno-0-238></a> <span class=k>for</span> <span class=n>node</span> <span class=ow>in</span> <span class=n>fill_nodes</span><span class=p>:</span>
<a id=__codelineno-0-239 name=__codelineno-0-239></a> <span class=n>trace_msg</span><span class=p>(</span><span class=s2>&quot;ASSOC&quot;</span><span class=p>,</span> <span class=s2>&quot;FILL&quot;</span><span class=p>,</span> <span class=n>node</span><span class=o>.</span><span class=n>name</span><span class=p>,</span> <span class=n>node</span><span class=o>.</span><span class=n>node_id</span><span class=p>,</span> <span class=n>component_id</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>id</span><span class=p>)</span>
<a id=__codelineno-0-240 name=__codelineno-0-240></a> <span class=n>node</span><span class=o>.</span><span class=n>component_id</span> <span class=o>=</span> <span class=n>tag</span><span class=o>.</span><span class=n>id</span>
<a id=__codelineno-0-241 name=__codelineno-0-241></a>
<a id=__codelineno-0-242 name=__codelineno-0-242></a> <span class=n>component_node</span> <span class=o>=</span> <span class=n>ComponentNode</span><span class=p>(</span>
<a id=__codelineno-0-243 name=__codelineno-0-243></a> <span class=n>name</span><span class=o>=</span><span class=n>result</span><span class=o>.</span><span class=n>component_name</span><span class=p>,</span>
<a id=__codelineno-0-244 name=__codelineno-0-244></a> <span class=n>args</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>args</span><span class=p>,</span>
<a id=__codelineno-0-245 name=__codelineno-0-245></a> <span class=n>kwargs</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>kwargs</span><span class=p>,</span>
<a id=__codelineno-0-246 name=__codelineno-0-246></a> <span class=n>isolated_context</span><span class=o>=</span><span class=n>isolated_context</span><span class=p>,</span>
<a id=__codelineno-0-247 name=__codelineno-0-247></a> <span class=n>fill_nodes</span><span class=o>=</span><span class=n>fill_nodes</span><span class=p>,</span>
<a id=__codelineno-0-248 name=__codelineno-0-248></a> <span class=n>node_id</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>id</span><span class=p>,</span>
<a id=__codelineno-0-249 name=__codelineno-0-249></a> <span class=p>)</span>
<a id=__codelineno-0-250 name=__codelineno-0-250></a>
<a id=__codelineno-0-251 name=__codelineno-0-251></a> <span class=n>trace_msg</span><span class=p>(</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;COMP&quot;</span><span class=p>,</span> <span class=n>result</span><span class=o>.</span><span class=n>component_name</span><span class=p>,</span> <span class=n>tag</span><span class=o>.</span><span class=n>id</span><span class=p>,</span> <span class=s2>&quot;...Done!&quot;</span><span class=p>)</span>
<a id=__codelineno-0-252 name=__codelineno-0-252></a> <span class=k>return</span> <span class=n>component_node</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.templatetags.component_tags.component_css_dependencies class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">component_css_dependencies</span> <a href=#django_components.templatetags.component_tags.component_css_dependencies class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>component_css_dependencies</span><span class=p>(</span><span class=n>preload</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span> <span class=o>=</span> <span class=s1>&#39;&#39;</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.utils.safestring.SafeString href=https://docs.djangoproject.com/en/5.0/ref/utils/#django.utils.safestring.SafeString>SafeString</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Marks location where CSS link tags should be rendered.</p> <details class=quote> <summary>Source code in <code>src/django_components/templatetags/component_tags.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-94> 94</a></span>
<span class=normal><a href=#__codelineno-0-95> 95</a></span>
<span class=normal><a href=#__codelineno-0-96> 96</a></span>
<span class=normal><a href=#__codelineno-0-97> 97</a></span>
<span class=normal><a href=#__codelineno-0-98> 98</a></span>
<span class=normal><a href=#__codelineno-0-99> 99</a></span>
<span class=normal><a href=#__codelineno-0-100>100</a></span>
<span class=normal><a href=#__codelineno-0-101>101</a></span>
<span class=normal><a href=#__codelineno-0-102>102</a></span>
<span class=normal><a href=#__codelineno-0-103>103</a></span>
<span class=normal><a href=#__codelineno-0-104>104</a></span>
<span class=normal><a href=#__codelineno-0-105>105</a></span>
<span class=normal><a href=#__codelineno-0-106>106</a></span>
<span class=normal><a href=#__codelineno-0-107>107</a></span>
<span class=normal><a href=#__codelineno-0-108>108</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-94 name=__codelineno-0-94></a><span class=nd>@register</span><span class=o>.</span><span class=n>simple_tag</span><span class=p>(</span><span class=n>name</span><span class=o>=</span><span class=s2>&quot;component_css_dependencies&quot;</span><span class=p>)</span>
<a id=__codelineno-0-95 name=__codelineno-0-95></a><span class=k>def</span> <span class=nf>component_css_dependencies</span><span class=p>(</span><span class=n>preload</span><span class=p>:</span> <span class=nb>str</span> <span class=o>=</span> <span class=s2>&quot;&quot;</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>SafeString</span><span class=p>:</span>
<a id=__codelineno-0-96 name=__codelineno-0-96></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Marks location where CSS link tags should be rendered.&quot;&quot;&quot;</span>
<a id=__codelineno-0-97 name=__codelineno-0-97></a>
<a id=__codelineno-0-98 name=__codelineno-0-98></a> <span class=k>if</span> <span class=n>is_dependency_middleware_active</span><span class=p>():</span>
<a id=__codelineno-0-99 name=__codelineno-0-99></a> <span class=n>preloaded_dependencies</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-100 name=__codelineno-0-100></a> <span class=k>for</span> <span class=n>component</span> <span class=ow>in</span> <span class=n>_get_components_from_preload_str</span><span class=p>(</span><span class=n>preload</span><span class=p>):</span>
<a id=__codelineno-0-101 name=__codelineno-0-101></a> <span class=n>preloaded_dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>RENDERED_COMMENT_TEMPLATE</span><span class=o>.</span><span class=n>format</span><span class=p>(</span><span class=n>name</span><span class=o>=</span><span class=n>component</span><span class=o>.</span><span class=n>registered_name</span><span class=p>))</span>
<a id=__codelineno-0-102 name=__codelineno-0-102></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>preloaded_dependencies</span><span class=p>)</span> <span class=o>+</span> <span class=n>CSS_DEPENDENCY_PLACEHOLDER</span><span class=p>)</span>
<a id=__codelineno-0-103 name=__codelineno-0-103></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-104 name=__codelineno-0-104></a> <span class=n>rendered_dependencies</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-105 name=__codelineno-0-105></a> <span class=k>for</span> <span class=n>component</span> <span class=ow>in</span> <span class=n>_get_components_from_registry</span><span class=p>(</span><span class=n>component_registry</span><span class=p>):</span>
<a id=__codelineno-0-106 name=__codelineno-0-106></a> <span class=n>rendered_dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>component</span><span class=o>.</span><span class=n>render_css_dependencies</span><span class=p>())</span>
<a id=__codelineno-0-107 name=__codelineno-0-107></a>
<a id=__codelineno-0-108 name=__codelineno-0-108></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>rendered_dependencies</span><span class=p>))</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.templatetags.component_tags.component_dependencies class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">component_dependencies</span> <a href=#django_components.templatetags.component_tags.component_dependencies class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>component_dependencies</span><span class=p>(</span><span class=n>preload</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span> <span class=o>=</span> <span class=s1>&#39;&#39;</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.utils.safestring.SafeString href=https://docs.djangoproject.com/en/5.0/ref/utils/#django.utils.safestring.SafeString>SafeString</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Marks location where CSS link and JS script tags should be rendered.</p> <details class=quote> <summary>Source code in <code>src/django_components/templatetags/component_tags.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-77>77</a></span>
<span class=normal><a href=#__codelineno-0-78>78</a></span>
<span class=normal><a href=#__codelineno-0-79>79</a></span>
<span class=normal><a href=#__codelineno-0-80>80</a></span>
<span class=normal><a href=#__codelineno-0-81>81</a></span>
<span class=normal><a href=#__codelineno-0-82>82</a></span>
<span class=normal><a href=#__codelineno-0-83>83</a></span>
<span class=normal><a href=#__codelineno-0-84>84</a></span>
<span class=normal><a href=#__codelineno-0-85>85</a></span>
<span class=normal><a href=#__codelineno-0-86>86</a></span>
<span class=normal><a href=#__codelineno-0-87>87</a></span>
<span class=normal><a href=#__codelineno-0-88>88</a></span>
<span class=normal><a href=#__codelineno-0-89>89</a></span>
<span class=normal><a href=#__codelineno-0-90>90</a></span>
<span class=normal><a href=#__codelineno-0-91>91</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-77 name=__codelineno-0-77></a><span class=nd>@register</span><span class=o>.</span><span class=n>simple_tag</span><span class=p>(</span><span class=n>name</span><span class=o>=</span><span class=s2>&quot;component_dependencies&quot;</span><span class=p>)</span>
<a id=__codelineno-0-78 name=__codelineno-0-78></a><span class=k>def</span> <span class=nf>component_dependencies</span><span class=p>(</span><span class=n>preload</span><span class=p>:</span> <span class=nb>str</span> <span class=o>=</span> <span class=s2>&quot;&quot;</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>SafeString</span><span class=p>:</span>
<a id=__codelineno-0-79 name=__codelineno-0-79></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Marks location where CSS link and JS script tags should be rendered.&quot;&quot;&quot;</span>
<a id=__codelineno-0-80 name=__codelineno-0-80></a>
<a id=__codelineno-0-81 name=__codelineno-0-81></a> <span class=k>if</span> <span class=n>is_dependency_middleware_active</span><span class=p>():</span>
<a id=__codelineno-0-82 name=__codelineno-0-82></a> <span class=n>preloaded_dependencies</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-83 name=__codelineno-0-83></a> <span class=k>for</span> <span class=n>component</span> <span class=ow>in</span> <span class=n>_get_components_from_preload_str</span><span class=p>(</span><span class=n>preload</span><span class=p>):</span>
<a id=__codelineno-0-84 name=__codelineno-0-84></a> <span class=n>preloaded_dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>RENDERED_COMMENT_TEMPLATE</span><span class=o>.</span><span class=n>format</span><span class=p>(</span><span class=n>name</span><span class=o>=</span><span class=n>component</span><span class=o>.</span><span class=n>registered_name</span><span class=p>))</span>
<a id=__codelineno-0-85 name=__codelineno-0-85></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>preloaded_dependencies</span><span class=p>)</span> <span class=o>+</span> <span class=n>CSS_DEPENDENCY_PLACEHOLDER</span> <span class=o>+</span> <span class=n>JS_DEPENDENCY_PLACEHOLDER</span><span class=p>)</span>
<a id=__codelineno-0-86 name=__codelineno-0-86></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-87 name=__codelineno-0-87></a> <span class=n>rendered_dependencies</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-88 name=__codelineno-0-88></a> <span class=k>for</span> <span class=n>component</span> <span class=ow>in</span> <span class=n>_get_components_from_registry</span><span class=p>(</span><span class=n>component_registry</span><span class=p>):</span>
<a id=__codelineno-0-89 name=__codelineno-0-89></a> <span class=n>rendered_dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>component</span><span class=o>.</span><span class=n>render_dependencies</span><span class=p>())</span>
<a id=__codelineno-0-90 name=__codelineno-0-90></a>
<a id=__codelineno-0-91 name=__codelineno-0-91></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>rendered_dependencies</span><span class=p>))</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.templatetags.component_tags.component_js_dependencies class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">component_js_dependencies</span> <a href=#django_components.templatetags.component_tags.component_js_dependencies class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>component_js_dependencies</span><span class=p>(</span><span class=n>preload</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span> <span class=o>=</span> <span class=s1>&#39;&#39;</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" title=django.utils.safestring.SafeString href=https://docs.djangoproject.com/en/5.0/ref/utils/#django.utils.safestring.SafeString>SafeString</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Marks location where JS script tags should be rendered.</p> <details class=quote> <summary>Source code in <code>src/django_components/templatetags/component_tags.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-111>111</a></span>
<span class=normal><a href=#__codelineno-0-112>112</a></span>
<span class=normal><a href=#__codelineno-0-113>113</a></span>
<span class=normal><a href=#__codelineno-0-114>114</a></span>
<span class=normal><a href=#__codelineno-0-115>115</a></span>
<span class=normal><a href=#__codelineno-0-116>116</a></span>
<span class=normal><a href=#__codelineno-0-117>117</a></span>
<span class=normal><a href=#__codelineno-0-118>118</a></span>
<span class=normal><a href=#__codelineno-0-119>119</a></span>
<span class=normal><a href=#__codelineno-0-120>120</a></span>
<span class=normal><a href=#__codelineno-0-121>121</a></span>
<span class=normal><a href=#__codelineno-0-122>122</a></span>
<span class=normal><a href=#__codelineno-0-123>123</a></span>
<span class=normal><a href=#__codelineno-0-124>124</a></span>
<span class=normal><a href=#__codelineno-0-125>125</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-111 name=__codelineno-0-111></a><span class=nd>@register</span><span class=o>.</span><span class=n>simple_tag</span><span class=p>(</span><span class=n>name</span><span class=o>=</span><span class=s2>&quot;component_js_dependencies&quot;</span><span class=p>)</span>
<a id=__codelineno-0-112 name=__codelineno-0-112></a><span class=k>def</span> <span class=nf>component_js_dependencies</span><span class=p>(</span><span class=n>preload</span><span class=p>:</span> <span class=nb>str</span> <span class=o>=</span> <span class=s2>&quot;&quot;</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>SafeString</span><span class=p>:</span>
<a id=__codelineno-0-113 name=__codelineno-0-113></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Marks location where JS script tags should be rendered.&quot;&quot;&quot;</span>
<a id=__codelineno-0-114 name=__codelineno-0-114></a>
<a id=__codelineno-0-115 name=__codelineno-0-115></a> <span class=k>if</span> <span class=n>is_dependency_middleware_active</span><span class=p>():</span>
<a id=__codelineno-0-116 name=__codelineno-0-116></a> <span class=n>preloaded_dependencies</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-117 name=__codelineno-0-117></a> <span class=k>for</span> <span class=n>component</span> <span class=ow>in</span> <span class=n>_get_components_from_preload_str</span><span class=p>(</span><span class=n>preload</span><span class=p>):</span>
<a id=__codelineno-0-118 name=__codelineno-0-118></a> <span class=n>preloaded_dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>RENDERED_COMMENT_TEMPLATE</span><span class=o>.</span><span class=n>format</span><span class=p>(</span><span class=n>name</span><span class=o>=</span><span class=n>component</span><span class=o>.</span><span class=n>registered_name</span><span class=p>))</span>
<a id=__codelineno-0-119 name=__codelineno-0-119></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>preloaded_dependencies</span><span class=p>)</span> <span class=o>+</span> <span class=n>JS_DEPENDENCY_PLACEHOLDER</span><span class=p>)</span>
<a id=__codelineno-0-120 name=__codelineno-0-120></a> <span class=k>else</span><span class=p>:</span>
<a id=__codelineno-0-121 name=__codelineno-0-121></a> <span class=n>rendered_dependencies</span> <span class=o>=</span> <span class=p>[]</span>
<a id=__codelineno-0-122 name=__codelineno-0-122></a> <span class=k>for</span> <span class=n>component</span> <span class=ow>in</span> <span class=n>_get_components_from_registry</span><span class=p>(</span><span class=n>component_registry</span><span class=p>):</span>
<a id=__codelineno-0-123 name=__codelineno-0-123></a> <span class=n>rendered_dependencies</span><span class=o>.</span><span class=n>append</span><span class=p>(</span><span class=n>component</span><span class=o>.</span><span class=n>render_js_dependencies</span><span class=p>())</span>
<a id=__codelineno-0-124 name=__codelineno-0-124></a>
<a id=__codelineno-0-125 name=__codelineno-0-125></a> <span class=k>return</span> <span class=n>mark_safe</span><span class=p>(</span><span class=s2>&quot;</span><span class=se>\n</span><span class=s2>&quot;</span><span class=o>.</span><span class=n>join</span><span class=p>(</span><span class=n>rendered_dependencies</span><span class=p>))</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.templatetags.component_tags.fill class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">fill</span> <a href=#django_components.templatetags.component_tags.fill class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>fill</span><span class=p>(</span><span class=n>parser</span><span class=p>:</span> <span class=n><span title=django.template.base.Parser>Parser</span></span><span class=p>,</span> <span class=n>token</span><span class=p>:</span> <span class=n><span title=django.template.base.Token>Token</span></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-internal" title=django_components.slots.FillNode href=slots/#django_components.slots.FillNode>FillNode</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Block tag whose contents 'fill' (are inserted into) an identically named 'slot'-block in the component template referred to by a parent component. It exists to make component nesting easier.</p> <p>This tag is available only within a {% component %}..{% endcomponent %} block. Runtime checks should prohibit other usages.</p> <details class=quote> <summary>Source code in <code>src/django_components/templatetags/component_tags.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-159>159</a></span>
<span class=normal><a href=#__codelineno-0-160>160</a></span>
<span class=normal><a href=#__codelineno-0-161>161</a></span>
<span class=normal><a href=#__codelineno-0-162>162</a></span>
<span class=normal><a href=#__codelineno-0-163>163</a></span>
<span class=normal><a href=#__codelineno-0-164>164</a></span>
<span class=normal><a href=#__codelineno-0-165>165</a></span>
<span class=normal><a href=#__codelineno-0-166>166</a></span>
<span class=normal><a href=#__codelineno-0-167>167</a></span>
<span class=normal><a href=#__codelineno-0-168>168</a></span>
<span class=normal><a href=#__codelineno-0-169>169</a></span>
<span class=normal><a href=#__codelineno-0-170>170</a></span>
<span class=normal><a href=#__codelineno-0-171>171</a></span>
<span class=normal><a href=#__codelineno-0-172>172</a></span>
<span class=normal><a href=#__codelineno-0-173>173</a></span>
<span class=normal><a href=#__codelineno-0-174>174</a></span>
<span class=normal><a href=#__codelineno-0-175>175</a></span>
<span class=normal><a href=#__codelineno-0-176>176</a></span>
<span class=normal><a href=#__codelineno-0-177>177</a></span>
<span class=normal><a href=#__codelineno-0-178>178</a></span>
<span class=normal><a href=#__codelineno-0-179>179</a></span>
<span class=normal><a href=#__codelineno-0-180>180</a></span>
<span class=normal><a href=#__codelineno-0-181>181</a></span>
<span class=normal><a href=#__codelineno-0-182>182</a></span>
<span class=normal><a href=#__codelineno-0-183>183</a></span>
<span class=normal><a href=#__codelineno-0-184>184</a></span>
<span class=normal><a href=#__codelineno-0-185>185</a></span>
<span class=normal><a href=#__codelineno-0-186>186</a></span>
<span class=normal><a href=#__codelineno-0-187>187</a></span>
<span class=normal><a href=#__codelineno-0-188>188</a></span>
<span class=normal><a href=#__codelineno-0-189>189</a></span>
<span class=normal><a href=#__codelineno-0-190>190</a></span>
<span class=normal><a href=#__codelineno-0-191>191</a></span>
<span class=normal><a href=#__codelineno-0-192>192</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-159 name=__codelineno-0-159></a><span class=nd>@register</span><span class=o>.</span><span class=n>tag</span><span class=p>(</span><span class=s2>&quot;fill&quot;</span><span class=p>)</span>
<a id=__codelineno-0-160 name=__codelineno-0-160></a><span class=k>def</span> <span class=nf>fill</span><span class=p>(</span><span class=n>parser</span><span class=p>:</span> <span class=n>Parser</span><span class=p>,</span> <span class=n>token</span><span class=p>:</span> <span class=n>Token</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>FillNode</span><span class=p>:</span>
<a id=__codelineno-0-161 name=__codelineno-0-161></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-162 name=__codelineno-0-162></a><span class=sd> Block tag whose contents &#39;fill&#39; (are inserted into) an identically named</span>
<a id=__codelineno-0-163 name=__codelineno-0-163></a><span class=sd> &#39;slot&#39;-block in the component template referred to by a parent component.</span>
<a id=__codelineno-0-164 name=__codelineno-0-164></a><span class=sd> It exists to make component nesting easier.</span>
<a id=__codelineno-0-165 name=__codelineno-0-165></a>
<a id=__codelineno-0-166 name=__codelineno-0-166></a><span class=sd> This tag is available only within a {% component %}..{% endcomponent %} block.</span>
<a id=__codelineno-0-167 name=__codelineno-0-167></a><span class=sd> Runtime checks should prohibit other usages.</span>
<a id=__codelineno-0-168 name=__codelineno-0-168></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-169 name=__codelineno-0-169></a> <span class=n>bits</span> <span class=o>=</span> <span class=n>token</span><span class=o>.</span><span class=n>split_contents</span><span class=p>()</span>
<a id=__codelineno-0-170 name=__codelineno-0-170></a> <span class=n>tag</span> <span class=o>=</span> <span class=n>_parse_tag</span><span class=p>(</span>
<a id=__codelineno-0-171 name=__codelineno-0-171></a> <span class=s2>&quot;fill&quot;</span><span class=p>,</span>
<a id=__codelineno-0-172 name=__codelineno-0-172></a> <span class=n>parser</span><span class=p>,</span>
<a id=__codelineno-0-173 name=__codelineno-0-173></a> <span class=n>bits</span><span class=p>,</span>
<a id=__codelineno-0-174 name=__codelineno-0-174></a> <span class=n>params</span><span class=o>=</span><span class=p>[</span><span class=s2>&quot;name&quot;</span><span class=p>],</span>
<a id=__codelineno-0-175 name=__codelineno-0-175></a> <span class=n>keywordonly_kwargs</span><span class=o>=</span><span class=p>[</span><span class=n>SLOT_DATA_KWARG</span><span class=p>,</span> <span class=n>SLOT_DEFAULT_KWARG</span><span class=p>],</span>
<a id=__codelineno-0-176 name=__codelineno-0-176></a> <span class=n>repeatable_kwargs</span><span class=o>=</span><span class=kc>False</span><span class=p>,</span>
<a id=__codelineno-0-177 name=__codelineno-0-177></a> <span class=n>end_tag</span><span class=o>=</span><span class=s2>&quot;endfill&quot;</span><span class=p>,</span>
<a id=__codelineno-0-178 name=__codelineno-0-178></a> <span class=p>)</span>
<a id=__codelineno-0-179 name=__codelineno-0-179></a> <span class=n>slot_name</span> <span class=o>=</span> <span class=n>tag</span><span class=o>.</span><span class=n>named_args</span><span class=p>[</span><span class=s2>&quot;name&quot;</span><span class=p>]</span>
<a id=__codelineno-0-180 name=__codelineno-0-180></a>
<a id=__codelineno-0-181 name=__codelineno-0-181></a> <span class=n>trace_msg</span><span class=p>(</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;FILL&quot;</span><span class=p>,</span> <span class=nb>str</span><span class=p>(</span><span class=n>slot_name</span><span class=p>),</span> <span class=n>tag</span><span class=o>.</span><span class=n>id</span><span class=p>)</span>
<a id=__codelineno-0-182 name=__codelineno-0-182></a>
<a id=__codelineno-0-183 name=__codelineno-0-183></a> <span class=n>body</span> <span class=o>=</span> <span class=n>tag</span><span class=o>.</span><span class=n>parse_body</span><span class=p>()</span>
<a id=__codelineno-0-184 name=__codelineno-0-184></a> <span class=n>fill_node</span> <span class=o>=</span> <span class=n>FillNode</span><span class=p>(</span>
<a id=__codelineno-0-185 name=__codelineno-0-185></a> <span class=n>nodelist</span><span class=o>=</span><span class=n>body</span><span class=p>,</span>
<a id=__codelineno-0-186 name=__codelineno-0-186></a> <span class=n>name</span><span class=o>=</span><span class=n>slot_name</span><span class=p>,</span>
<a id=__codelineno-0-187 name=__codelineno-0-187></a> <span class=n>node_id</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>id</span><span class=p>,</span>
<a id=__codelineno-0-188 name=__codelineno-0-188></a> <span class=n>kwargs</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>kwargs</span><span class=p>,</span>
<a id=__codelineno-0-189 name=__codelineno-0-189></a> <span class=p>)</span>
<a id=__codelineno-0-190 name=__codelineno-0-190></a>
<a id=__codelineno-0-191 name=__codelineno-0-191></a> <span class=n>trace_msg</span><span class=p>(</span><span class=s2>&quot;PARSE&quot;</span><span class=p>,</span> <span class=s2>&quot;FILL&quot;</span><span class=p>,</span> <span class=nb>str</span><span class=p>(</span><span class=n>slot_name</span><span class=p>),</span> <span class=n>tag</span><span class=o>.</span><span class=n>id</span><span class=p>,</span> <span class=s2>&quot;...Done!&quot;</span><span class=p>)</span>
<a id=__codelineno-0-192 name=__codelineno-0-192></a> <span class=k>return</span> <span class=n>fill_node</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> <div class="doc doc-object doc-function"> <h4 id=django_components.templatetags.component_tags.html_attrs class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">html_attrs</span> <a href=#django_components.templatetags.component_tags.html_attrs class=headerlink title="Permanent link">¤</a></h4> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>html_attrs</span><span class=p>(</span><span class=n>parser</span><span class=p>:</span> <span class=n><span title=django.template.base.Parser>Parser</span></span><span class=p>,</span> <span class=n>token</span><span class=p>:</span> <span class=n><span title=django.template.base.Token>Token</span></span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><span title=django_components.attributes.HtmlAttrsNode>HtmlAttrsNode</span></span>
</code></pre></div> <div class="doc doc-contents "> <p>This tag takes: - Optional dictionary of attributes (<code>attrs</code>) - Optional dictionary of defaults (<code>defaults</code>) - Additional kwargs that are appended to the former two</p> <p>The inputs are merged and resulting dict is rendered as HTML attributes (<code>key="value"</code>).</p> <p>Rules: 1. Both <code>attrs</code> and <code>defaults</code> can be passed as positional args or as kwargs 2. Both <code>attrs</code> and <code>defaults</code> are optional (can be omitted) 3. Both <code>attrs</code> and <code>defaults</code> are dictionaries, and we can define them the same way we define dictionaries for the <code>component</code> tag. So either as <code>attrs=attrs</code> or <code>attrs:key=value</code>. 4. All other kwargs (<code>key=value</code>) are appended and can be repeated.</p> <p>Normal kwargs (<code>key=value</code>) are concatenated to existing keys. So if e.g. key "class" is supplied with value "my-class", then adding <code>class="extra-class"</code> will result in `class="my-class extra-class".</p> <p>Example: <div class=highlight><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=cp>{%</span> <span class=k>html_attrs</span> <span class=nv>attrs</span> <span class=nv>defaults</span><span class=o>:</span><span class=nv>class</span><span class=o>=</span><span class=s2>&quot;default-class&quot;</span> <span class=nv>class</span><span class=o>=</span><span class=s2>&quot;extra-class&quot;</span> <span class=nv>data-id</span><span class=o>=</span><span class=s2>&quot;123&quot;</span> <span class=cp>%}</span>
</code></pre></div></p> <details class=quote> <summary>Source code in <code>src/django_components/templatetags/component_tags.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-285>285</a></span>
<span class=normal><a href=#__codelineno-0-286>286</a></span>
<span class=normal><a href=#__codelineno-0-287>287</a></span>
<span class=normal><a href=#__codelineno-0-288>288</a></span>
<span class=normal><a href=#__codelineno-0-289>289</a></span>
<span class=normal><a href=#__codelineno-0-290>290</a></span>
<span class=normal><a href=#__codelineno-0-291>291</a></span>
<span class=normal><a href=#__codelineno-0-292>292</a></span>
<span class=normal><a href=#__codelineno-0-293>293</a></span>
<span class=normal><a href=#__codelineno-0-294>294</a></span>
<span class=normal><a href=#__codelineno-0-295>295</a></span>
<span class=normal><a href=#__codelineno-0-296>296</a></span>
<span class=normal><a href=#__codelineno-0-297>297</a></span>
<span class=normal><a href=#__codelineno-0-298>298</a></span>
<span class=normal><a href=#__codelineno-0-299>299</a></span>
<span class=normal><a href=#__codelineno-0-300>300</a></span>
<span class=normal><a href=#__codelineno-0-301>301</a></span>
<span class=normal><a href=#__codelineno-0-302>302</a></span>
<span class=normal><a href=#__codelineno-0-303>303</a></span>
<span class=normal><a href=#__codelineno-0-304>304</a></span>
<span class=normal><a href=#__codelineno-0-305>305</a></span>
<span class=normal><a href=#__codelineno-0-306>306</a></span>
<span class=normal><a href=#__codelineno-0-307>307</a></span>
<span class=normal><a href=#__codelineno-0-308>308</a></span>
<span class=normal><a href=#__codelineno-0-309>309</a></span>
<span class=normal><a href=#__codelineno-0-310>310</a></span>
<span class=normal><a href=#__codelineno-0-311>311</a></span>
<span class=normal><a href=#__codelineno-0-312>312</a></span>
<span class=normal><a href=#__codelineno-0-313>313</a></span>
<span class=normal><a href=#__codelineno-0-314>314</a></span>
<span class=normal><a href=#__codelineno-0-315>315</a></span>
<span class=normal><a href=#__codelineno-0-316>316</a></span>
<span class=normal><a href=#__codelineno-0-317>317</a></span>
<span class=normal><a href=#__codelineno-0-318>318</a></span>
<span class=normal><a href=#__codelineno-0-319>319</a></span>
<span class=normal><a href=#__codelineno-0-320>320</a></span>
<span class=normal><a href=#__codelineno-0-321>321</a></span>
<span class=normal><a href=#__codelineno-0-322>322</a></span>
<span class=normal><a href=#__codelineno-0-323>323</a></span>
<span class=normal><a href=#__codelineno-0-324>324</a></span>
<span class=normal><a href=#__codelineno-0-325>325</a></span>
<span class=normal><a href=#__codelineno-0-326>326</a></span>
<span class=normal><a href=#__codelineno-0-327>327</a></span>
<span class=normal><a href=#__codelineno-0-328>328</a></span>
<span class=normal><a href=#__codelineno-0-329>329</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-285 name=__codelineno-0-285></a><span class=nd>@register</span><span class=o>.</span><span class=n>tag</span><span class=p>(</span><span class=s2>&quot;html_attrs&quot;</span><span class=p>)</span>
<a id=__codelineno-0-286 name=__codelineno-0-286></a><span class=k>def</span> <span class=nf>html_attrs</span><span class=p>(</span><span class=n>parser</span><span class=p>:</span> <span class=n>Parser</span><span class=p>,</span> <span class=n>token</span><span class=p>:</span> <span class=n>Token</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n>HtmlAttrsNode</span><span class=p>:</span>
<a id=__codelineno-0-287 name=__codelineno-0-287></a><span class=w> </span><span class=sd>&quot;&quot;&quot;</span>
<a id=__codelineno-0-288 name=__codelineno-0-288></a><span class=sd> This tag takes:</span>
<a id=__codelineno-0-289 name=__codelineno-0-289></a><span class=sd> - Optional dictionary of attributes (`attrs`)</span>
<a id=__codelineno-0-290 name=__codelineno-0-290></a><span class=sd> - Optional dictionary of defaults (`defaults`)</span>
<a id=__codelineno-0-291 name=__codelineno-0-291></a><span class=sd> - Additional kwargs that are appended to the former two</span>
<a id=__codelineno-0-292 name=__codelineno-0-292></a>
<a id=__codelineno-0-293 name=__codelineno-0-293></a><span class=sd> The inputs are merged and resulting dict is rendered as HTML attributes</span>
<a id=__codelineno-0-294 name=__codelineno-0-294></a><span class=sd> (`key=&quot;value&quot;`).</span>
<a id=__codelineno-0-295 name=__codelineno-0-295></a>
<a id=__codelineno-0-296 name=__codelineno-0-296></a><span class=sd> Rules:</span>
<a id=__codelineno-0-297 name=__codelineno-0-297></a><span class=sd> 1. Both `attrs` and `defaults` can be passed as positional args or as kwargs</span>
<a id=__codelineno-0-298 name=__codelineno-0-298></a><span class=sd> 2. Both `attrs` and `defaults` are optional (can be omitted)</span>
<a id=__codelineno-0-299 name=__codelineno-0-299></a><span class=sd> 3. Both `attrs` and `defaults` are dictionaries, and we can define them the same way</span>
<a id=__codelineno-0-300 name=__codelineno-0-300></a><span class=sd> we define dictionaries for the `component` tag. So either as `attrs=attrs` or</span>
<a id=__codelineno-0-301 name=__codelineno-0-301></a><span class=sd> `attrs:key=value`.</span>
<a id=__codelineno-0-302 name=__codelineno-0-302></a><span class=sd> 4. All other kwargs (`key=value`) are appended and can be repeated.</span>
<a id=__codelineno-0-303 name=__codelineno-0-303></a>
<a id=__codelineno-0-304 name=__codelineno-0-304></a><span class=sd> Normal kwargs (`key=value`) are concatenated to existing keys. So if e.g. key</span>
<a id=__codelineno-0-305 name=__codelineno-0-305></a><span class=sd> &quot;class&quot; is supplied with value &quot;my-class&quot;, then adding `class=&quot;extra-class&quot;`</span>
<a id=__codelineno-0-306 name=__codelineno-0-306></a><span class=sd> will result in `class=&quot;my-class extra-class&quot;.</span>
<a id=__codelineno-0-307 name=__codelineno-0-307></a>
<a id=__codelineno-0-308 name=__codelineno-0-308></a><span class=sd> Example:</span>
<a id=__codelineno-0-309 name=__codelineno-0-309></a><span class=sd> ```htmldjango</span>
<a id=__codelineno-0-310 name=__codelineno-0-310></a><span class=sd> {% html_attrs attrs defaults:class=&quot;default-class&quot; class=&quot;extra-class&quot; data-id=&quot;123&quot; %}</span>
<a id=__codelineno-0-311 name=__codelineno-0-311></a><span class=sd> ```</span>
<a id=__codelineno-0-312 name=__codelineno-0-312></a><span class=sd> &quot;&quot;&quot;</span>
<a id=__codelineno-0-313 name=__codelineno-0-313></a> <span class=n>bits</span> <span class=o>=</span> <span class=n>token</span><span class=o>.</span><span class=n>split_contents</span><span class=p>()</span>
<a id=__codelineno-0-314 name=__codelineno-0-314></a>
<a id=__codelineno-0-315 name=__codelineno-0-315></a> <span class=n>tag</span> <span class=o>=</span> <span class=n>_parse_tag</span><span class=p>(</span>
<a id=__codelineno-0-316 name=__codelineno-0-316></a> <span class=s2>&quot;html_attrs&quot;</span><span class=p>,</span>
<a id=__codelineno-0-317 name=__codelineno-0-317></a> <span class=n>parser</span><span class=p>,</span>
<a id=__codelineno-0-318 name=__codelineno-0-318></a> <span class=n>bits</span><span class=p>,</span>
<a id=__codelineno-0-319 name=__codelineno-0-319></a> <span class=n>params</span><span class=o>=</span><span class=p>[</span><span class=n>HTML_ATTRS_ATTRS_KEY</span><span class=p>,</span> <span class=n>HTML_ATTRS_DEFAULTS_KEY</span><span class=p>],</span>
<a id=__codelineno-0-320 name=__codelineno-0-320></a> <span class=n>optional_params</span><span class=o>=</span><span class=p>[</span><span class=n>HTML_ATTRS_ATTRS_KEY</span><span class=p>,</span> <span class=n>HTML_ATTRS_DEFAULTS_KEY</span><span class=p>],</span>
<a id=__codelineno-0-321 name=__codelineno-0-321></a> <span class=n>flags</span><span class=o>=</span><span class=p>[],</span>
<a id=__codelineno-0-322 name=__codelineno-0-322></a> <span class=n>keywordonly_kwargs</span><span class=o>=</span><span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-323 name=__codelineno-0-323></a> <span class=n>repeatable_kwargs</span><span class=o>=</span><span class=kc>True</span><span class=p>,</span>
<a id=__codelineno-0-324 name=__codelineno-0-324></a> <span class=p>)</span>
<a id=__codelineno-0-325 name=__codelineno-0-325></a>
<a id=__codelineno-0-326 name=__codelineno-0-326></a> <span class=k>return</span> <span class=n>HtmlAttrsNode</span><span class=p>(</span>
<a id=__codelineno-0-327 name=__codelineno-0-327></a> <span class=n>kwargs</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>kwargs</span><span class=p>,</span>
<a id=__codelineno-0-328 name=__codelineno-0-328></a> <span class=n>kwarg_pairs</span><span class=o>=</span><span class=n>tag</span><span class=o>.</span><span class=n>kwarg_pairs</span><span class=p>,</span>
<a id=__codelineno-0-329 name=__codelineno-0-329></a> <span class=p>)</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.types class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">types</span> <a href=#django_components.types class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <p>Helper types for IDEs.</p> <div class="doc doc-children"> </div> </div> </div> <div class="doc doc-object doc-module"> <h2 id=django_components.utils class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">utils</span> <a href=#django_components.utils class=headerlink title="Permanent link">¤</a></h2> <div class="doc doc-contents "> <div class="doc doc-children"> <div class="doc doc-object doc-function"> <h3 id=django_components.utils.gen_id class="doc doc-heading"> <code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">gen_id</span> <a href=#django_components.utils.gen_id class=headerlink title="Permanent link">¤</a></h3> <div class="doc-signature highlight"><pre><span></span><code><a id=__codelineno-0-1 name=__codelineno-0-1 href=#__codelineno-0-1></a><span class=n>gen_id</span><span class=p>(</span><span class=n>length</span><span class=p>:</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/functions.html#int>int</a></span> <span class=o>=</span> <span class=mi>5</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=n><a class="autorefs autorefs-external" href=https://docs.python.org/3.12/library/stdtypes.html#str>str</a></span>
</code></pre></div> <div class="doc doc-contents "> <p>Generate a unique ID that can be associated with a Node</p> <details class=quote> <summary>Source code in <code>src/django_components/utils.py</code></summary> <div class=highlight><table class=highlighttable><tr><td class=linenos><div class=linenodiv><pre><span></span><span class=normal><a href=#__codelineno-0-7> 7</a></span>
<span class=normal><a href=#__codelineno-0-8> 8</a></span>
<span class=normal><a href=#__codelineno-0-9> 9</a></span>
<span class=normal><a href=#__codelineno-0-10>10</a></span>
<span class=normal><a href=#__codelineno-0-11>11</a></span>
<span class=normal><a href=#__codelineno-0-12>12</a></span>
<span class=normal><a href=#__codelineno-0-13>13</a></span>
<span class=normal><a href=#__codelineno-0-14>14</a></span></pre></div></td><td class=code><div><pre><span></span><code><a id=__codelineno-0-7 name=__codelineno-0-7></a><span class=k>def</span> <span class=nf>gen_id</span><span class=p>(</span><span class=n>length</span><span class=p>:</span> <span class=nb>int</span> <span class=o>=</span> <span class=mi>5</span><span class=p>)</span> <span class=o>-&gt;</span> <span class=nb>str</span><span class=p>:</span>
<a id=__codelineno-0-8 name=__codelineno-0-8></a><span class=w> </span><span class=sd>&quot;&quot;&quot;Generate a unique ID that can be associated with a Node&quot;&quot;&quot;</span>
<a id=__codelineno-0-9 name=__codelineno-0-9></a> <span class=c1># Global counter to avoid conflicts</span>
<a id=__codelineno-0-10 name=__codelineno-0-10></a> <span class=k>global</span> <span class=n>_id</span>
<a id=__codelineno-0-11 name=__codelineno-0-11></a> <span class=n>_id</span> <span class=o>+=</span> <span class=mi>1</span>
<a id=__codelineno-0-12 name=__codelineno-0-12></a>
<a id=__codelineno-0-13 name=__codelineno-0-13></a> <span class=c1># Pad the ID with `0`s up to 4 digits, e.g. `0007`</span>
<a id=__codelineno-0-14 name=__codelineno-0-14></a> <span class=k>return</span> <span class=sa>f</span><span class=s2>&quot;</span><span class=si>{</span><span class=n>_id</span><span class=si>:</span><span class=s2>04</span><span class=si>}</span><span class=s2>&quot;</span>
</code></pre></div></td></tr></table></div> </details> </div> </div> </div> </div> </div> </div> </div> </div> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var tab,labels=set.querySelector(".tabbed-labels");for(tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg> Back to top </button> </main> <footer class=md-footer> <nav class="md-footer__inner md-grid" aria-label=Footer> <a href=../../license/ class="md-footer__link md-footer__link--prev" aria-label="Previous: License"> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </div> <div class=md-footer__title> <span class=md-footer__direction> Previous </span> <div class=md-ellipsis> License </div> </div> </a> <a href=app_settings/ class="md-footer__link md-footer__link--next" aria-label='Next: <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> app_settings'> <div class=md-footer__title> <span class=md-footer__direction> Next </span> <div class=md-ellipsis> <code class="doc-symbol doc-symbol-nav doc-symbol-module"></code> app_settings </div> </div> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> <div class=md-social> <a href=https://github.com/EmilStenstrom/django-components target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> </a> <a href=https://pypi.org/project/django-components/ target=_blank rel=noopener title=pypi.org class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <div class=md-progress data-md-component=progress role=progressbar></div> <script id=__config type=application/json>{"base": "../..", "features": ["content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.expand", "navigation.footer", "navigation.instant", "navigation.instant.progress", "navigation.indexes", "navigation.sections", "navigation.tracking", "navigation.top", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"default": ["latest", "dev"], "provider": "mike"}}</script> <script src=../../assets/javascripts/bundle.bd41221c.min.js></script> <script src=../../assets/_markdown_exec_pyodide.js></script> <script src=../../js/timeago.min.js></script> <script src=../../js/timeago_mkdocs_material.js></script> </body> </html>