Introduktion
När du bläddrar bland produkttexter i en Odoo-webbutik är det ofta ett och samma fälttyp som står för rubriker, punktlistor och inbäddade bilder: Html-fältet. Det är ett flexibelt fält i Odos datamodell och dyker upp i fler moduler än många tror — från e-handel till interna anteckningar.
Till skillnad från ett enkelt textfält som bara sparar råa tecken, lagrar Html-fältet färdigformaterat innehåll. Det gör det oumbärligt där struktur och stil är viktiga — till exempel produktbeskrivningar, e-postmallar, medarbetarnoteringar eller webbsidor i din Odoo-instans.
I denna genomgång förklarar vi vad Html-fältet är, hur det lagras och hanteras i Odoo, var det används i praktiken och hur du lägger till eller skräddarsyr det med Odoo Studio eller Python. Vi tar också upp de vanligaste misstagen som görs när man arbetar med rich text i Odoo.
Vad är Html-fältet i Odoo
I Odoos ORM representeras Html-fältet som formaterad HTML och sparas i databasen som en TEXT-kolumn i PostgreSQL. Värdet är helt enkelt en HTML-sträng, medan Odoo står för renderingen i gränssnittet och en säkerhetsrutin som rengör potentiellt farlig kod innan den visas eller sparas.
För användaren syns Html-fältet som en WYSIWYG-redigerare — det vill säga ett visuellt gränssnitt där man kan göra text fet, kursiv, skapa rubriker, listor, länka eller infoga bilder utan att behöva skriva HTML manuellt. Redigeringen sparas i bakgrunden som strukturerad HTML.
Exempelvis definieras fältet i en Python-modell på detta sätt:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_technical_specs = fields.Html(
string='Technical Specifications',
sanitize=True,
sanitize_tags=True,
)
Parametern string bestämmer det visade etikettnamnet. Parametern sanitize avgör om Odoo ska ta bort eller modifiera HTML som kan vara osäkert innan det sparas — en viktig säkerhetsinställning som normalt är påslagen.
I Odoo Studio heter fälttypen Html eller Rich Text och användarskapade fält får automatiskt prefixet x_studio_. När du deklarerar fält i Python eller via API bestämmer du själv det tekniska namnet.
Hur fältet fungerar
När ett Html-fält skapas gör Odoo en TEXT-kolumn i PostgreSQL utan längdbegränsning, vilket passar för långa texter. Sanitiseringslogiken körs innan värdet skrivs till databasen så att lagrad HTML följer de valda säkerhetsreglerna.
Sanitering och säkerhet
Det som särskiljer Html-fältet är dess sanitiseringslager: som standard tar Odoo bort taggar och attribut som kan utnyttjas för XSS-attacker. Det styrs av flera fältegenskaper som ger granularitet i vad som får finnas kvar i innehållet.
- sanitize: Om True (standard) applicerar Odoo full rengöring innan värdet sparas. Sätt till False endast om innehållet kommer från en helt betrodd källa och du behöver bevara rå HTML.
- sanitize_tags: Om True tas taggar som inte finns på tillåtna listan bort. Att inaktivera detta tillåter valfria taggar, men ökar riskerna och bör undvikas i offentliga formulär.
- sanitize_attributes: Bestämmer om attribut i HTML-taggar också ska saniteras bort eller filtreras.
- sanitize_style: Kontrollerar hur inline-stilar hanteras. Vissa CSS-egenskaper tillåts medan andra tas bort om de bedöms osäkra.
- strip_style: Om True tas alla inline style-attribut bort helt.
- strip_classes: Om True tas alla klass-attribut bort från det sparade innehållet.
Tack vare denna sanitering är Html-fältet säkert att använda för användargenererat innehåll, vilket gör det lämpligt i kundvända formulär, e-postmallar och portalsidor.
Viktiga fältegenskaper
Utöver saniteringsinställningarna följer Html-fältet många vanliga Odoo-attribut som påverkar översättning, validering och kopiering:
- translate: När True kan fältets innehåll översättas per språk. Odoo hanterar separata HTML-versioner för varje aktivt språk.
- required: Gör fältet obligatoriskt. Tänk på att innehåll som bara består av tomma taggar eller blanksteg kan se icke-tomt ut för gränssnittet, så bekräfta validering mot verkligt blankt innehåll vid behov.
- default: Anger ett standardvärde i HTML för nya poster — praktiskt för e-postmallar eller förifyllda produktbeskrivningar.
- compute: Kopplar ett Python-metod som bygger HTML dynamiskt. Med store=True skrivs resultatet till databasen.
- copy: Styr om HTML-innehållet ska kopieras vid duplicering av en post. Standard är True.
Hur det visas i vyer
I formulär visar Odoo Html-fältet som en redigerbar rik text-editor med verktygsfält. I listvyer visas ofta en ren textförhandsvisning där HTML-taggarna tas bort för att hålla listan överskådlig.
I XML-vyer kan du styra widgeten. Standardwidgeten är den redigerbara rich text-editorn, men du kan också visa fältet som läsbart HTML med widget='html'— användbart på portalsidor eller i rapporter där redigeringsverktyg inte behövs.
Interaktion med Odoo ORM
Utifrån utvecklarperspektiv returnerar läsning av ett Html-fält en sträng med rå HTML. Vid skrivning förväntas också en HTML-sträng och sanitiseringssteget körs i ORM innan värdet når databasen; samma rengöring gäller även för värden som skrivs via API om sanitize=True.
Praktisk konsekvens: om du behöver bevara specialtaggar eller attribut som inte finns i Odos tillåtna lista måste du överväga sanitize=False eller justera vilka sanitize-flaggor som används — ett avancerat val som kräver att du väger in säkerhetsriskerna noggrant.
Affärsscenarier
Html-fältet återfinns i många delar av en Odoo-installation. Nedan fem konkreta exempel från vanliga arbetsflöden visar hur det används i praktiken.
Lager och e-handel: produktbeskrivningar
Det mest använda Html-fältet i Odoo är description_sale på product.template. Det är den produkttext kunden ser i webbutiken och i offert-/orderrader. Genom att använda rik text kan merchandising skriva strukturerade beskrivningar med punktlistor, avsnittsrubriker och bilder — något som ofta förbättrar konverteringen. Samma produktpost används både i backoffice och i butiken, vilket undviker duplicerat innehåll.
E-postmarknadsföring: e-postmallar
Odos e-postmallar bygger i hög grad på Html-fält. body_html på mail.template innehåller hela mejlkroppen inklusive layout, bilder och dynamiska platshållare som ersätts vid utskick. Marknadsföringsteam kan skapa avancerade mejl direkt i Odoo utan externa verktyg, och mallarna går att återanvända i kampanjer och automatiska arbetsflöden.
CRM: anteckningar och beskrivningar av affärer
Säljteam använder Html-fält i CRM för att fånga detaljerad kontext kring prospekt eller affärsmöjligheter. Formaterade anteckningar med listor och länkar är lättare att dela inom teamet och fungerar bättre i tryckta rapporter än enkel text.
Redovisning: fakturors villkor
Många företag lägger betalningsvillkor, garantiklausuler eller juridiska texter i fakturans eller orderns note-fält — ett Html-fält. Det gör att ekonomiavdelningen kan strukturera texten snyggt och få samma formatering på PDF-utdata som i gränssnittet.
HR: platsannonser
HR använder Html-fält för jobbannonser i rekryteringsmodulen (hr.job och hr.applicant). Strukturerade beskrivningar med sektioner för ansvar, krav och förmåner ger ett professionellt intryck på karriärsidan och hjälper till att attrahera rätt kandidater.
Skapa eller anpassa Html-fältet
Det finns huvudsakligen tre sätt att lägga till ett Html-fält i en modell beroende på hur tekniskt du arbetar och hur din deployment ser ut.
Med Odoo Studio (utan kod)
Odoo Studio gör det enkelt att lägga till ett Html-fält i ett formulär utan programmering:
- Öppna Odoo Studio från huvudmenyn.
- Navigera till den formulärvy där du vill lägga till fältet.
- Dra in ett Html- eller Rich Text-fält från sidopanelen till formuläret.
- Ange etikett och fältinställningar i egenskapspanelen.
- Spara och stäng Studio.
Studio skapar fältet automatiskt med prefixet x_studio_, lägger till det i vyn och skapar databaskolumnen — inget extra migrationssteg behövs. Fältet blir direkt tillgängligt för datainmatning i hela instansen.
Med Python i en anpassad modul
Utvecklare deklarerar Html-fält i Python när skräddarsydda moduler behövs — rekommenderat när ändringar ska versionshanteras och distribueras mellan miljöer:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_delivery_instructions = fields.Html(
string='Delivery Instructions',
sanitize=True,
translate=True,
)
När fältet lagts till i modellen uppdaterar du motsvarande XML-vy så att det syns i gränssnittet. Odoo skapar TEXT-kolumnen automatiskt när modulen installeras eller uppgraderas och fältet renderas som en rik text-editor i formuläret.
Via XML-RPC API
Om du automatiserar konfiguration eller arbetar med fjärrskript kan du skapa Html-fält via XML-RPC:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_custom_notes',
'field_description': 'Custom Notes',
'model_id': model_id,
'ttype': 'html',
'state': 'manual',
}]
)
Värdet ttype: 'html' instruerar Odoo att skapa ett Html-fält. state: 'manual' markerar att fältet är användarskapat snarare än moduldefinierat. Detta är vanligt i automatiserade konfigurationer där man vill manipulera modellen utan direkt serveraccess.
Observera att vissa sanitiseringsinställningar inte alltid går att styra via ir.model.fields i samma detalj som i Python-kod; då gäller standardbeteendet när fält skapas via API.
Rekommenderade arbetssätt
1. Ha sanitize aktiverat om du inte har ett mycket tydligt skäl att stänga av det
Standardsaniteringen skyddar mot XSS-sårbarheter. I de flesta fall fungerar funktionaliteten bra med sanitize på. Stäng endast av sanitering när innehållet genereras av en helt betrodd serverprocess och aldrig för användarinmatning från externa parter.
2. Använd translate=True för flerspråkigt innehåll
Har du flera språk i Odoo bör Html-fält som syns för kunder eller i dokument vara översättningsbara (translate=True). Då kan varje språk ha sin egen HTML-version så att kunder får texter på sitt språk istället för en fallback.
3. Undvik beroenden till externa resurser i fältinnehållet
Inbäddade externa bilder eller skript skapar svaga länkar som kan sluta fungera. Använd Odos bilagor för att lagra bilder internt och referera med relativa eller interna länkar för att behålla innehållets hållbarhet vid migreringar och serverbyten.
4. Använd beräknade Html-fält för dynamiskt genererat innehåll
När innehåll måste byggas programmässigt, exempelvis en sammanfattning av orderrader eller en dynamisk garanti-text, är ett compute-fält med store=True bra. Logiken kapslas i Python, resultatet lagras för snabb åtkomst och renderas korrekt i både UI och PDF-rapporter.
5. Tänk på kontexten: Html eller Text?
Om innehållet bara ska läsas som ren text i backend kan ett Text-fält räcka. Använd Html när formatering är viktig — på webbsidor, i utskrifter eller i mejl. Att lägga in ett riktextfält där enkel text vore bättre försvårar användarupplevelsen i onödan.
Vanliga fallgropar
Att inaktivera sanitize och sedan glömma bort det
Att sätta sanitize=False i utvecklingssyfte kan verka snabbt, men är en säkerhetsrisk om fältet senare exponeras. Dokumentera alltid varför sanitering är avstängd och planera en säkerhetsgranskning innan produktionssättning.
Inklistrad extern text som ger trasig HTML
När användare klistrar in text från Word, Google Docs eller webbsidor följer ofta skräp-HTML med — brutna taggar, osynliga tecken och uppblåst kod. Det ger ojämn rendering och kan påverka sökbarhet och prestanda. Uppmana användare att "klistra som vanlig text" och formatera i editorn istället.
Förväxling med website-builders innehåll
Odos website builder bygger sidor med block och komponenter som skiljer sig från ett vanligt Html-fält. Att kopiera komplex HTML från site-buildern in i ett standard Html-fält leder ofta till att innehållet inte renderas som väntat eller filtreras bort av sanitizern.
Att glömma translate i flerspråkiga installationer
Ett Html-fält utan translate=True visar samma text för alla användare oavsett språk — okej för interna fält men problematiskt för produkttexter, mejl och kundvänd innehåll. Det är lätt att missa vid första uppsättningen och svårt att rätta till i efterhand när innehåll redan finns i enbart ett språk.
Att använda Html där plain text förväntas
Vissa delar av Odoo, som mejlämnen, rapporttitlar eller externa API-svar, förväntar sig ren text. Om du använder Html där och taggarna inte tas bort riskerar du att användare ser rå HTML istället för ren text. Kontrollera alltid konsumtionskontexten innan du väljer Html framför Char eller Text.
Sammanfattning
Html-fältet är ett av de mest kraftfulla fälttyperna i Odoo. Det finns bakom butikstexter, e-postmallar, platsannonser och fakturornas villkor och gör formaterat innehåll möjligt i hela systemet utan externa verktyg.
Att förstå hur Html-fältet fungerar — särskilt sanitizern, översättningsstödet och hur det beter sig i olika renderingskontexter — hjälper dig att fatta bättre beslut när du designar eller anpassar en Odoo-lösning. Oavsett om du använder Studio, skriver Python eller skapar fält via API gäller samma principer.
Precis som med många andra Odoo-komponenter blir fältet enkelt att arbeta med när du vet vad som händer bakom kulisserna. Värdet kommer av att du använder det på rätt ställen, med rätt inställningar och för rätt slags innehåll.
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo i alla avdelningar. Behöver du stöd med datamodell, skräddarsydda fält eller helhetsmoduler anpassade efter din verksamhet så har vårt team erfarenheten. Kontakta oss så tar vi ett samtal om ditt Odoo-projekt.