<?xml
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://www.edualc.be/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Edualc's Blog</title>
	<link>https://edualc.be/</link>
	<description></description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.edualc.be/spip.php?page=backend" rel="self" type="application/rss+xml" />



	

	



<item xml:lang="fr">
		<title>Django -01- gestion des utilisateurs</title>
		<link>https://www.edualc.be/spip.php?article89</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article89</guid>
		<dc:date>2026-09-01T17:06:13Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;https://contentgardeningstudio.com/python/gerer-des-comptes-utilisateurs-et-profils-personnalises-pour-votre-site-django/ &lt;br class='autobr' /&gt;
https://openclassrooms.com/fr/courses/7192426-allez-plus-loin-avec-le-framework-django/7386368-personnalisez-le-modele-utilisateur &lt;br class='autobr' /&gt;
Notre ambition est de publier notre site. Mais pour qui et pour y faire quoi ? Nous voulons en rendre certaines parties publiques et d'autres restreintes &#224; des personnes choisies. Nous pouvons aussi donner des droits pour certaines parties (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique15" rel="directory"&gt;Django&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://contentgardeningstudio.com/python/gerer-des-comptes-utilisateurs-et-profils-personnalises-pour-votre-site-django/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://contentgardeningstudio.com/python/gerer-des-comptes-utilisateurs-et-profils-personnalises-pour-votre-site-django/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://openclassrooms.com/fr/courses/7192426-allez-plus-loin-avec-le-framework-django/7386368-personnalisez-le-modele-utilisateur&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://openclassrooms.com/fr/courses/7192426-allez-plus-loin-avec-le-framework-django/7386368-personnalisez-le-modele-utilisateur&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notre ambition est de publier notre site. Mais pour qui et pour y faire quoi ? Nous voulons en rendre certaines parties publiques et d'autres restreintes &#224; des personnes choisies. Nous pouvons aussi donner des droits pour certaines parties du site, &#224; des personnes autoris&#233;es, tels que cr&#233;er ou modifier tel ou tel article, telle ou telle donn&#233;e.&lt;/p&gt;
&lt;p&gt;Apr&#232;s avoir cr&#233;&#233; un projet lors de l'installation de Django, nous allons construire une application d'authentification &#224; partir de ces premiers principes : les utilisateurs pourront se connecter et se d&#233;connecter de notre application web.&lt;/p&gt;
&lt;p&gt;Django fournit un mod&#232;le d'utilisateurs, mais il peut ne pas r&#233;pondre &#224; tous nos besoins. Par exemple, nous pourrions vouloir ajouter des champs suppl&#233;mentaires comme une photo de profil ou des liens vers des r&#233;seaux sociaux. Dans ces cas, il est recommand&#233; de cr&#233;er un mod&#232;le d'utilisateur personnalis&#233;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Le mod&#232;le User&#182;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;class models.User&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;username&lt;/strong&gt;&#182; Obligatoire. Au maximum 150 caract&#232;res. Les noms d'utilisateur peuvent contenir des caract&#232;res alphanum&#233;riques (_, @, +, . et -).&lt;/li&gt;&lt;li&gt; &lt;strong&gt;first_name&lt;/strong&gt;&#182; Facultatif (blank=True). 150 caract&#232;res ou moins.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;last_name&lt;/strong&gt;&#182; Facultatif (blank=True). 150 caract&#232;res ou moins.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;email&lt;/strong&gt;&#182; Facultatif (blank=True). Adresse &#233;lectronique.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;password&lt;/strong&gt;&#182; Obligatoire. Une empreinte avec m&#233;tadonn&#233;es du mot de passe (Django ne stocke pas le mot de passe en clair). La longueur des mots de passe r&#233;els n'est pas limit&#233;e, ni les caract&#232;res qu'ils contiennent. Les m&#233;tadonn&#233;es de ce champ peuvent aussi marquer le mot de passe comme inutilisable. &lt;a href=&#034;https://docs.djangoproject.com/fr/6.1/topics/auth/passwords/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Voir la documentation sur les mots de passe&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;groups&lt;/strong&gt;&#182; Une relation plusieurs-&#224;-plusieurs vers Group.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;user_permissions&lt;/strong&gt;&#182; Une relation plusieurs-&#224;-plusieurs vers Permission.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;is_staff&lt;/strong&gt;&#182; Valeur bool&#233;enne. Permet &#224; cet utilisateur d'acc&#233;der au site d'administration.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;is_active&lt;/strong&gt;&#182; Valeur bool&#233;enne. Marque ce compte utilisateur comme actif. Nous recommandons de d&#233;finir ce drapeau &#224; False au lieu de supprimer le compte. Ainsi, si vos applications comportent des cl&#233;s &#233;trang&#232;res vers des utilisateurs, les cl&#233;s &#233;trang&#232;res ne seront pas cass&#233;es.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;avertissement&#034;&gt;Ceci ne d&#233;termine pas forc&#233;ment si l'utilisateur peut se connecter ou non. Les moteurs d'authentification ne sont pas oblig&#233;s de v&#233;rifier le drapeau is_active, mais le moteur par d&#233;faut (ModelBackend) et le moteur RemoteUserBackend le font. Vous pouvez utiliser AllowAllUsersModelBackend ou AllowAllUsersRemoteUserBackend si vous voulez autoriser les utilisateurs inactifs &#224; se connecter. Dans ce cas, vous devrez aussi adapter le formulaire AuthenticationForm utilis&#233; par la vue LoginView car il rejette les utilisateurs inactifs. Soyez conscient que les m&#233;thodes de contr&#244;le des permissions telles que has_perm() ainsi que l'authentification dans le site d'administration de Django renvoient toutes False pour les utilisateurs inactifs.&lt;/div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;is_superuser&lt;/strong&gt;&#182; Valeur bool&#233;enne. Consid&#232;re cet utilisateur comme ayant toutes les permissions sans devoir lui en attribuer aucune en particulier.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;last_login&lt;/strong&gt;&#182; Horodatage de la derni&#232;re connexion de l'utilisateur.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;date_joined&lt;/strong&gt;&#182; L'horodatage de la cr&#233;ation du compte.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Quatre possibilit&#233;s s'offrent &#224; nous :&lt;br class='autobr' /&gt;
1 - Ne rien faire. Django nous offre d&#233;j&#224; une solution acceptable&lt;br class='autobr' /&gt;
2 - Compl&#233;ter la solution offerte par Django en ajoutant des champs au mod&#232;le fourni par Django&lt;br class='autobr' /&gt;
3 - Compl&#233;ter la solution offerte par Django cr&#233;ant un enregistrement en relation 1 &#224; 1&lt;br class='autobr' /&gt;
4 - Partir d'une page blanche et tout d&#233;finir nous-m&#234;me.&lt;/p&gt;
&lt;p&gt;Nous choisirons les solutions 2 et 3, c-&#224;-d compl&#233;ter la solution existante et cr&#233;er un enregistrement qui compl&#233;tera les donn&#233;es de base&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Cr&#233;ation de l'application authentification&lt;/h2&gt;
&lt;p&gt;Les donn&#233;es Django&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://docs.djangoproject.com/fr/6.1/ref/contrib/auth/#fields&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://docs.djangoproject.com/fr/6.1/ref/contrib/auth/#fields&lt;/a&gt;&lt;br class='autobr' /&gt;
Pour cr&#233;er un mod&#232;le d'utilisateur personnalis&#233;, vous devez cr&#233;er une classe qui h&#233;rite de la classe abstraite&lt;/p&gt;
&lt;p&gt;il faut installer Pillow&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;python -m pip install Pillow&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&gt;&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;python manage.py migrate&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>D&#233;buts</title>
		<link>https://www.edualc.be/spip.php?article88</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article88</guid>
		<dc:date>2026-09-01T16:24:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;Initiation &#224; Affinity (Photo)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique19" rel="directory"&gt;Affinity&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://ch22.fr/numeric/affinity_photo/contenu.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Initiation &#224; Affinity (Photo)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SQLAlchemy - Op&#233;rations CRUD avec les Sessions SQLAlchemy</title>
		<link>https://www.edualc.be/spip.php?article87</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article87</guid>
		<dc:date>2026-08-22T14:37:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;La Session est le composant central de l'ORM SQLAlchemy. Elle impl&#233;mente le pattern Unit of Work : les modifications sont accumul&#233;es en m&#233;moire puis envoy&#233;es &#224; la base de donn&#233;es en une seule transaction lors du commit(). Cette approche garantit la coh&#233;rence des donn&#233;es et optimise les performances en regroupant les op&#233;rations. ``` &lt;br class='autobr' /&gt;
