[{"data":1,"prerenderedAt":301},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fsecurite-et-execution-de-code":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fsecurite-et-execution-de-code":300},{"id":4,"title":5,"body":6,"description":289,"extension":290,"meta":291,"navigation":243,"path":296,"seo":297,"stem":298,"__hash__":299},"docs\u002F2.next\u002F3.dodock\u002F10.developpeurs\u002Fsecurite-et-execution-de-code.md","Documents en lecture seule (SafeDoc)",{"type":7,"value":8,"toc":284},"minimark",[9,13,51,69,74,88,92,187,198,202,209,275,280],[10,11,5],"h1",{"id":12},"documents-en-lecture-seule-safedoc",[14,15,16,17,21,22,25,26,29,30,33,34,37,38,40,41,21,44,21,47,50],"p",{},"Dans un modèle Jinja (format d'impression, modèle d'e-mail), ",[18,19,20],"code",{},"frappe.get_doc",", ",[18,23,24],{},"frappe.get_cached_doc"," et ",[18,27,28],{},"frappe.get_last_doc"," ne renvoient pas un ",[18,31,32],{},"Document",". Ils renvoient un ",[18,35,36],{},"SafeDoc"," : une copie du document en dictionnaire. Un ",[18,39,36],{}," expose les valeurs des champs et les lignes des tables enfants. Il n'a pas les méthodes qui écrivent en base (",[18,42,43],{},"save",[18,45,46],{},"submit",[18,48,49],{},"delete","…).",[14,52,53,54,59,60,62,63,65,66,68],{},"Pour le choix entre contexte de rendu et contexte d'exécution, voir ",[55,56,58],"a",{"href":57},"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fsafe-exec","Exécution sécurisée des scripts",". Dans un script serveur, ",[18,61,20],{}," renvoie un ",[18,64,32],{}," complet, pas un ",[18,67,36],{},".",[70,71,73],"h2",{"id":72},"champs-et-tables-enfants","Champs et tables enfants",[14,75,76,77,80,81,84,85,87],{},"Lisez un champ comme un attribut ou une clé : ",[18,78,79],{},"client.customer_name"," ou ",[18,82,83],{},"client[\"customer_name\"]",". Chaque ligne d'une table enfant est aussi un ",[18,86,36],{},", lié à son document parent.",[70,89,91],{"id":90},"méthodes","Méthodes",[93,94,95,108],"table",{},[96,97,98],"thead",{},[99,100,101,105],"tr",{},[102,103,104],"th",{},"Méthode",[102,106,107],{},"Résultat",[109,110,111,122,136,151,170],"tbody",{},[99,112,113,119],{},[114,115,116],"td",{},[18,117,118],{},"get_formatted(fieldname, doc=None, currency=None, absolute_value=False, translated=False, format=None)",[114,120,121],{},"La valeur du champ formatée selon son type (date, devise, nombre)",[99,123,124,129],{},[114,125,126],{},[18,127,128],{},"get_label_from_fieldname(fieldname)",[114,130,131,132,135],{},"Le libellé traduit du champ, ou ",[18,133,134],{},"None"," si le champ n'existe pas",[99,137,138,143],{},[114,139,140],{},[18,141,142],{},"in_format_data(fieldname)",[114,144,145,148,149],{},[18,146,147],{},"True"," si le champ fait partie des champs choisis dans un format d'impression du générateur. Sans sélection, renvoie toujours ",[18,150,147],{},[99,152,153,158],{},[114,154,155],{},[18,156,157],{},"is_print_hide(fieldname, df=None, for_print=True)",[114,159,160,161,165,166,169],{},"Une valeur vraie si le champ est masqué à l'impression (option ",[162,163,164],"strong",{},"Masquer à l'impression",", ou valeur 0 avec ",[162,167,168],{},"Masquer à l'impression si la valeur est nulle",")",[99,171,172,178],{},[114,173,174,177],{},[18,175,176],{},"meta"," (propriété)",[114,179,180,181,183,184],{},"Les métadonnées du DocType en dictionnaire, ou ",[18,182,134],{}," si le document n'a pas de champ ",[18,185,186],{},"doctype",[14,188,189,190,193,194,197],{},"Pour un champ ",[162,191,192],{},"Devise"," sans devise fournie, ",[18,195,196],{},"get_formatted"," prend la devise du champ indiqué dans les options du champ.",[70,199,201],{"id":200},"exemple","Exemple",[14,203,204,205,208],{},"Ce modèle affiche le total d'une facture et le libellé de son champ. ",[18,206,207],{},"ACC-SINV-2026-00001"," est un nom fictif.",[210,211,216],"pre",{"className":212,"code":213,"language":214,"meta":215,"style":215},"language-jinja shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{% set facture = frappe.get_doc(\"Sales Invoice\", \"ACC-SINV-2026-00001\") %}\n\u003Cp>{{ facture.get_label_from_fieldname(\"grand_total\") }} :\n   {{ facture.get_formatted(\"grand_total\") }}\u003C\u002Fp>\n\n{% for ligne in facture.items %}\n  {% if not ligne.is_print_hide(\"discount_amount\") %}\n    \u003Cp>{{ ligne.item_name }} : {{ ligne.get_formatted(\"discount_amount\") }}\u003C\u002Fp>\n  {% endif %}\n{% endfor %}\n","jinja","",[18,217,218,226,232,238,245,251,257,263,269],{"__ignoreMap":215},[219,220,223],"span",{"class":221,"line":222},"line",1,[219,224,225],{},"{% set facture = frappe.get_doc(\"Sales Invoice\", \"ACC-SINV-2026-00001\") %}\n",[219,227,229],{"class":221,"line":228},2,[219,230,231],{},"\u003Cp>{{ facture.get_label_from_fieldname(\"grand_total\") }} :\n",[219,233,235],{"class":221,"line":234},3,[219,236,237],{},"   {{ facture.get_formatted(\"grand_total\") }}\u003C\u002Fp>\n",[219,239,241],{"class":221,"line":240},4,[219,242,244],{"emptyLinePlaceholder":243},true,"\n",[219,246,248],{"class":221,"line":247},5,[219,249,250],{},"{% for ligne in facture.items %}\n",[219,252,254],{"class":221,"line":253},6,[219,255,256],{},"  {% if not ligne.is_print_hide(\"discount_amount\") %}\n",[219,258,260],{"class":221,"line":259},7,[219,261,262],{},"    \u003Cp>{{ ligne.item_name }} : {{ ligne.get_formatted(\"discount_amount\") }}\u003C\u002Fp>\n",[219,264,266],{"class":221,"line":265},8,[219,267,268],{},"  {% endif %}\n",[219,270,272],{"class":221,"line":271},9,[219,273,274],{},"{% endfor %}\n",[14,276,277,279],{},[18,278,196],{}," d'une ligne enfant utilise le document parent pour le formatage, par exemple pour la devise.",[281,282,283],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":215,"searchDepth":222,"depth":228,"links":285},[286,287,288],{"id":72,"depth":228,"text":73},{"id":90,"depth":228,"text":91},{"id":200,"depth":228,"text":201},"Méthodes disponibles sur les documents que frappe.get_doc renvoie dans un modèle Jinja : get_formatted, get_label_from_fieldname, in_format_data, is_print_hide et meta.","md",{"icon":292,"reviewed":243,"last_verified":293,"sources":294},"i-mdi-shield-lock-outline","2026-11-03",[295],"dodock@develop:frappe\u002Futils\u002Fsafe_exec.py","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fsecurite-et-execution-de-code",{"title":5,"description":289},"2.next\u002F3.dodock\u002F10.developpeurs\u002Fsecurite-et-execution-de-code","J3LVgNFcOSk4D4eAzdOBh6d0EALWnxfSFZyiGZ1wqWw",{},1793871751224]