Skip to Content

The blog.post Model: Understanding Odoo's Blog Article Architecture

A complete guide to the blog.post Odoo model for developers and functional consultants
March 11, 2026 by
The blog.post Model: Understanding Odoo's Blog Article Architecture
Dasolo
| No comments yet

Introduction


In Odoo, models define how data is structured and stored in the database. Every piece of business data you work with lives in a model.


Odoo models are the foundation of the data architecture. They define Odoo fields, relationships, and business logic. Understanding how models work is essential for both developers and functional consultants.


This article focuses on the blog.post model. It powers the blog functionality on Odoo websites. Whether you are creating content via the UI, automating posts via the API, or customizing the blog experience, you will work with this model.

What is the blog.post Model


The blog.post model represents a single blog article in Odoo. Each record is one post that appears on your website blog.


This model in Odoo is part of the website_blog module. It works together with blog.blog (the blog container) and blog.tag (for categorization). When you create or edit a blog article in Odoo, you are creating or updating a blog.post record.


The model inherits from several mixins. It uses the mail.thread mixin for chatter and followers. It uses the website.published.mixin for publish and unpublish logic. Understanding this Odoo model inheritance helps when extending the model.


blog.post is not an Odoo abstract model or transient model. It is a regular stored model. All posts are persisted in the database and can be queried via the API.

Key Fields in the Model


Here are the most important Odoo fields in the blog.post model. Understanding these will help you work effectively with blog content.


1. name

Type: Char. This field stores the title of the blog post. It is required and displayed in lists, forms, and on the website. The name appears in the browser tab and in search results.


2. blog_id

Type: Many2one (blog.blog). Links the post to its blog container. Every blog.post belongs to exactly one blog. Use this to organize posts into different blog sections (e.g. News, Product Updates, Technical Guides).


3. subtitle

Type: Char. A short subtitle or tagline. Displayed below the title on the post page and sometimes in blog listings. Useful for SEO and readability.


4. content

Type: Html. The main body of the article. Stores rich HTML content including text, images, and Odoo website snippets. This is the primary content field.


5. teaser

Type: Text. Auto-generated teaser from the content. Odoo extracts a preview for display in blog listings. Read-only and computed.


6. teaser_manual

Type: Text. Manual teaser override. When set, this replaces the auto-generated teaser in blog listings. Use for custom summaries that differ from the opening paragraph.


7. author_id

Type: Many2one (res.partner). The author of the post. Links to a contact or user. Displayed on the post and in listings. Useful for multi-author blogs.


8. author_name

Type: Char. Computed display name of the author. Falls back to the author's display name when author_id is set. Read-only.


9. author_avatar

Type: Binary. Author avatar image. Displayed next to the author name on the post. Optional.


10. is_published

Type: Boolean. Whether the post is published and visible on the website. Read-only computed field. Use website_published to change this.


11. website_published

Type: Boolean. The writable field to publish or unpublish. Set to True to make the post live. Set to False to draft. This drives is_published.


12. post_date

Type: Datetime. The publishing date shown to visitors. Used for sorting and display. Can be set in the future for scheduled posts.


13. published_date

Type: Datetime. The actual date when the post was published. Automatically set when website_published becomes True. Useful for analytics.


14. active

Type: Boolean. Soft delete flag. When False, the record is archived and hidden from default views. Posts are not physically deleted to preserve history.


15. tag_ids

Type: Many2many (blog.tag). Tags for categorization. Used to filter and group posts. Tags can have categories for hierarchical organization.


16. visits

Type: Integer. Visit counter. Read-only. Incremented when visitors view the post. Used for analytics and popular content.


17. website_url

Type: Char. Full URL path to the post on the website. Read-only. Format: /blog/{blog-seo-name}-{blog-id}/{post-seo-name}-{post-id}.


18. cover_properties

Type: Text. JSON string storing cover image properties. Controls positioning, overlay, and display of the blog cover image. Used by the frontend.


19. header_visible

Type: Boolean. Whether to show the website header on the post page. Useful for full-width or embedded posts.


20. footer_visible

Type: Boolean. Whether to show the website footer on the post page. Often paired with header_visible.


21. seo_name

Type: Char. SEO-friendly URL slug. Determines the URL path. Example: my-post-title becomes /blog/my-blog-1/my-post-title-1. Auto-generated from name if empty.


22. website_meta_title

Type: Char. Meta title for search engines. Shown in browser tab and search results. Important for SEO.


23. website_meta_description

Type: Text. Meta description for search engines. Shown in search snippets. Keep to 150-160 characters for best display.


24. website_meta_keywords