from sqlalchemy.orm import sessionmaker &lt;br class='autobr' /&gt;
# Cr&#233;er une factory de sessions SessionLocal = sessionmaker(bind=engine_dev) &lt;br class='autobr' /&gt;
# === CREATE : Ajouter des donn&#233;es === (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique17" rel="directory"&gt;SQLAlchemy&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;La Session est le composant central de l'ORM SQLAlchemy. Elle impl&#233;mente le pattern Unit of Work : les modifications sont accumul&#233;es en m&#233;moire puis envoy&#233;es &#224; la base de donn&#233;es en une seule transaction lors du commit(). Cette approche garantit la coh&#233;rence des donn&#233;es et optimise les performances en regroupant les op&#233;rations.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; from sqlalchemy.orm import sessionmaker # Cr&#233;er une factory de sessions SessionLocal = sessionmaker(bind=engine_dev) # === CREATE : Ajouter des donn&#233;es === with SessionLocal() as session: # Cr&#233;er un utilisateur avec des articles alice = Utilisateur( nom=&#034;Alice Dupont&#034;, email=&#034;alice@example.com&#034;, articles=[ Article(titre=&#034;Introduction &#224; Python&#034;, contenu=&#034;Python est un langage...&#034;), Article(titre=&#034;SQLAlchemy pour d&#233;butants&#034;, contenu=&#034;SQLAlchemy est un ORM...&#034;) ] ) session.add(alice) session.commit() print(f&#034;Cr&#233;&#233; : {alice}&#034;) print(f&#034;Articles : {alice.articles}&#034;) # Sortie : # Cr&#233;&#233; : Utilisateur(id=1, nom='Alice Dupont') # Articles : [Article(id=1, titre='Introduction &#224; Python'), Article(id=2, titre='SQLAlchemy pour d&#233;butants')] # === READ : Lire des donn&#233;es === with SessionLocal() as session: # Par cl&#233; primaire user = session.get(Utilisateur, 1) print(f&#034;Trouv&#233; : {user}&#034;) # Avec filtre from sqlalchemy import select stmt = select(Utilisateur).where(Utilisateur.email == &#034;alice@example.com&#034;) user = session.execute(stmt).scalar_one() print(f&#034;Par email : {user}&#034;) # Sortie : # Trouv&#233; : Utilisateur(id=1, nom='Alice Dupont') # Par email : Utilisateur(id=1, nom='Alice Dupont') # === UPDATE : Mettre &#224; jour === with SessionLocal() as session: user = session.get(Utilisateur, 1) user.nom = &#034;Alice Martin&#034; session.commit() print(f&#034;Mis &#224; jour : {user}&#034;) # Sortie : Mis &#224; jour : Utilisateur(id=1, nom='Alice Martin') # === DELETE : Supprimer === with SessionLocal() as session: user = session.get(Utilisateur, 1) session.delete(user) # Supprime aussi les articles (cascade) session.commit() print(&#034;Utilisateur et articles supprim&#233;s&#034;) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'utilisation du context manager with SessionLocal() as session garantit que la session est correctement ferm&#233;e, m&#234;me en cas d'exception. C'est une bonne pratique essentielle qui &#233;vite les fuites de connexions. En cas d'erreur pendant le commit, la session effectue automatiquement un rollback.&lt;/p&gt;
&lt;p&gt;Remarquez l'utilisation de select() au lieu de session.query(). La m&#233;thode session.query() est l'ancienne API 1.x, toujours fonctionnelle mais consid&#233;r&#233;e comme legacy. Le style 2.0 avec select() est plus explicite, plus composable et compatible avec le mode async. Adoptez-le syst&#233;matiquement pour tout nouveau code.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SQLAlchemy - D&#233;finir les Mod&#232;les avec le Nouveau Style D&#233;claratif 2.0</title>
		<link>https://www.edualc.be/spip.php?article86</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article86</guid>
		<dc:date>2026-08-21T14:30:13Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;tutoriel sqlalchemy Pr&#233;c&#233;dent &lt;br class='autobr' /&gt;
