Documents en lecture seule (SafeDoc)
Documents en lecture seule (SafeDoc)
Dans un modèle Jinja (format d'impression, modèle d'e-mail), frappe.get_doc, frappe.get_cached_doc et frappe.get_last_doc ne renvoient pas un Document. Ils renvoient un SafeDoc : une copie du document en dictionnaire. Un SafeDoc expose les valeurs des champs et les lignes des tables enfants. Il n'a pas les méthodes qui écrivent en base (save, submit, delete…).
Pour le choix entre contexte de rendu et contexte d'exécution, voir Exécution sécurisée des scripts. Dans un script serveur, frappe.get_doc renvoie un Document complet, pas un SafeDoc.
Champs et tables enfants
Lisez un champ comme un attribut ou une clé : client.customer_name ou client["customer_name"]. Chaque ligne d'une table enfant est aussi un SafeDoc, lié à son document parent.
Méthodes
| Méthode | Résultat |
|---|---|
get_formatted(fieldname, doc=None, currency=None, absolute_value=False, translated=False, format=None) | La valeur du champ formatée selon son type (date, devise, nombre) |
get_label_from_fieldname(fieldname) | Le libellé traduit du champ, ou None si le champ n'existe pas |
in_format_data(fieldname) | True si le champ fait partie des champs choisis dans un format d'impression du générateur. Sans sélection, renvoie toujours True |
is_print_hide(fieldname, df=None, for_print=True) | Une valeur vraie si le champ est masqué à l'impression (option Masquer à l'impression, ou valeur 0 avec Masquer à l'impression si la valeur est nulle) |
meta (propriété) | Les métadonnées du DocType en dictionnaire, ou None si le document n'a pas de champ doctype |
Pour un champ Devise sans devise fournie, get_formatted prend la devise du champ indiqué dans les options du champ.
Exemple
Ce modèle affiche le total d'une facture et le libellé de son champ. ACC-SINV-2026-00001 est un nom fictif.
{% set facture = frappe.get_doc("Sales Invoice", "ACC-SINV-2026-00001") %}
<p>{{ facture.get_label_from_fieldname("grand_total") }} :
{{ facture.get_formatted("grand_total") }}</p>
{% for ligne in facture.items %}
{% if not ligne.is_print_hide("discount_amount") %}
<p>{{ ligne.item_name }} : {{ ligne.get_formatted("discount_amount") }}</p>
{% endif %}
{% endfor %}
get_formatted d'une ligne enfant utilise le document parent pour le formatage, par exemple pour la devise.