Type: Char. Meta keywords. Less important for SEO today but still used by some systems.


25. create_date

Type: Datetime. Stores the date when the record was created. Automatically managed by Odoo. Useful for reporting and auditing.


26. create_uid

Type: Many2one (res.users). User who created the record. Automatically set. Read-only.


27. write_date

Type: Datetime. Last modification date. Automatically managed. Helps track when content was last updated.


28. write_uid

Type: Many2one (res.users). User who last modified the record. Read-only.


29. display_name

Type: Char. Computed display name. Used in many2one dropdowns and search results. Read-only.


30. website_id

Type: Many2one (website). In multi-website setups, the website this post belongs to. Optional; when empty, the post may appear on all websites.

How This Model Is Used in Business Workflows


1. Content Marketing and SEO

Marketing teams create blog.post records to publish articles. They use website_meta_title, website_meta_description, and seo_name to optimize for search. The content field holds the full article. Tags help organize content by topic.


2. Multi-Blog Websites

Companies run multiple blogs (News, Product Updates, Technical Docs). Each blog.blog has many blog.post records. The blog_id field links each post to its category. Visitors browse by blog and filter by tag.


3. API-Driven Content

Integrations create blog.post records via XML-RPC or JSON-RPC. Use cases include importing from a CMS, syncing from a headless blog, or automating post creation from internal systems. The API model in Odoo exposes blog.post for create, read, update, and search.


4. Scheduled Publishing

Set post_date to a future date and website_published to True. Odoo displays the post when the date is reached. Useful for content calendars and timed campaigns.


5. Multi-Author and Collaboration

The author_id field and mail.thread mixin support collaboration. Authors are assigned per post. Followers get notified of changes. Chatter allows internal comments before publishing.

How Developers Extend This Model


Developers extend blog.post using several patterns. Odoo model inheritance is the main mechanism.


Model Inheritance

Use _inherit = 'blog.post' to extend the model. Add new Odoo fields, override methods, or add constraints. The inherit model in Odoo keeps your changes in a separate module for easy upgrades. blog.post inherits from mail.thread and website.published.mixin; understand these when overriding.


Adding Fields

Define new Odoo fields in your inherited model. Use the right field type: Char, Many2one, Boolean, Integer, Text, Selection. For custom metadata (reading time, custom categories), add fields and expose them in views. Use the x_ prefix for custom fields to avoid conflicts.


Python Extensions

Override create, write, or unlink to add logic. Use super() to call the original. Be careful with website_published and post_date. The model has computed fields from the website mixin. Override _compute_website_url if you need custom URL logic.


Odoo Studio

Odoo Studio lets you add fields without code. Good for quick customizations like extra metadata. For complex logic, API integrations, or custom views, custom modules are more maintainable. The API model in Odoo (blog.post) is fully exposed via XML-RPC and JSON-RPC.

Best Practices


  • Set website_meta_title and website_meta_description for every post. They improve SEO visibility.
  • Use teaser_manual for blog listings when the auto-generated teaser does not fit. Custom teasers often perform better.
  • Set seo_name explicitly for important posts. Avoid special characters that can break URLs.
  • When building API integrations, use website_published to publish. Do not rely on is_published for writes.
  • Use tag_ids for consistent categorization. Create tags in advance and reuse them across posts.

Common Mistakes


  • Writing to is_published instead of website_published. is_published is read-only. Always use website_published to publish or unpublish.
  • Forgetting to set blog_id. It is required. Posts without a blog will not display correctly.
  • Leaving website_meta_description empty. Search engines may use random content from the page. Always provide a clear 150-160 character description.
  • Overriding core methods without calling super(). This can break the website mixin or mail.thread behavior.
  • Creating duplicate seo_name values within the same blog. URLs can conflict. Let Odoo auto-generate or ensure uniqueness.

Conclusion


The blog.post model is central to Odoo's website blog. It stores every article, its content, metadata, and publishing state. Understanding its Odoo fields and how it relates to blog.blog and blog.tag will help you configure, customize, and integrate blog content effectively.


Whether you are a functional consultant managing content or a developer building API integrations, a solid grasp of blog.post will save time and prevent errors.

Need Help With Your Odoo Implementation ?


Dasolo helps companies implement, customize, and optimize Odoo. We specialize in API integrations and Odoo development. Our team has deep experience with the Odoo data architecture and models like blog.post.


If you need help with your Odoo implementation, custom modules, or integrations, we are here to help. Book a demo to discuss your project.

The blog.post Model: Understanding Odoo's Blog Article Architecture
Dasolo March 11, 2026
Share this post
Sign in to leave a comment