<!doctype html> <html lang="fr" class="no-js"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="description" content="Le site de l'association des étudiants de l'UTBM"> <link rel="canonical" href="https://ae-utbm.github.io/sith/tutorial/fragments/"> <link rel="prev" href="../groups/"> <link rel="next" href="../etransaction/"> <link rel="icon" href="../../img/favicon.png"> <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11"> <title>Les fragments - Site AE UTBM</title> <link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.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/_mkdocstrings.css"> <link rel="stylesheet" href="../../stylesheets/extra.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> </head> <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="deeppurple" data-md-color-accent="deeppurple"> <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="#quest-ce-quun-fragment" class="md-skip"> Aller au contenu </a> </div> <div data-md-component="announce"> </div> <header class="md-header md-header--shadow" data-md-component="header"> <nav class="md-header__inner md-grid" aria-label="En-tête"> <a href="../.." title="Site AE UTBM" class="md-header__button md-logo" aria-label="Site AE UTBM" 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.54"/></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 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></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"> Site AE UTBM </span> </div> <div class="md-header__topic" data-md-component="header-topic"> <span class="md-ellipsis"> Les fragments </span> </div> </div> </div> <form class="md-header__option" data-md-component="palette"> <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="deeppurple" data-md-color-accent="deeppurple" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0"> <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg> </label> <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="blue" data-md-color-accent="blue" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1"> <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="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var 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(var[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.52 6.52 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 5"/></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="Rechercher" placeholder="Rechercher" 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.52 6.52 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 5"/></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 11z"/></svg> </label> <nav class="md-search__options" aria-label="Recherche"> <button type="reset" class="md-search__icon md-icon" title="Effacer" aria-label="Effacer" 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 12z"/></svg> </button> </nav> </form> <div class="md-search__output"> <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> <div class="md-search-result" data-md-component="search-result"> <div class="md-search-result__meta"> Initialisation de la recherche </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/ae-utbm/sith" title="Aller au dépôt" 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 448 512"><!--! Font Awesome Free 6.7.2 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 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class="md-source__repository"> sith </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="Site AE UTBM" class="md-nav__button md-logo" aria-label="Site AE UTBM" 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.54"/></svg> </a> Site AE UTBM </label> <div class="md-nav__source"> <a href="https://github.com/ae-utbm/sith" title="Aller au dépôt" 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 448 512"><!--! Font Awesome Free 6.7.2 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 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class="md-source__repository"> sith </div> </a> </div> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../.." class="md-nav__link"> <span class="md-ellipsis"> Accueil </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" > <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> <span class="md-ellipsis"> Explications </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="false"> <label class="md-nav__title" for="__nav_2"> <span class="md-nav__icon md-icon"></span> Explications </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../explanation/" class="md-nav__link"> <span class="md-ellipsis"> Accueil </span> </a> </li> <li class="md-nav__item"> <a href="../../explanation/technos/" class="md-nav__link"> <span class="md-ellipsis"> Technologies utilisées </span> </a> </li> <li class="md-nav__item"> <a href="../../explanation/conventions/" class="md-nav__link"> <span class="md-ellipsis"> Conventions </span> </a> </li> <li class="md-nav__item"> <a href="../../explanation/archives/" class="md-nav__link"> <span class="md-ellipsis"> Archives </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> <span class="md-ellipsis"> Tutoriels </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> <label class="md-nav__title" for="__nav_3"> <span class="md-nav__icon md-icon"></span> Tutoriels </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../install/" class="md-nav__link"> <span class="md-ellipsis"> Installer le projet </span> </a> </li> <li class="md-nav__item"> <a href="../install-advanced/" class="md-nav__link"> <span class="md-ellipsis"> Installer le projet (avancé) </span> </a> </li> <li class="md-nav__item"> <a href="../devtools/" class="md-nav__link"> <span class="md-ellipsis"> Configurer son éditeur </span> </a> </li> <li class="md-nav__item"> <a href="../structure/" class="md-nav__link"> <span class="md-ellipsis"> Structure du projet </span> </a> </li> <li class="md-nav__item"> <a href="../perms/" class="md-nav__link"> <span class="md-ellipsis"> Gestion des permissions </span> </a> </li> <li class="md-nav__item"> <a href="../groups/" class="md-nav__link"> <span class="md-ellipsis"> Gestion des groupes </span> </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> <label class="md-nav__link md-nav__link--active" for="__toc"> <span class="md-ellipsis"> Les fragments </span> <span class="md-nav__icon md-icon"></span> </label> <a href="./" class="md-nav__link md-nav__link--active"> <span class="md-ellipsis"> Les fragments </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table des matières"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table des matières </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#quest-ce-quun-fragment" class="md-nav__link"> <span class="md-ellipsis"> Qu'est-ce qu'un fragment </span> </a> </li> <li class="md-nav__item"> <a href="#htmx" class="md-nav__link"> <span class="md-ellipsis"> HTMX </span> </a> </li> <li class="md-nav__item"> <a href="#la-surcouche-du-site" class="md-nav__link"> <span class="md-ellipsis"> La surcouche du site </span> </a> <nav class="md-nav" aria-label="La surcouche du site"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#allowfragment" class="md-nav__link"> <span class="md-ellipsis"> AllowFragment </span> </a> </li> <li class="md-nav__item"> <a href="#fragmentmixin" class="md-nav__link"> <span class="md-ellipsis"> FragmentMixin </span> </a> </li> <li class="md-nav__item"> <a href="#usefragmentsmixin" class="md-nav__link"> <span class="md-ellipsis"> UseFragmentsMixin </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="../etransaction/" class="md-nav__link"> <span class="md-ellipsis"> Etransactions </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" > <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0"> <span class="md-ellipsis"> How-to </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4"> <span class="md-nav__icon md-icon"></span> How-to </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../howto/querysets/" class="md-nav__link"> <span class="md-ellipsis"> L'ORM de Django </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/migrations/" class="md-nav__link"> <span class="md-ellipsis"> Gérer les migrations </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/translation/" class="md-nav__link"> <span class="md-ellipsis"> Gérer les traductions </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/statics/" class="md-nav__link"> <span class="md-ellipsis"> Gérer les statics </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/js-import-paths/" class="md-nav__link"> <span class="md-ellipsis"> Ajouter un chemin d'import javascript </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/prod/" class="md-nav__link"> <span class="md-ellipsis"> Configurer pour la production </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/logo/" class="md-nav__link"> <span class="md-ellipsis"> Ajouter un logo de promo </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/subscriptions/" class="md-nav__link"> <span class="md-ellipsis"> Ajouter une cotisation </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/weekmail/" class="md-nav__link"> <span class="md-ellipsis"> Modifier le weekmail </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/terminal/" class="md-nav__link"> <span class="md-ellipsis"> Terminal </span> </a> </li> <li class="md-nav__item"> <a href="../../howto/direnv/" class="md-nav__link"> <span class="md-ellipsis"> Direnv </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" > <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0"> <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_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5"> <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--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" > <label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0"> <span class="md-ellipsis"> antispam </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_1"> <span class="md-nav__icon md-icon"></span> antispam </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/antispam/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/antispam/forms/" class="md-nav__link"> <span class="md-ellipsis"> Forms </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" > <label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0"> <span class="md-ellipsis"> club </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_2"> <span class="md-nav__icon md-icon"></span> club </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/club/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/club/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_3" > <label class="md-nav__link" for="__nav_5_3" id="__nav_5_3_label" tabindex="0"> <span class="md-ellipsis"> com </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_3"> <span class="md-nav__icon md-icon"></span> com </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/com/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/com/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_4" > <label class="md-nav__link" for="__nav_5_4" id="__nav_5_4_label" tabindex="0"> <span class="md-ellipsis"> core </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_4"> <span class="md-nav__icon md-icon"></span> core </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/core/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/core/model_fields/" class="md-nav__link"> <span class="md-ellipsis"> Champs de modèle </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/core/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/core/mixins/" class="md-nav__link"> <span class="md-ellipsis"> Mixins </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/core/schemas/" class="md-nav__link"> <span class="md-ellipsis"> Schemas </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/core/auth/" class="md-nav__link"> <span class="md-ellipsis"> Auth </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_5" > <label class="md-nav__link" for="__nav_5_5" id="__nav_5_5_label" tabindex="0"> <span class="md-ellipsis"> counter </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_5"> <span class="md-nav__icon md-icon"></span> counter </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/counter/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/counter/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/counter/schemas/" class="md-nav__link"> <span class="md-ellipsis"> Schemas </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_6" > <label class="md-nav__link" for="__nav_5_6" id="__nav_5_6_label" tabindex="0"> <span class="md-ellipsis"> eboutic </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_6_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_6"> <span class="md-nav__icon md-icon"></span> eboutic </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/eboutic/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/eboutic/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_7" > <label class="md-nav__link" for="__nav_5_7" id="__nav_5_7_label" tabindex="0"> <span class="md-ellipsis"> election </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_7_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_7"> <span class="md-nav__icon md-icon"></span> election </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/election/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/election/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_8" > <label class="md-nav__link" for="__nav_5_8" id="__nav_5_8_label" tabindex="0"> <span class="md-ellipsis"> forum </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_8_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_8"> <span class="md-nav__icon md-icon"></span> forum </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/forum/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/forum/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_9" > <label class="md-nav__link" for="__nav_5_9" id="__nav_5_9_label" tabindex="0"> <span class="md-ellipsis"> galaxy </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_9_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_9"> <span class="md-nav__icon md-icon"></span> galaxy </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/galaxy/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/galaxy/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_10" > <label class="md-nav__link" for="__nav_5_10" id="__nav_5_10_label" tabindex="0"> <span class="md-ellipsis"> launderette </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_10_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_10"> <span class="md-nav__icon md-icon"></span> launderette </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/launderette/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/launderette/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_11" > <label class="md-nav__link" for="__nav_5_11" id="__nav_5_11_label" tabindex="0"> <span class="md-ellipsis"> matmat </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_11_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_11"> <span class="md-nav__icon md-icon"></span> matmat </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/matmat/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/matmat/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_12" > <label class="md-nav__link" for="__nav_5_12" id="__nav_5_12_label" tabindex="0"> <span class="md-ellipsis"> pedagogy </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_12_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_12"> <span class="md-nav__icon md-icon"></span> pedagogy </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/pedagogy/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/pedagogy/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/pedagogy/schemas/" class="md-nav__link"> <span class="md-ellipsis"> Schemas </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_13" > <label class="md-nav__link" for="__nav_5_13" id="__nav_5_13_label" tabindex="0"> <span class="md-ellipsis"> rootplace </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_13_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_13"> <span class="md-nav__icon md-icon"></span> rootplace </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/rootplace/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/rootplace/forms/" class="md-nav__link"> <span class="md-ellipsis"> Forms </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/rootplace/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_14" > <label class="md-nav__link" for="__nav_5_14" id="__nav_5_14_label" tabindex="0"> <span class="md-ellipsis"> sas </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_14_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_14"> <span class="md-nav__icon md-icon"></span> sas </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/sas/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/sas/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/sas/schemas/" class="md-nav__link"> <span class="md-ellipsis"> Schemas </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_15" > <label class="md-nav__link" for="__nav_5_15" id="__nav_5_15_label" tabindex="0"> <span class="md-ellipsis"> staticfiles </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_15_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_15"> <span class="md-nav__icon md-icon"></span> staticfiles </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/staticfiles/apps/" class="md-nav__link"> <span class="md-ellipsis"> Apps </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/staticfiles/storage/" class="md-nav__link"> <span class="md-ellipsis"> Storage </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/staticfiles/finders/" class="md-nav__link"> <span class="md-ellipsis"> Finders </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/staticfiles/processors/" class="md-nav__link"> <span class="md-ellipsis"> Processors </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_16" > <label class="md-nav__link" for="__nav_5_16" id="__nav_5_16_label" tabindex="0"> <span class="md-ellipsis"> subscription </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_16_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_16"> <span class="md-nav__icon md-icon"></span> subscription </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/subscription/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/subscription/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_17" > <label class="md-nav__link" for="__nav_5_17" id="__nav_5_17_label" tabindex="0"> <span class="md-ellipsis"> trombi </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_17_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5_17"> <span class="md-nav__icon md-icon"></span> trombi </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../reference/trombi/models/" class="md-nav__link"> <span class="md-ellipsis"> Models </span> </a> </li> <li class="md-nav__item"> <a href="../../reference/trombi/views/" class="md-nav__link"> <span class="md-ellipsis"> Views </span> </a> </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 des matières"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table des matières </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#quest-ce-quun-fragment" class="md-nav__link"> <span class="md-ellipsis"> Qu'est-ce qu'un fragment </span> </a> </li> <li class="md-nav__item"> <a href="#htmx" class="md-nav__link"> <span class="md-ellipsis"> HTMX </span> </a> </li> <li class="md-nav__item"> <a href="#la-surcouche-du-site" class="md-nav__link"> <span class="md-ellipsis"> La surcouche du site </span> </a> <nav class="md-nav" aria-label="La surcouche du site"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#allowfragment" class="md-nav__link"> <span class="md-ellipsis"> AllowFragment </span> </a> </li> <li class="md-nav__item"> <a href="#fragmentmixin" class="md-nav__link"> <span class="md-ellipsis"> FragmentMixin </span> </a> </li> <li class="md-nav__item"> <a href="#usefragmentsmixin" class="md-nav__link"> <span class="md-ellipsis"> UseFragmentsMixin </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"> <h1>Les fragments</h1> <h2 id="quest-ce-quun-fragment">Qu'est-ce qu'un fragment<a class="headerlink" href="#quest-ce-quun-fragment" title="Permanent link">¶</a></h2> <p>Une application web django traditionnelle suit en général le schéma suivant : </p> <ol> <li>l'utilisateur envoie une requête au serveur</li> <li>le serveur renvoie une page HTML, qui contient en général des liens et/ou des formulaires</li> <li>lorsque l'utilisateur clique sur un lien ou valide un formulaire, on retourne à l'étape 1</li> </ol> <p>C'est un processus qui marche, mais qui est lourd : générer une page entière demande du travail au serveur et effectuer le rendu de cette page en demande également beaucoup au client. Or, des temps de chargement plus longs et des rechargements complets de page peuvent nuire à l'expérience utilisateur, en particulier lorsqu'ils interviennent lors d'opérations simples.</p> <p>Pour éviter ce genre de rechargement complet, on peut utiliser AlpineJS pour rendre la page interactive et effectuer des appels à l'API. Cette technique fonctionne particulièrement bien lorsqu'on veut afficher des objets ou des listes d'objets de manière dynamique.</p> <p>En revanche, elle est moins efficace pour certaines opérations, telles que la validation de formulaire. En effet, valider un formulaire demande beaucoup de travail de nettoyage des données et d'affichage des messages d'erreur appropriés. Or, tout ce travail existe déjà dans django.</p> <p>On veut donc, dans ces cas-là, ne pas demander toute une page HTML au serveur, mais uniquement une toute petite partie, que l'on utilisera pour remplacer la partie qui correspond sur la page actuelle. Ce sont des fragments.</p> <h2 id="htmx">HTMX<a class="headerlink" href="#htmx" title="Permanent link">¶</a></h2> <p>Toutes les fonctionnalités d'interaction avec les fragments, côté client, s'appuient sur la librairie htmx.</p> <p>L'usage qui en est fait est en général assez simple et ressemblera souvent à ça :</p> <div class="language-html+jinja highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="p"><</span><span class="nt">form</span> </span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="na">hx-trigger</span><span class="o">=</span><span class="s">"submit"</span> <span class="c">{# Lorsque le formulaire est validé... #}</span> </span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="na">hx-post</span><span class="o">=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">url</span><span class="o">(</span><span class="s2">"foo:bar"</span><span class="o">)</span> <span class="cp">}}</span><span class="s">"</span> <span class="c">{# ...envoie une requête POST vers l'url donnée... #}</span> </span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> <span class="na">hx-swap</span><span class="o">=</span><span class="s">"outerHTML"</span> <span class="c">{# ...et remplace tout l'html du formulaire par le contenu de la réponse HTTP #}</span> </span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="p">></span> </span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="cp">{%</span> <span class="k">csrf_token</span> <span class="cp">%}</span> </span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="cp">{{</span> <span class="nv">form</span> <span class="cp">}}</span> </span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="p"><</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span> <span class="na">value</span><span class="o">=</span><span class="s">"</span><span class="cp">{%</span> <span class="k">trans</span> <span class="cp">%}</span><span class="s">Go</span><span class="cp">{%</span> <span class="k">endtrans</span> <span class="cp">%}</span><span class="s">"</span><span class="p">/></span> </span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="p"></</span><span class="nt">form</span><span class="p">></span> </span></code></pre></div> <p>C'est la majorité de ce que vous avez besoin de savoir pour utiliser HTMX sur le site.</p> <p>Bien entendu, ce n'est pas tout, il y a d'autres options et certaines subtilités, mais pour ça, consultez <a href="https://htmx.org/docs/">la doc officielle d'HTMX</a>.</p> <h2 id="la-surcouche-du-site">La surcouche du site<a class="headerlink" href="#la-surcouche-du-site" title="Permanent link">¶</a></h2> <p>Pour faciliter et standardiser l'intégration d'HTMX dans la base de code du site AE, nous avons créé certains mixins à utiliser dans les vues basées sur des classes.</p> <h3 id="allowfragment"><a class="autorefs autorefs-internal" href="../../reference/core/mixins/#core.views.mixins.AllowFragment">AllowFragment</a><a class="headerlink" href="#allowfragment" title="Permanent link">¶</a></h3> <p><code>AllowFragment</code> est extrêmement simple dans son concept : il met à disposition la variable <code>is_fragment</code>, qui permet de savoir si la vue est appelée par HTMX, ou si elle provient d'un autre contexte.</p> <p>Grâce à ça, on peut écrire des vues qui fonctionnent dans les deux contextes.</p> <p>Par exemple, supposons que nous avons une <code>EditView</code> très simple, contenant uniquement un formulaire. On peut écrire la vue et le template de la manière suivante :</p> <div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1"><code>views.py</code></label><label for="__tabbed_1_2"><code>app/foo.jinja</code></label></div> <div class="tabbed-content"> <div class="tabbed-block"> <div class="language-python highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.views.generic</span><span class="w"> </span><span class="kn">import</span> <span class="n">UpdateView</span> </span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> </span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> </span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooUpdateView</span><span class="p">(</span><span class="n">UpdateView</span><span class="p">):</span> </span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">Foo</span> </span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">]</span> </span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> <span class="n">pk_url_kwarg</span> <span class="o">=</span> <span class="s2">"foo_id"</span> </span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">"app/foo.jinja"</span> </span></code></pre></div> </div> <div class="tabbed-block"> <div class="language-html+jinja highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="cp">{%</span> <span class="k">if</span> <span class="nv">is_fragment</span> <span class="cp">%}</span> </span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> <span class="cp">{%</span> <span class="k">extends</span> <span class="s2">"core/base_fragment.jinja"</span> <span class="cp">%}</span> </span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="cp">{%</span> <span class="k">else</span> <span class="cp">%}</span> </span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="cp">{%</span> <span class="k">extends</span> <span class="s2">"core/base.jinja"</span> <span class="cp">%}</span> </span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span> </span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> </span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}</span> </span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="p"><</span><span class="nt">form</span> <span class="na">hx-trigger</span><span class="o">=</span><span class="s">"submit"</span> <span class="na">hx-swap</span><span class="o">=</span><span class="s">"outerHTML"</span><span class="p">></span> </span><span id="__span-2-9"><a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a> <span class="cp">{%</span> <span class="k">csrf_token</span> <span class="cp">%}</span> </span><span id="__span-2-10"><a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> <span class="cp">{{</span> <span class="nv">form</span> <span class="cp">}}</span> </span><span id="__span-2-11"><a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a> <span class="p"><</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span> <span class="na">value</span><span class="o">=</span><span class="s">"</span><span class="cp">{%</span> <span class="k">trans</span> <span class="cp">%}</span><span class="s">Go</span><span class="cp">{%</span> <span class="k">endtrans</span> <span class="cp">%}</span><span class="s">"</span><span class="p">/></span> </span><span id="__span-2-12"><a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> <span class="p"></</span><span class="nt">form</span><span class="p">></span> </span><span id="__span-2-13"><a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a><span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span> </span></code></pre></div> </div> </div> </div> <p>Lors du chargement initial de la page, le template entier sera rendu, mais lors de la soumission du formulaire, seul le fragment html de ce dernier sera changé.</p> <h3 id="fragmentmixin"><a class="autorefs autorefs-internal" href="../../reference/core/mixins/#core.views.mixins.FragmentMixin">FragmentMixin</a><a class="headerlink" href="#fragmentmixin" title="Permanent link">¶</a></h3> <p>Il arrive des situations où le résultat que l'on veut accomplir est plus complexe. Dans ces situations, pouvoir décomposer une vue en plusieurs vues de fragment permet de ne plus raisonner en termes de condition, mais en termes de composition : on n'a pas un seul template qui peut changer les situations, on a plusieurs templates que l'on injecte dans un template principal.</p> <p>Supposons, par exemple, que nous n'avons plus un, mais deux formulaires à afficher sur la page. Dans ce cas, nous pouvons créer deux templates, qui seront alors injectés.</p> <div class="tabbed-set tabbed-alternate" data-tabs="2:5"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><input id="__tabbed_2_5" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1"><code>urls.py</code></label><label for="__tabbed_2_2"><code>view.py</code></label><label for="__tabbed_2_3"><code>app/fragment/create_foo.jinja</code></label><label for="__tabbed_2_4"><code>app/fragment/update_foo.jinja</code></label><label for="__tabbed_2_5"><code>app/foo.jinja</code></label></div> <div class="tabbed-content"> <div class="tabbed-block"> <div class="language-python highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.urls</span><span class="w"> </span><span class="kn">import</span> <span class="n">path</span> </span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a> </span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="kn">from</span><span class="w"> </span><span class="nn">app</span><span class="w"> </span><span class="kn">import</span> <span class="n">views</span> </span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a> </span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">[</span> </span><span id="__span-3-6"><a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> <span class="n">path</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="n">FooCompositeView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s2">"main"</span><span class="p">),</span> </span><span id="__span-3-7"><a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a> <span class="n">path</span><span class="p">(</span><span class="s2">"create/"</span><span class="p">,</span> <span class="n">FooUpdateFragment</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s2">"update_foo"</span><span class="p">),</span> </span><span id="__span-3-8"><a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a> <span class="n">path</span><span class="p">(</span><span class="s2">"update/"</span><span class="p">,</span> <span class="n">FooCreateFragment</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s2">"create_foo"</span><span class="p">),</span> </span><span id="__span-3-9"><a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="p">]</span> </span></code></pre></div> </div> <div class="tabbed-block"> <div class="language-python highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.views.generic</span><span class="w"> </span><span class="kn">import</span> <span class="n">CreateView</span><span class="p">,</span> <span class="n">UpdateView</span><span class="p">,</span> <span class="n">TemplateView</span> </span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.views.mixins</span><span class="w"> </span><span class="kn">import</span> <span class="n">FragmentMixin</span> </span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a> </span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a> </span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooCreateFragment</span><span class="p">(</span><span class="n">FragmentMixin</span><span class="p">,</span> <span class="n">CreateView</span><span class="p">):</span> </span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">Foo</span> </span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">]</span> </span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">"app/fragments/create_foo.jinja"</span> </span><span id="__span-4-9"><a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a> </span><span id="__span-4-10"><a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a> </span><span id="__span-4-11"><a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooUpdateFragment</span><span class="p">(</span><span class="n">FragmentMixin</span><span class="p">,</span> <span class="n">UpdateView</span><span class="p">):</span> </span><span id="__span-4-12"><a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">Foo</span> </span><span id="__span-4-13"><a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">]</span> </span><span id="__span-4-14"><a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a> <span class="n">pk_url_kwarg</span> <span class="o">=</span> <span class="s2">"foo_id"</span> </span><span id="__span-4-15"><a id="__codelineno-4-15" name="__codelineno-4-15" href="#__codelineno-4-15"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">"app/fragments/update_foo.jinja"</span> </span><span id="__span-4-16"><a id="__codelineno-4-16" name="__codelineno-4-16" href="#__codelineno-4-16"></a> </span><span id="__span-4-17"><a id="__codelineno-4-17" name="__codelineno-4-17" href="#__codelineno-4-17"></a> </span><span id="__span-4-18"><a id="__codelineno-4-18" name="__codelineno-4-18" href="#__codelineno-4-18"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooCompositeFormView</span><span class="p">(</span><span class="n">TemplateView</span><span class="p">):</span> </span><span id="__span-4-19"><a id="__codelineno-4-19" name="__codelineno-4-19" href="#__codelineno-4-19"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">"app/foo.jinja"</span> </span><span id="__span-4-20"><a id="__codelineno-4-20" name="__codelineno-4-20" href="#__codelineno-4-20"></a> </span><span id="__span-4-21"><a id="__codelineno-4-21" name="__codelineno-4-21" href="#__codelineno-4-21"></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> </span><span id="__span-4-22"><a id="__codelineno-4-22" name="__codelineno-4-22" href="#__codelineno-4-22"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_context_data</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">|</span> <span class="p">{</span> </span><span id="__span-4-23"><a id="__codelineno-4-23" name="__codelineno-4-23" href="#__codelineno-4-23"></a> <span class="s2">"create_fragment"</span><span class="p">:</span> <span class="n">FooCreateFragment</span><span class="o">.</span><span class="n">as_fragment</span><span class="p">()(),</span> </span><span id="__span-4-24"><a id="__codelineno-4-24" name="__codelineno-4-24" href="#__codelineno-4-24"></a> <span class="s2">"update_fragment"</span><span class="p">:</span> <span class="n">FooUpdateFragment</span><span class="o">.</span><span class="n">as_fragment</span><span class="p">()(</span><span class="n">foo_id</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> </span><span id="__span-4-25"><a id="__codelineno-4-25" name="__codelineno-4-25" href="#__codelineno-4-25"></a> <span class="p">}</span> </span></code></pre></div> </div> <div class="tabbed-block"> <div class="language-html+jinja highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="p"><</span><span class="nt">form</span> </span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a> <span class="na">hx-trigger</span><span class="o">=</span><span class="s">"submit"</span> </span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a> <span class="na">hx-post</span><span class="o">=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">url</span><span class="o">(</span><span class="s2">"app:create_foo"</span><span class="o">)</span> <span class="cp">}}</span><span class="s">"</span> </span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a> <span class="na">hx-swap</span><span class="o">=</span><span class="s">"outerHTML"</span> </span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="p">></span> </span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> <span class="cp">{%</span> <span class="k">csrf_token</span> <span class="cp">%}</span> </span><span id="__span-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a> <span class="cp">{{</span> <span class="nv">form</span> <span class="cp">}}</span> </span><span id="__span-5-8"><a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a> <span class="p"><</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span> <span class="na">value</span><span class="o">=</span><span class="s">"</span><span class="cp">{%</span> <span class="k">trans</span> <span class="cp">%}</span><span class="s">Create</span><span class="cp">{%</span> <span class="k">endtrans</span> <span class="cp">%}</span><span class="s">"</span><span class="p">/></span> </span><span id="__span-5-9"><a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="p"></</span><span class="nt">form</span><span class="p">></span> </span></code></pre></div> </div> <div class="tabbed-block"> <div class="language-html+jinja highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="p"><</span><span class="nt">form</span> </span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a> <span class="na">hx-trigger</span><span class="o">=</span><span class="s">"submit"</span> </span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a> <span class="na">hx-post</span><span class="o">=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">url</span><span class="o">(</span><span class="s2">"app:update_foo"</span><span class="o">)</span> <span class="cp">}}</span><span class="s">"</span> </span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a> <span class="na">hx-swap</span><span class="o">=</span><span class="s">"outerHTML"</span> </span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="p">></span> </span><span id="__span-6-6"><a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a> <span class="cp">{%</span> <span class="k">csrf_token</span> <span class="cp">%}</span> </span><span id="__span-6-7"><a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a> <span class="cp">{{</span> <span class="nv">form</span> <span class="cp">}}</span> </span><span id="__span-6-8"><a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a> <span class="p"><</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"submit"</span> <span class="na">value</span><span class="o">=</span><span class="s">"</span><span class="cp">{%</span> <span class="k">trans</span> <span class="cp">%}</span><span class="s">Update</span><span class="cp">{%</span> <span class="k">endtrans</span> <span class="cp">%}</span><span class="s">"</span><span class="p">/></span> </span><span id="__span-6-9"><a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="p"></</span><span class="nt">form</span><span class="p">></span> </span></code></pre></div> </div> <div class="tabbed-block"> <div class="language-html+jinja highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="cp">{%</span> <span class="k">extends</span> <span class="s2">"core/base.html"</span> <span class="cp">%}</span> </span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a> </span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}</span> </span><span id="__span-7-4"><a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a> <span class="p"><</span><span class="nt">h2</span><span class="p">></span><span class="cp">{%</span> <span class="k">trans</span> <span class="cp">%}</span>Update current foo<span class="cp">{%</span> <span class="k">endtrans</span> <span class="cp">%}</span><span class="p"></</span><span class="nt">h2</span><span class="p">></span> </span><span id="__span-7-5"><a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a> <span class="cp">{{</span> <span class="nv">update_fragment</span> <span class="cp">}}</span> </span><span id="__span-7-6"><a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a> </span><span id="__span-7-7"><a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a> <span class="p"><</span><span class="nt">h2</span><span class="p">></span><span class="cp">{%</span> <span class="k">trans</span> <span class="cp">%}</span>Create new foo<span class="cp">{%</span> <span class="k">endtrans</span> <span class="cp">%}</span><span class="p"></</span><span class="nt">h2</span><span class="p">></span> </span><span id="__span-7-8"><a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a> <span class="cp">{{</span> <span class="nv">create_fragment</span> <span class="cp">}}</span> </span><span id="__span-7-9"><a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a><span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span> </span></code></pre></div> </div> </div> </div> <p>Le résultat consistera en l'affichage d'une page contenant deux formulaires. Le rendu des fragments n'est pas effectué par <code>FooCompositeView</code>, mais par les vues des fragments elles-mêmes, en sautant les méthodes <code>dispatch</code> et <code>get</code>/<code>post</code> de ces dernières. À chaque validation de formulaire, la requête sera envoyée à la vue responsable du fragment, qui se comportera alors comme une vue normale.</p> <h4 id="la-methode-as_fragment">La méthode <code>as_fragment</code><a class="headerlink" href="#la-methode-as_fragment" title="Permanent link">¶</a></h4> <p>Il est à noter que l'instantiation d'un fragment se fait en deux étapes :</p> <ul> <li>on commence par instantier la vue en tant que renderer.</li> <li>on appelle le renderer en lui-même</li> </ul> <p>Ce qui donne la syntaxe <code>Fragment.as_fragment()()</code>.</p> <p>Cette conception est une manière de se rapprocher le plus possible de l'interface déjà existante pour la méthode <code>as_view</code> des vues. La méthode <code>as_fragment</code> prend en argument les mêmes paramètres que <code>as_view</code>.</p> <p>Par exemple, supposons que nous voulons rajouter des variables de contexte lors du rendu du fragment. On peut écrire ça ainsi :</p> <div class="language-python highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="n">fragment</span> <span class="o">=</span> <span class="n">Fragment</span><span class="o">.</span><span class="n">as_fragment</span><span class="p">(</span><span class="n">extra_context</span><span class="o">=</span><span class="p">{</span><span class="s2">"foo"</span><span class="p">:</span> <span class="s2">"bar"</span><span class="p">})()</span> </span></code></pre></div> <h4 id="personnaliser-le-rendu">Personnaliser le rendu<a class="headerlink" href="#personnaliser-le-rendu" title="Permanent link">¶</a></h4> <p>En plus de la personnalisation permise par <code>as_fragment</code>, on peut surcharger la méthode <code>render_fragment</code> pour accomplir des actions spécifiques, et ce uniquement lorsqu'on effectue le rendu du fragment.</p> <p>Supposons qu'on veuille manipuler un entier dans la vue et que, lorsqu'on est en train de faire le rendu du template, on veuille augmenter la valeur de cet entier (c'est juste pour l'exemple). On peut écrire ça ainsi :</p> <div class="language-python highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.views.generic</span><span class="w"> </span><span class="kn">import</span> <span class="n">CreateView</span> </span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.views.mixins</span><span class="w"> </span><span class="kn">import</span> <span class="n">FragmentMixin</span> </span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a> </span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a> </span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooCreateFragment</span><span class="p">(</span><span class="n">FragmentMixin</span><span class="p">,</span> <span class="n">CreateView</span><span class="p">):</span> </span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a> <span class="n">model</span> <span class="o">=</span> <span class="n">Foo</span> </span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">]</span> </span><span id="__span-9-8"><a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">"app/fragments/create_foo.jinja"</span> </span><span id="__span-9-9"><a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a> </span><span id="__span-9-10"><a id="__codelineno-9-10" name="__codelineno-9-10" href="#__codelineno-9-10"></a> <span class="k">def</span><span class="w"> </span><span class="nf">render_fragment</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> </span><span id="__span-9-11"><a id="__codelineno-9-11" name="__codelineno-9-11" href="#__codelineno-9-11"></a> <span class="k">if</span> <span class="s2">"foo"</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span> </span><span id="__span-9-12"><a id="__codelineno-9-12" name="__codelineno-9-12" href="#__codelineno-9-12"></a> <span class="n">kwargs</span><span class="p">[</span><span class="s2">"foo"</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">2</span> </span><span id="__span-9-13"><a id="__codelineno-9-13" name="__codelineno-9-13" href="#__codelineno-9-13"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">render_fragment</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> </span></code></pre></div> <p>Et on effectuera le rendu du fragment de la manière suivante :</p> <div class="language-python highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="n">FooCreateFragment</span><span class="o">.</span><span class="n">as_fragment</span><span class="p">()(</span><span class="n">foo</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span> </span></code></pre></div> <h3 id="usefragmentsmixin"><a class="autorefs autorefs-internal" href="../../reference/core/mixins/#core.views.mixins.UseFragmentsMixin">UseFragmentsMixin</a><a class="headerlink" href="#usefragmentsmixin" title="Permanent link">¶</a></h3> <p>Lorsqu'on a plusieurs fragments, il est parfois plus aisé des les aggréger au sein de la vue principale en utilisant <code>UseFragmentsMixin</code>.</p> <p>Elle permet de marquer de manière plus explicite la séparation entre les fragments et le reste du contexte.</p> <p>Reprenons <code>FooUpdateFragment</code> et la version modifiée de <code>FooCreateFragment</code>. <code>FooCompositeView</code> peut être réécrite ainsi :</p> <div class="language-python highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.views.generic</span><span class="w"> </span><span class="kn">import</span> <span class="n">TemplateView</span> </span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.views.mixins</span><span class="w"> </span><span class="kn">import</span> <span class="n">UseFragmentsMixin</span> </span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a> </span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a> </span><span id="__span-11-5"><a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooCompositeFormView</span><span class="p">(</span><span class="n">UseFragmentsMixin</span><span class="p">,</span> <span class="n">TemplateView</span><span class="p">):</span> </span><span id="__span-11-6"><a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a> <span class="n">fragments</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-11-7"><a id="__codelineno-11-7" name="__codelineno-11-7" href="#__codelineno-11-7"></a> <span class="s2">"create_fragment"</span><span class="p">:</span> <span class="n">FooCreateFragment</span><span class="p">,</span> </span><span id="__span-11-8"><a id="__codelineno-11-8" name="__codelineno-11-8" href="#__codelineno-11-8"></a> <span class="s2">"update_fragment"</span><span class="p">:</span> <span class="n">FooUpdateFragment</span> </span><span id="__span-11-9"><a id="__codelineno-11-9" name="__codelineno-11-9" href="#__codelineno-11-9"></a> <span class="p">}</span> </span><span id="__span-11-10"><a id="__codelineno-11-10" name="__codelineno-11-10" href="#__codelineno-11-10"></a> <span class="n">fragment_data</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-11-11"><a id="__codelineno-11-11" name="__codelineno-11-11" href="#__codelineno-11-11"></a> <span class="s2">"update_fragment"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"foo"</span><span class="p">:</span> <span class="mi">4</span><span class="p">}</span> </span><span id="__span-11-12"><a id="__codelineno-11-12" name="__codelineno-11-12" href="#__codelineno-11-12"></a> <span class="p">}</span> </span><span id="__span-11-13"><a id="__codelineno-11-13" name="__codelineno-11-13" href="#__codelineno-11-13"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">"app/foo.jinja"</span> </span></code></pre></div> <p>Le résultat sera alors strictement le même.</p> <p>Pour personnaliser le rendu de tous les fragments, on peut également surcharger la méthode <code>get_fragment_context_data</code>. Cette méthode remplit les mêmes objectifs que <code>get_context_data</code>, mais uniquement pour les fragments. Il s'agit simplement d'un utilitaire pour séparer les responsabilités.</p> <div class="language-python highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">django.views.generic</span><span class="w"> </span><span class="kn">import</span> <span class="n">TemplateView</span> </span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">core.views.mixins</span><span class="w"> </span><span class="kn">import</span> <span class="n">UseFragmentsMixin</span> </span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a> </span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a> </span><span id="__span-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a><span class="k">class</span><span class="w"> </span><span class="nc">FooCompositeFormView</span><span class="p">(</span><span class="n">UseFragmentsMixin</span><span class="p">,</span> <span class="n">TemplateView</span><span class="p">):</span> </span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a> <span class="n">fragments</span> <span class="o">=</span> <span class="p">{</span> </span><span id="__span-12-7"><a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a> <span class="s2">"create_fragment"</span><span class="p">:</span> <span class="n">FooCreateFragment</span> </span><span id="__span-12-8"><a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a> <span class="p">}</span> </span><span id="__span-12-9"><a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">"app/foo.jinja"</span> </span><span id="__span-12-10"><a id="__codelineno-12-10" name="__codelineno-12-10" href="#__codelineno-12-10"></a> </span><span id="__span-12-11"><a id="__codelineno-12-11" name="__codelineno-12-11" href="#__codelineno-12-11"></a> <span class="k">def</span><span class="w"> </span><span class="nf">get_fragment_context_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> </span><span id="__span-12-12"><a id="__codelineno-12-12" name="__codelineno-12-12" href="#__codelineno-12-12"></a> <span class="c1"># let's render the update fragment here</span> </span><span id="__span-12-13"><a id="__codelineno-12-13" name="__codelineno-12-13" href="#__codelineno-12-13"></a> <span class="c1"># instead of using the class variables</span> </span><span id="__span-12-14"><a id="__codelineno-12-14" name="__codelineno-12-14" href="#__codelineno-12-14"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_fragment_context_data</span><span class="p">()</span> <span class="o">|</span> <span class="p">{</span> </span><span id="__span-12-15"><a id="__codelineno-12-15" name="__codelineno-12-15" href="#__codelineno-12-15"></a> <span class="s2">"create_fragment"</span><span class="p">:</span> <span class="n">FooUpdateFragment</span><span class="o">.</span><span class="n">as_fragment</span><span class="p">()(</span><span class="n">foo</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span> </span><span id="__span-12-16"><a id="__codelineno-12-16" name="__codelineno-12-16" href="#__codelineno-12-16"></a> <span class="p">}</span> </span></code></pre></div> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var 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> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Pied de page" > <a href="../groups/" class="md-footer__link md-footer__link--prev" aria-label="Précédent: Gestion des groupes"> <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 11z"/></svg> </div> <div class="md-footer__title"> <span class="md-footer__direction"> Précédent </span> <div class="md-ellipsis"> Gestion des groupes </div> </div> </a> <a href="../etransaction/" class="md-footer__link md-footer__link--next" aria-label="Suivant: Etransactions"> <div class="md-footer__title"> <span class="md-footer__direction"> Suivant </span> <div class="md-ellipsis"> Etransactions </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 11z"/></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> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.footer", "content.code.annotate", "content.code.copy", "content.tabs.link"], "search": "../../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copi\u00e9 dans le presse-papier", "clipboard.copy": "Copier dans le presse-papier", "search.result.more.one": "1 de plus sur cette page", "search.result.more.other": "# de plus sur cette page", "search.result.none": "Aucun document trouv\u00e9", "search.result.one": "1 document trouv\u00e9", "search.result.other": "# documents trouv\u00e9s", "search.result.placeholder": "Taper pour d\u00e9marrer la recherche", "search.result.term.missing": "Non trouv\u00e9", "select.version": "S\u00e9lectionner la version"}, "version": null}</script> <script src="../../assets/javascripts/bundle.c8b220af.min.js"></script> </body> </html>