Skip to Content

اضافه کردن فیلتر به سرچ در Odoo 18 + رفع خطاهای رایج

اگر می‌خوای فیلتر سفارشی رو به سرچ Odoo 18 اضافه کنی بدون دردسر و خطا، این مقاله مخصوص توئه

سلام دوستان! 😄

امروز می‌خوایم یک ترفند ساده ولی کاربردی تو Odoo یاد بگیریم: اضافه کردن یک فیلتر جدید به سرچ ویو پروژه‌ها و فعال کردنش به صورت پیش‌فرض.

مثلاً سناریوی من این بود که می‌خواستم پروژه‌های Template نشون داده نشن و این فیلتر به صورت پیش‌فرض فعال باشه.

به ظاهر ساده بود، ولی همونطور که همیشه Odoo هست 😅، بدون خطا پیش نرفت.

این مقاله قدم‌به‌قدم هم نحوه اضافه کردن فیلتر رو توضیح می‌ده، هم خطاهایی که من تجربه کردم، تا شما گیر نکنید.

مرحله اول: تعریف فیلد در مدل

اول یک فیلد بولین تو مدل پروژه تعریف کردم:

from odoo import fields, models

class Project(models.Model):
    _inherit = "project.project_ 

    is_template = fields.Boolean(string='Is a project template', default=False)

نکته مهم: من اول اشتباه تایپی داشتم و به جای default زده بودم defualt 🤦‍♂️

نتیجه؟ خطا پشت خطا! پس همین کوچیکا هم می‌تونه دردسر درست کنه.

مرحله دوم: اضافه کردن فیلتر به سرچ

حالا فیلتر رو به سرچ ویو اضافه کردیم:

<record id="project_project_view_filter_inherit_template" model="ir.ui.view">
    <field name="name">project.project.search.inherit.template</field>
    <field name="model">project.project</field>
    <field name="inherit_id" ref="project.view_project_project_filter"/>
    <field name="arch" type="xml">
        <xpath expr="//search" position="inside">
            <filter string="Exclude Templates" name="exclude_templates"
                domain="[('is_template', '=', False)]"/>
        </xpath>
    </field>
</record>

تا اینجا اوکی بود، ولی وقتی خواستم فیلتر به صورت پیش‌فرض فعال باشه و default="1" اضافه کردم، کل ماژول ترکید 😐

خطای کلاسیک:

Invalid view project.project.search.inherit.template definition

علتش چی بود؟ همون default="1" داخل <filter> باعث ParseError شد.

مرحله سوم: فعال کردن پیش‌فرض فیلتر (روش درست ✅)

راه درست اینه که پیش‌فرض بودن رو روی اکشن تنظیم کنیم، نه روی خود فیلتر.

اکشن اصلی لیست پروژه‌ها:

<record id="project.open_view_project_all" model="ir.actions.act_window">
    <field name="name">Projects</field>
    <field name="res_model">project.project</field>
    <field name="domain">[]</field>
    <field name="context">{'display_milestone_deadline': True}</field>
    <field name="view_mode">kanban,list,form</field>
    <field name="search_view_id" ref="project.view_project_project_filter"/>
</record>

حالا کانتکست رو آپدیت می‌کنیم و مقدار search_default_اسم‌فیلتر رو ۱ می‌کنیم:

<record id="project.open_view_project_all" model="ir.actions.act_window">
    <field name="context">{'display_milestone_deadline': True, 'search_default_exclude_templates': 1}</field>
</record>

به همین راحتی! حالا وقتی صفحه پروژه‌ها باز می‌شه، فیلتر Exclude Templates به طور پیش‌فرض فعال است.

اشتباهات و خطاهای رایج که من تجربه کردم

  1. اشتباه تایپی در default (defualt)
  2. گذاشتن default="1" روی <filter> باعث ParseError شد
  3. تلاش برای inherit کردن ir.actions.act_window که پشتیبانی نمی‌شه

جمع‌بندی

برای اضافه کردن فیلتر جدید به سرچ در Odoo و فعال کردن پیش‌فرضش:

  • فیلد رو درست تعریف کنید.
  • فیلتر رو به سرچ ویو اضافه کنید.
  • پیش‌فرض بودن رو روی اکشن ست کنید، نه روی فیلتر.

این تجربه نصف روز من طول کشید تا خطاها رو پیدا کنم 😅

امیدوارم برای شما مفید باشه ✌️

معرفی Odoo و حل چالش های کسب و کار
راهنمای ساده برای کسب‌ و کارها تا با Odoo کار آمدتر و بدون دردسر رشد کنند