سلام دوستان! 😄
امروز میخوایم یک ترفند ساده ولی کاربردی تو 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 به طور پیشفرض فعال است.
اشتباهات و خطاهای رایج که من تجربه کردم
- اشتباه تایپی در default (defualt)
- گذاشتن default="1" روی <filter> باعث ParseError شد
- تلاش برای inherit کردن ir.actions.act_window که پشتیبانی نمیشه
جمعبندی
برای اضافه کردن فیلتر جدید به سرچ در Odoo و فعال کردن پیشفرضش:
- فیلد رو درست تعریف کنید.
- فیلتر رو به سرچ ویو اضافه کنید.
- پیشفرض بودن رو روی اکشن ست کنید، نه روی فیلتر.
این تجربه نصف روز من طول کشید تا خطاها رو پیدا کنم 😅
امیدوارم برای شما مفید باشه ✌️