SQLAlchemy 2 introduit un nouveau style d&#233;claratif bas&#233; sur DeclarativeBase et Mapped. Ce style offre un typage natif complet compatible avec mypy et Pyright &lt;br class='autobr' /&gt;
Les annotations de type sont d&#233;sormais utilis&#233;es pour d&#233;finir les colonnes, ce qui rend le code plus lisible et v&#233;rifiable statiquement. &lt;br class='autobr' /&gt;
``` &lt;br class='autobr' /&gt;
from datetime import datetime from typing import Optional, List from sqlalchemy import String, ForeignKey, func from sqlalchemy.orm import ( (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique17" rel="directory"&gt;SQLAlchemy&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://tech-insider.org/fr/tutoriel-sqlalchemy-python-orm-crud-2026/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;tutoriel sqlalchemy&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;a href='https://www.edualc.be/spip.php?article85' class=&#034;spip_in&#034;&gt;Pr&#233;c&#233;dent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SQLAlchemy 2 introduit un nouveau style d&#233;claratif bas&#233; sur D&lt;i&gt;eclarativeBase&lt;/i&gt; et &lt;i&gt;Mapped&lt;/i&gt;. Ce style offre un typage natif complet compatible avec mypy et Pyright&lt;/p&gt;
&lt;p&gt;Les annotations de type sont d&#233;sormais utilis&#233;es pour d&#233;finir les colonnes, ce qui rend le code plus lisible et v&#233;rifiable statiquement.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; from datetime import datetime from typing import Optional, List from sqlalchemy import String, ForeignKey, func from sqlalchemy.orm import ( DeclarativeBase, Mapped, mapped_column, relationship, Session ) # Classe de base pour tous les mod&#232;les class Base(DeclarativeBase): pass # Mod&#232;le Utilisateur class Utilisateur(Base): __tablename__ = &#034;utilisateurs&#034; id: Mapped[int] = mapped_column(primary_key=True) nom: Mapped[str] = mapped_column(String(100)) email: Mapped[str] = mapped_column(String(255), unique=True, index=True) actif: Mapped[bool] = mapped_column(default=True) date_creation: Mapped[datetime] = mapped_column( server_default=func.now() ) # Relation one-to-many vers les articles articles: Mapped[List[&#034;Article&#034;]] = relationship( back_populates=&#034;auteur&#034;, cascade=&#034;all, delete-orphan&#034; ) def __repr__(self) -&gt; str: return f&#034;Utilisateur(id={self.id}, nom='{self.nom}')&#034; # Mod&#232;le Article class Article(Base): __tablename__ = &#034;articles&#034; id: Mapped[int] = mapped_column(primary_key=True) titre: Mapped[str] = mapped_column(String(200)) contenu: Mapped[str] = mapped_column(String(5000)) publie: Mapped[bool] = mapped_column(default=False) auteur_id: Mapped[int] = mapped_column(ForeignKey(&#034;utilisateurs.id&#034;)) date_publication: Mapped[Optional[datetime]] = mapped_column( nullable=True ) # Relation many-to-one vers l'utilisateur auteur: Mapped[&#034;Utilisateur&#034;] = relationship( back_populates=&#034;articles&#034; ) def __repr__(self) -&gt; str: return f&#034;Article(id={self.id}, titre='{self.titre}')&#034; # Cr&#233;er toutes les tables Base.metadata.create_all(engine_dev) print(&#034;Tables cr&#233;&#233;es avec succ&#232;s !&#034;) # Sortie : # CREATE TABLE utilisateurs (...) # CREATE TABLE articles (...) # Tables cr&#233;&#233;es avec succ&#232;s ! &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notez l'utilisation de Mapped[str] au lieu du classique Column(String). Ce nouveau style d&#233;claratif 2.0 apporte plusieurs avantages : autocompl&#233;tion dans les IDE, v&#233;rification de types statique, et une syntaxe plus concise. Le type Python Optional[datetime] se traduit automatiquement en colonne nullable, tandis que Mapped[str] cr&#233;e une colonne NOT NULL par d&#233;faut.&lt;/p&gt;
&lt;p&gt;La directive cascade=&#034;all, delete-orphan&#034; sur la relation articles signifie que la suppression d'un utilisateur supprime automatiquement tous ses articles. C'est le comportement souhait&#233; dans la plupart des cas, mais attention en production : v&#233;rifiez toujours que les cascades correspondent &#224; votre logique m&#233;tier.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SQLAlchemy - Cr&#233;er le Moteur et la Connexion &#224; la Base de Donn&#233;es</title>
		<link>https://www.edualc.be/spip.php?article85</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article85</guid>
		<dc:date>2026-08-16T15:19:07Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;tutoriel sqlalchemy Pr&#233;c&#233;dant &lt;br class='autobr' /&gt;
Engine &lt;br class='autobr' /&gt;
Le point de d&#233;part de toute application SQLAlchemy est un objet appel&#233; &#171; Engine &#187;. C'est le point d'entr&#233;e de toute interaction avec la base de donn&#233;es dans SQLAlchemy. Il g&#232;re le pool de connexions, le dialecte SQL sp&#233;cifique au SGBD, et la cr&#233;ation des connexions. Il est g&#233;n&#233;ralement cr&#233;&#233; une seule fois pour un serveur de base de donn&#233;es donn&#233;. Il est configur&#233; &#224; l'aide d'une cha&#238;ne d'URL d&#233;crivant la mani&#232;re de se connecter &#224; l'h&#244;te ou au (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique17" rel="directory"&gt;SQLAlchemy&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://tech-insider.org/fr/tutoriel-sqlalchemy-python-orm-crud-2026/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;tutoriel sqlalchemy&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;strong&gt;&lt;a href='https://www.edualc.be/spip.php?article84' class=&#034;spip_in&#034;&gt;Pr&#233;c&#233;dant&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Engine&lt;/h2&gt;
&lt;p&gt;Le point de d&#233;part de toute application SQLAlchemy est un objet appel&#233; &#171; &lt;strong&gt;Engine&lt;/strong&gt; &#187;.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; C'est le point d'entr&#233;e de toute interaction avec la base de donn&#233;es dans SQLAlchemy.&lt;/li&gt;&lt;li&gt; Il g&#232;re le pool de connexions, le dialecte SQL sp&#233;cifique au SGBD, et la cr&#233;ation des connexions.&lt;/li&gt;&lt;li&gt; Il est g&#233;n&#233;ralement cr&#233;&#233; une seule fois pour un serveur de base de donn&#233;es donn&#233;.&lt;/li&gt;&lt;li&gt; Il est configur&#233; &#224; l'aide d'une cha&#238;ne d'URL d&#233;crivant la mani&#232;re de se connecter &#224; l'h&#244;te ou au syst&#232;me backend de la base de donn&#233;es.&lt;/li&gt;&lt;li&gt; L'objet &lt;strong&gt;Engine&lt;/strong&gt; est cr&#233;&#233; &#224; l'aide de la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;create_engine()&lt;/code&gt;
&lt;div class='spip_document_18 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='https://www.edualc.be/IMG/png/sqla_engine_arch.png?1787305610' width='500' height='135' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;info-escal&#034;&gt;
rappel : La syntaxe g&#233;n&#233;rale des URL est la suivante : protocole:partie_sp&#233;cifique
&lt;p&gt;Les URL commencent par un protocole Internet ou autre suivi du caract&#232;re deux-points ; la partie_sp&#233;cifique est souvent constitu&#233;e d'un nom de domaine et / ou d'un chemin d'acc&#232;s.&lt;br class='autobr' /&gt;
exemples :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;https://www.lesoir.be/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://www.lesoir.be/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; sqlite+pysqlite :////mondisque/mesdonn&#233;es/mabasededonn&#233;es.db
&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;SQLite&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Protocole&lt;/strong&gt;&lt;br class='autobr' /&gt;
SQLite se connecte &#224; des bases de donn&#233;es bas&#233;es sur des fichiers, en utilisant par d&#233;faut le module int&#233;gr&#233; de Python &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sqlite3&lt;/code&gt;, sp&#233;cifi&#233; par &lt;strong&gt;sqlite&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La DBAPI Python est un pilote tiers qu'utilise SQLAlchemy pour interagir avec une base de donn&#233;es sp&#233;cifique. Ici, nous utilisons le nom &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;pysqlite&lt;/code&gt; qui, dans les usages actuels de Python, d&#233;signe l'interface de la biblioth&#232;que standard &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sqlite3&lt;/code&gt; pour SQLite. Si ce param&#232;tre est omis, SQLAlchemy utilisera une DBAPI par d&#233;faut adapt&#233;e &#224; la base de donn&#233;es choisie.&lt;/p&gt;
&lt;p&gt;Comme SQLite se connecte &#224; des fichiers locaux, l'URL est constitu&#233;e comme suit :&lt;br class='autobr' /&gt;
protocole -&gt; sqlite+pysqlite&lt;br class='autobr' /&gt;
partie_sp&#233;cifique -&gt; la partie &#171; file &#187; de l'URL correspond au nom du fichier de la base de donn&#233;es.&lt;/p&gt;
&lt;p&gt;Pour un &lt;strong&gt;chemin d'acc&#232;s relatif&lt;/strong&gt;, cela n&#233;cessite trois barres obliques :&lt;br class='autobr' /&gt;
# sqlite :///&#171; path &#187;&lt;br class='autobr' /&gt;
# o&#249; &#171; path &#187; est relatif&lt;br class='autobr' /&gt;
exemple : &lt;i&gt;engine = create_engine(&#034;sqlite+pysqlite :///foo.db&#034;)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Et pour un c&lt;strong&gt;hemin de fichier absolu&lt;/strong&gt;, les trois barres obliques sont suivies du chemin absolu :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; # &lt;strong&gt;Unix/Mac&lt;/strong&gt; - 4 barres obliques initiales au total&lt;br class='manualbr' /&gt;&lt;i&gt;engine = create_engine(&#034;sqlite+pysqlite :////absolute/path/to/foo.db&#034;)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; # &lt;strong&gt;Windows&lt;/strong&gt; - 3 barres obliques initiales&lt;br class='manualbr' /&gt;&lt;i&gt;engine = create_engine(&#034;sqlite+pysqlite :///C :\path\to\foo.db&#034;)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; # &lt;strong&gt;Windows alternative using raw string&lt;/strong&gt;&lt;br class='manualbr' /&gt;&lt;i&gt;engine = create_engine(r&#034;sqlite+pysqlite :///C :\path\to\foo.db&#034;)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour utiliser une base de donn&#233;es SQLite en &lt;strong&gt;m&#233;moire&lt;/strong&gt; (:memory :), sp&#233;cifiez une URL vide :&lt;br class='autobr' /&gt;
&lt;i&gt;engine = create_engine(&#034;sqlite+pysqlite ://&#034;)&lt;/i&gt;&lt;/p&gt;
&lt;div class=&#034;avertissement&#034;&gt;
&lt;strong&gt;Lazy Connecting&lt;/strong&gt;
&lt;p&gt;L'objet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Engine&lt;/code&gt;, tel qu'il est renvoy&#233; par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;create_engine()&lt;/code&gt;, n'a pas encore tent&#233; de se connecter &#224; la base de donn&#233;es ; cette connexion ne s'&#233;tablit que lorsqu'il est sollicit&#233; pour la premi&#232;re fois pour effectuer une op&#233;ration sur la base. Il s'agit d'un mod&#232;le de conception logiciel connu sous le nom d'initialisation paresseuse (*lazy initialization*).&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Plus de pr&#233;cisions sur la connexion &#224; SQLite sur SQLite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; &lt;i&gt;PostgreSQL&lt;/i&gt; &lt;/strong&gt;&lt;br class='autobr' /&gt;
Cr&#233;ons un moteur pour PostgreSQL (production).&lt;/p&gt;
&lt;p&gt;from sqlalchemy import create_engine, text&lt;/p&gt;
&lt;p&gt;# PostgreSQL pour la production&lt;br class='autobr' /&gt;
engine = create_engine(&lt;br class='autobr' /&gt; &#034;postgresql+psycopg2 ://user:password@localhost:5432/mabase&#034;,&lt;br class='autobr' /&gt; pool_size=10, # Connexions maintenues en pool&lt;br class='autobr' /&gt; max_overflow=20, # Connexions suppl&#233;mentaires autoris&#233;es&lt;br class='autobr' /&gt; pool_recycle=3600, # Recyclage des connexions apr&#232;s 1h&lt;br class='autobr' /&gt; pool_pre_ping=True, # V&#233;rification de connexion avant utilisation&lt;br class='autobr' /&gt; echo=False # D&#233;sactiv&#233; en production&lt;br class='autobr' /&gt;
)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; &lt;i&gt;Tester la connexion&lt;/i&gt; &lt;/strong&gt;&lt;br class='autobr' /&gt;
with engine.connect() as conn :&lt;br class='autobr' /&gt; result = conn.execute(text(&#034;SELECT 1&#034;))&lt;br class='autobr' /&gt; print(f&#034;Connexion r&#233;ussie : &lt;i&gt;result.scalar()&lt;/i&gt;&#034;)&lt;br class='autobr' /&gt;
# Sortie : Connexion r&#233;ussie : 1&lt;/p&gt;
&lt;div class=&#034;aide&#034;&gt;Le param&#232;tre echo=True est indispensable pendant le d&#233;veloppement : il affiche chaque requ&#234;te SQL g&#233;n&#233;r&#233;e par SQLAlchemy dans la console. D&#233;sactivez-le en production pour &#233;viter de polluer les logs. Le pool_pre_ping=True est crucial en production car il v&#233;rifie que chaque connexion est encore valide avant de l'utiliser, &#233;vitant les erreurs &#8220;connection closed&#8221; apr&#232;s un red&#233;marrage de la base de donn&#233;es.
&lt;p&gt;La cha&#238;ne de connexion suit le format dialect+driver ://user:password@host:port/database. Pour PostgreSQL, le driver par d&#233;faut est psycopg2. Pour MySQL, utilisez mysql+pymysql ://. Pour SQLite, la syntaxe sqlite :///fichier.db cr&#233;e un fichier local, tandis que sqlite :///:memory : cr&#233;e une base en m&#233;moire (id&#233;ale pour les tests unitaires).&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href='https://www.edualc.be/spip.php?article86' class=&#034;spip_in&#034;&gt;D&#233;finir les Mod&#232;les avec le Nouveau Style D&#233;claratif 2.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SQLAlchemy - installation</title>
		<link>https://www.edualc.be/spip.php?article84</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article84</guid>
		<dc:date>2026-08-16T12:18:06Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;tutoriel sqlalchemy Cr&#233;er le Moteur et la Connexion &#224; la Base de Donn&#233;es &lt;br class='autobr' /&gt;
Pr&#233;requis et Versions Requises pour SQLAlchemy 2 &lt;br class='autobr' /&gt;
Avant de commencer ce tutoriel SQLAlchemy, assurons-nous que notre environnement de d&#233;veloppement respecte les versions minimales suivantes. SQLAlchemy 2.0.49 n&#233;cessite Python 3.7 au minimum, mais nous recommandons Python 3.11 ou 3.12 pour b&#233;n&#233;ficier du typage natif et des performances optimales du runtime. &lt;br class='autobr' /&gt;
&#201;tape 1 : Installer SQLAlchemy 2 et Configurer (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique17" rel="directory"&gt;SQLAlchemy&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://tech-insider.org/fr/tutoriel-sqlalchemy-python-orm-crud-2026/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;tutoriel sqlalchemy&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;a href='https://www.edualc.be/spip.php?article85' class=&#034;spip_in&#034;&gt;Cr&#233;er le Moteur et la Connexion &#224; la Base de Donn&#233;es&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pr&#233;requis et Versions Requises pour SQLAlchemy 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant de commencer ce tutoriel SQLAlchemy, assurons-nous que notre environnement de d&#233;veloppement respecte les versions minimales suivantes. SQLAlchemy 2.0.49 n&#233;cessite Python 3.7 au minimum, mais nous recommandons Python 3.11 ou 3.12 pour b&#233;n&#233;ficier du typage natif et des performances optimales du runtime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&#201;tape 1 : Installer SQLAlchemy 2 et Configurer l'Environnement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'installation de SQLAlchemy 2 se fait en quelques commandes. Commen&#231;ons par cr&#233;er un environnement virtuel propre et installer toutes les d&#233;pendances n&#233;cessaires pour ce tutoriel, y compris les drivers de base de donn&#233;es et les outils de d&#233;veloppement.&lt;/p&gt;
&lt;p&gt;Mettons &#224; jour PIP&lt;br class='autobr' /&gt;
pip install &#8212;upgrade pip&lt;/p&gt;
&lt;p&gt;Installons SQLAlchemy 2 et les drivers&lt;br class='autobr' /&gt;
pip install sqlalchemy&lt;br class='autobr' /&gt;
pip install psycopg2-binary # Driver PostgreSQL (facultatif)&lt;br class='autobr' /&gt;
pip install aiosqlite # Driver async SQLite&lt;br class='autobr' /&gt;
pip install alembic # Migrations de sch&#233;ma&lt;/p&gt;
&lt;p&gt;V&#233;rifions l'installation&lt;br class='autobr' /&gt;
python -c &#034;import sqlalchemy ; print(sqlalchemy.__version__)&#034;&lt;br class='autobr' /&gt;
# Sortie attendue : 2.0.49 ou plus&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&#201;tape 2 : Comprendre l'Architecture Core vs ORM de SQLAlchemy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Contrairement &#224; Django ORM qui fusionne la couche SQL et la couche objet, SQLAlchemy s&#233;pare ces deux responsabilit&#233;s en deux composants distincts : le Core et l'ORM. Cette architecture unique est ce qui distingue SQLAlchemy de tous les autres ORM Python et lui conf&#232;re sa flexibilit&#233; l&#233;gendaire.&lt;/p&gt;
&lt;p&gt;Le Core est un syst&#232;me de construction SQL complet. Il fournit un langage d'expressions SQL pythonique, la gestion des m&#233;tadonn&#233;es de sch&#233;ma, le pooling de connexions et la coercition de types. Vous pouvez utiliser le Core seul, sans jamais toucher &#224; l'ORM, pour des op&#233;rations SQL brutes avec une abstraction propre. C'est id&#233;al pour les scripts de migration de donn&#233;es, les ETL, ou les requ&#234;tes complexes de reporting.&lt;/p&gt;
&lt;p&gt;L'ORM s'appuie sur le Core pour fournir le mapping objet-relationnel classique : classes Python mapp&#233;es sur des tables SQL, relations entre objets, chargement diff&#233;r&#233; et eager, et gestion des sessions avec le pattern Unit of Work. L'ORM de SQLAlchemy 2 offre des fonctionnalit&#233;s de chargement eager avanc&#233;es pour les collections et objets li&#233;s, avec des options pour l'acc&#232;s individuel, les jointures ou les requ&#234;tes par collection, le tout mis en cache dans les sessions.&lt;/p&gt;
&lt;p&gt;Caract&#233;ristique	SQLAlchemy Core	SQLAlchemy ORM	Django ORM&lt;br class='autobr' /&gt;
Approche	SQL Expression Language	Mapping objet-relationnel	Active Record&lt;br class='autobr' /&gt;
Flexibilit&#233; SQL	Totale	&#201;lev&#233;e (via Core)	Limit&#233;e&lt;br class='autobr' /&gt;
Support async	Oui (asyncio natif)	Oui (asyncio natif)	Partiel (Django 4.1+)&lt;br class='autobr' /&gt;
Typage Python	Complet	Complet	Partiel&lt;br class='autobr' /&gt;
Dialectes DB	15+ (PostgreSQL, MySQL, SQLite, Oracle&#8230;)	15+ (idem)	4 (PostgreSQL, MySQL, SQLite, Oracle)&lt;br class='autobr' /&gt;
Introspection de sch&#233;ma	Oui (reflect)	Oui (automap)	Oui (inspectdb)&lt;br class='autobr' /&gt;
Migrations	Alembic (s&#233;par&#233;)	Alembic (s&#233;par&#233;)	Int&#233;gr&#233;es&lt;/p&gt;
&lt;p&gt;Cette s&#233;paration Core/ORM signifie que nous pouvons commencer avec le Core pour des op&#233;rations simples, puis adopter l'ORM graduellement. Nous pouvons m&#234;me m&#233;langer les deux dans le m&#234;me projet : utiliser l'ORM pour les op&#233;rations CRUD standard et le Core pour les requ&#234;tes analytiques complexes. C'est un avantage majeur par rapport &#224; des ORMs plus l&#233;gers comme Peewee ou Tortoise ORM, qui offrent moins de contr&#244;le sur le SQL g&#233;n&#233;r&#233;.&lt;/p&gt;
&lt;p&gt;&lt;a href='https://www.edualc.be/spip.php?article85' class=&#034;spip_in&#034;&gt;Cr&#233;er le Moteur et la Connexion &#224; la Base de Donn&#233;es&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>API : D&#233;finition et Guide Complet</title>
		<link>https://www.edualc.be/spip.php?article83</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article83</guid>
		<dc:date>2026-07-13T08:03:19Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;https://www.kern-it.be/fr/definitions/api/ &lt;br class='autobr' /&gt;
https://developer.mozilla.org/fr/docs/Learn_web_development/Extensions/Client-side_APIs/Introduction &lt;br class='autobr' /&gt;
https://fastapi.tiangolo.com/fr/&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique5" rel="directory"&gt;D&#233;veloppement&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://www.kern-it.be/fr/definitions/api/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://www.kern-it.be/fr/definitions/api/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://developer.mozilla.org/fr/docs/Learn_web_development/Extensions/Client-side_APIs/Introduction&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://developer.mozilla.org/fr/docs/Learn_web_development/Extensions/Client-side_APIs/Introduction&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://fastapi.tiangolo.com/fr/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://fastapi.tiangolo.com/fr/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>uuid c'est quoi</title>
		<link>https://www.edualc.be/spip.php?article82</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article82</guid>
		<dc:date>2026-07-13T07:56:37Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;https://developer.mozilla.org/fr/docs/Glossary/UUID &lt;br class='autobr' /&gt;
Un UUID (Universally Unique IDentifier) est un identifiant informatique unique &#224; l'&#233;chelle mondiale, g&#233;n&#233;r&#233; de mani&#232;re d&#233;centralis&#233;e sans n&#233;cessiter d'autorit&#233; centrale. Il se pr&#233;sente g&#233;n&#233;ralement sous la forme d'une cha&#238;ne alphanum&#233;rique de 36 caract&#232;res s&#233;par&#233;s par des tirets (ex : 158c9998-18da-4bef-a8db-4891b1736574)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique5" rel="directory"&gt;D&#233;veloppement&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://developer.mozilla.org/fr/docs/Glossary/UUID&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;https://developer.mozilla.org/fr/docs/Glossary/UUID&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un UUID (Universally Unique IDentifier) est un identifiant informatique unique &#224; l'&#233;chelle mondiale, g&#233;n&#233;r&#233; de mani&#232;re d&#233;centralis&#233;e sans n&#233;cessiter d'autorit&#233; centrale. Il se pr&#233;sente g&#233;n&#233;ralement sous la forme d'une cha&#238;ne alphanum&#233;rique de 36 caract&#232;res s&#233;par&#233;s par des tirets (ex : 158c9998-18da-4bef-a8db-4891b1736574)&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Les formulaires</title>
		<link>https://www.edualc.be/spip.php?article81</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article81</guid>
		<dc:date>2026-07-13T06:46:16Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;Le r&#244;le de Django dans les formulaires
&lt;br class='autobr' /&gt;
La gestion des formulaires est une affaire complexe.
&lt;br class='autobr' /&gt;
La fonctionnalit&#233; des formulaires de Django peut simplifier et automatiser de larges portions de ce travail et peut aussi le faire de mani&#232;re plus s&#233;curis&#233;e que la plupart des programmeurs ne pourraient le faire en &#233;crivant leur propre code. &lt;br class='autobr' /&gt;
Django g&#232;re trois parties distinctes du travail induit par les formulaires : &lt;br class='autobr' /&gt; pr&#233;paration et restructuration des donn&#233;es en vue de leur pr&#233;sentation (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique15" rel="directory"&gt;Django&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Le r&#244;le de Django dans les formulaires&lt;br class='autobr' /&gt;
La gestion des formulaires est une affaire complexe.&lt;br class='autobr' /&gt;
La fonctionnalit&#233; des formulaires de Django peut simplifier et automatiser de larges portions de ce travail et peut aussi le faire de mani&#232;re plus s&#233;curis&#233;e que la plupart des programmeurs ne pourraient le faire en &#233;crivant leur propre code.&lt;/p&gt;
&lt;p&gt;Django g&#232;re trois parties distinctes du travail induit par les formulaires :&lt;/p&gt;
&lt;p&gt; pr&#233;paration et restructuration des donn&#233;es en vue de leur pr&#233;sentation&lt;/p&gt;
&lt;p&gt; cr&#233;ation des formulaires HTML pour les donn&#233;es&lt;/p&gt;
&lt;p&gt; r&#233;ception et traitement des formulaires et des donn&#233;es envoy&#233;s par le client&lt;/p&gt;
&lt;p&gt;Il est possible d'&#233;crire du code qui fait tout cela manuellement, mais Django peut s'en charger &#224; votre place.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Django admin</title>
		<link>https://www.edualc.be/spip.php?article79</link>
		<guid isPermaLink="true">https://www.edualc.be/spip.php?article79</guid>
		<dc:date>2026-07-11T14:09:55Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>edualc</dc:creator>







		<description>
&lt;p&gt;ADMIN &lt;br class='autobr' /&gt;
Django admin &lt;br class='autobr' /&gt;
https://docs.djangoproject.com/fr/5.2/ref/contrib/admin/ &lt;br class='autobr' /&gt;
grappelli admin &lt;br class='autobr' /&gt;
http://www.grappelliproject.com/
&lt;br class='autobr' /&gt;
https://django-grappelli.readthedocs.io/
&lt;br class='autobr' /&gt;
https://github.com/sehmaschine/django-grappelli &lt;br class='autobr' /&gt;
pip install django-grappelli &lt;br class='autobr' /&gt;
Open settings.py and &lt;br class='autobr' /&gt;
* add grappelli to your INSTALLED_APPS (before django.contrib.admin) : &lt;br class='autobr' /&gt;
INSTALLED_APPS = (
&lt;br class='autobr' /&gt; 'grappelli',
&lt;br class='autobr' /&gt; 'django.contrib.admin',
&lt;br class='autobr' /&gt;
) &lt;br class='autobr' /&gt;
* Add the request context processor &lt;br class='autobr' /&gt;
TEMPLATES = [
&lt;br class='autobr' /&gt; ... (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.edualc.be/spip.php?rubrique15" rel="directory"&gt;Django&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;ADMIN&lt;/p&gt;
&lt;p&gt;Django admin&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://docs.djangoproject.com/fr/5.2/ref/contrib/admin/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://docs.djangoproject.com/fr/5.2/ref/contrib/admin/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;grappelli admin&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;http://www.grappelliproject.com/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://www.grappelliproject.com/&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://django-grappelli.readthedocs.io/&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://django-grappelli.readthedocs.io/&lt;/a&gt;&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://github.com/sehmaschine/django-grappelli&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/sehmaschine/django-grappelli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;pip install django-grappelli&lt;/p&gt;
&lt;p&gt;Open settings.py and&lt;/p&gt;
&lt;p&gt;* add grappelli to your INSTALLED_APPS (before django.contrib.admin) :&lt;/p&gt;
&lt;p&gt;INSTALLED_APPS = (&lt;br class='autobr' /&gt; 'grappelli',&lt;br class='autobr' /&gt; 'django.contrib.admin',&lt;br class='autobr' /&gt;
)&lt;/p&gt;
&lt;p&gt;* Add the request context processor&lt;/p&gt;
&lt;p&gt;TEMPLATES = [&lt;br class='autobr' /&gt; &lt;i&gt;&lt;br class='autobr' /&gt; ...&lt;br class='autobr' /&gt; 'OPTIONS' : &lt;i&gt;&lt;br class='autobr' /&gt; 'context_processors' : [&lt;br class='autobr' /&gt; ...&lt;br class='autobr' /&gt; 'django.template.context_processors.request',&lt;br class='autobr' /&gt; ...&lt;br class='autobr' /&gt; ],&lt;br class='autobr' /&gt; &lt;/i&gt;,&lt;br class='autobr' /&gt; &lt;/i&gt;,&lt;br class='autobr' /&gt;
]&lt;/p&gt;
&lt;p&gt;* Ajouter STATIC_ROOT&lt;/p&gt;
&lt;p&gt;STATIC_ROOT = 'static_root/'&lt;/p&gt;
&lt;p&gt;Open urls.py and&lt;/p&gt;
&lt;p&gt;* Add URL-patterns for grappelli before admin :&lt;/p&gt;
&lt;p&gt;urlpatterns = [&lt;br class='autobr' /&gt; path('grappelli/', include('grappelli.urls')), # grappelli URLS&lt;br class='autobr' /&gt; path('admin/', admin.site.urls), # admin site&lt;br class='autobr' /&gt;
]&lt;/p&gt;
&lt;p&gt;Collect the media files :&lt;/p&gt;
&lt;p&gt;python manage.py collectstatic&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>