在前面教程中,咱們使用了兩種類型的視圖——TreeView 和 FormView. 今天咱們將學習使用另外一種類型的視圖——SearchView, 搜索視圖。git
經過以前的實踐,咱們應該已經知道 Odoo 會爲咱們的模型定義默認的 TreeView 和 FormView 了吧,那對於咱們今天要說的主角 SearchView 其實也是同樣的,咱們打開任意一個列表視圖,均可以在列表的右上方看到有搜索框,除了能在搜索框裏輸入文字進行檢索外,點一下搜索框右側的放大鏡還能展開更多的搜索功能,包括過濾器(Filters
),分組(Group By
)以及收藏(Favorites
),其中最經常使用的就是過濾器了,咱們稍候將會講到。github
默認的搜索視圖只會對模型的 name
字段(或 _rec_name
指定的字段)進行檢索,例如在咱們的待辦事項列表中搜索,會看到搜索框下方自動出現了搜索項,這裏的「描述」也就是咱們的待辦事項模型 todo.task
的 name
字段了:數據庫
那咱們若是想讓「分類」也能用於待辦事項的搜索,該怎麼作呢?咱們接下來就打開視圖文件,先定義好搜索視圖的基本結構:dom
<!-- views.xml --> <record id="todo_task_view_filter" model="ir.ui.view"> <field name="name">todo.task.view_filter</field> <field name="model">todo.task</field> <field name="arch" type="xml"> <search string="Todo"> ... </search> </field> </record>
搜索視圖和列表視圖以及表單視圖同樣,都有類似的結構,惟一不一樣的就是在 arch
內的部分。接下來咱們要在 <search />
中加上咱們想要搜索的字段:學習
<search string="Todo"> <field name="name"/> <field name="category_id"/> </search>
超簡單有沒有!只須要把想要被用於搜索的字段放到 <search />
內就能夠了,這裏須要注意的是,咱們本身定義了搜索視圖,至關於覆蓋掉了默認的視圖,因此咱們還須要將字段 name
也加入到裏面,否則咱們就沒辦法根據待辦事項的描述進行搜索啦。ui
升級一下模塊,在輸入框隨便輸入搜索內容看看發生了什麼變化:spa
還記得咱們以前建立過「工做」這個分類嗎,在下面列出的「分類」的搜索結果中,點擊小三角符號,就會打開匹配到的相關結果。3d
咱們再來看看 Odoo 的搜索視圖自帶的過濾器,點開以後咱們只看到一個添加自定義過濾器的選項,再點一下看看,出現了一些選項:code
咱們試試隨意添加一些規則,而後點擊應用,看看會有什麼發生(我分別選擇了「緊急程度」「is」「普通」):orm
咱們能夠看到在搜索框中,應用了這個過濾器,而且這個過濾器被添加到了過濾器的選項中,咱們還能夠再添加幾個過濾器試試看。
經過以上的操做,咱們不難看出,這裏的過濾器其實就是一個個過濾規則,並且咱們能夠同時應用多個不一樣的規則。若是咱們有大量的數據,而咱們想要快速篩選出特定的數據的話,就可使用過濾器達到這個目的。
若是咱們切換到其餘菜單或者刷新頁面,就會發現以前應用的過濾器,又消失了,若是咱們在某些數據上須要高頻次進行過濾操做的話,每次都要手動添加過濾規則的話,就顯得十分不方便了,因此咱們來看看怎麼在搜索視圖中定義過濾器吧:
<search string="Todo"> <field name="name"/> <field name="category_id"/> <separator/> <filter string="未完成" name="undone" domain="[('is_done', '=', False)]"/> <filter string="已完成" name="done" domain="[('is_done', '=', True)]"/> <separator/> <filter string="待辦" name="todo" domain="[('priority', '=', 'todo')]"/> <filter string="普通" name="normal" domain="[('priority', '=', 'normal')]"/> <filter string="緊急" name="urgency" domain="[('priority', '=', 'urgency')]"/> </search>
咱們在 <search />
裏添加了五個過濾器 <filter />
,其中 string
是顯示的名稱,name
是數據庫中存儲的名字,咱們能夠經過它來獲取到對應的過濾器,最關鍵的一個屬性就是 domain
了。在 Odoo 中的各類過濾都是經過domain
來實現的,它是一個由邏輯前綴和表達式元組組成的列表,關於 domain
的更多細節,這裏先不展開來講,後面應該會專門寫一篇來講說它。
咱們以「未完成」這個過濾器的 domain 爲例,先無論條件是什麼,先寫下一個空的列表 []
,這裏要記住了,只要是用到 domain 的地方,都先寫下一對中括號 []
,由於剛接觸經常會由於少寫了括號而致使程序出現錯誤。
而後咱們先不考慮邏輯前綴的事情,咱們這裏也暫時沒有用到,因此不要讓這個名詞困擾到了。在剛剛寫下的空列表中,添加一對圓括號 ()
,也就是一個元組,最基本的結構已經有了,如今咱們來寫表達式。咱們用來標記一個待辦事項是否完成,用的是字段 is_done
,若是它的值爲 False
則表示這個待辦事項未完成,反之則表示已完成,根據這個規則,咱們能夠在元組中添加咱們的表達式了,先寫下字段名 'is_done'
(注意這裏是字符串),而後寫下表達式的操做符 '='
(這裏也是一個字符串),最後寫下未完成對應的值 False
(這裏是一個布爾值,非字符串)。
怎麼樣,是否是很簡單呢,可能有同窗要問了,爲何這裏是用等於號 =
而不是 ==
呢?這裏就須要你們注意而且習慣了,不一樣於咱們平時寫代碼判斷相等時會用 ==
雙等號,在 domain 的表達式中判斷相等是使用的 =
單個等號,千萬記住啦!
其餘的過濾器咱們也能使用一樣的方式寫出來,你們再好好理解一下吧。咱們再來看到上面出現的 <separator />
這個標籤,它有兩個做用,一個是將搜索字段和過濾器之間進行分組隔離,另外一個做用是以邏輯與(Python 中的 and
)對搜索字段和過濾器進行鏈接,說再多不如實踐來得清楚,咱們先升級一下代碼,而後刷新頁面看看實際的效果吧:
心細的你必定發現了,是否完成的過濾器和緊急程度的過濾器被一條分割線分隔開了,從上面的代碼中咱們能夠看到這根分割線正是 <separator />
這個標籤在界面上顯示的效果。咱們若是同時勾選同一組內的過濾器,能夠發現搜索框內的過濾器被 or
鏈接起來了,這代表了同一組內的過濾器會使用邏輯或(Python 中的 or
)進行鏈接,而若是同時選中兩個不一樣組的過濾器,搜索框內的過濾器標籤則是分開的,也就是咱們前面說的,被用邏輯與鏈接起來了。
試試看在搜索框中輸入內容並搜索,而後加上過濾器組合看看效果吧,有沒有發現什麼呢?再看看搜索視圖的代碼,在 <field />
和 <filter />
之間還有一個 <separator />
呢。
使用字段搜索和過濾器,已經能夠知足大部分數據的搜索需求了,有時候咱們除了須要按規則過濾出所需的數據外,還會須要對數據進行分組查看,這種時候就能夠用上分組(group by
)功能了。
和過濾器同樣,分組功能咱們一樣能夠本身添加自定義的分組,可是要比過濾器簡單得多,只須要選擇一個字段而後應用便可。
咱們來看看在搜索視圖中如何定義分組項:
<search string="Todo"> ... <filter string="緊急" name="urgency" domain="[('priority', '=', 'urgency')]"/> <group expand="0" string="分組"> <filter string="分類" domain="[]" context="{'group_by':'category_id'}"/> <filter string="緊急程度" domain="[]" context="{'group_by':'priority'}"/> </group> </search>
咱們添加了一個 <group />
標籤,而且在裏面添加了兩個 <filter />
,眼尖的你必定發現了,這裏和過濾器長得如出一轍,只是多了一個 context
屬性,是的沒有錯,分組的關鍵也就在這個 context
屬性裏,裏面是一個字典,對應的鍵值對錶示按指定字段進行分組。
另外咱們再看到這裏留空的 domain
,你們能夠嘗試在裏面添加一些表達式,看看會有什麼效果,這裏我就不細說了,快升級模塊而後去頁面中刷新看看效果吧:
咱們能夠看到數據按照咱們所選的分組項進行了分組,而且默認是摺疊起來的,點擊展開以後咱們能夠看到對應分組下的數據,默認摺疊這個行爲是由 <group />
標籤的 expand
屬性決定的,若是設置爲 1 的話就會是默認展開。
你們能夠試試看同時應用多個分組,或者將分組和過濾器組合使用,仔細觀察和思考產生的結果。
以上就是此次教程的內容啦,SearchView 中還有一個收藏功能咱們沒有講到,這個功能咱們目前或者很長的一段時間內都不會用到,因此也不打算在以後的教程中講解,若是感興趣的話能夠本身嘗試着去使用,安裝一些官方的模塊,又或者看看源代碼,去學習相關的知識。
仍是老規矩,教程中的代碼會更新在 GitHub
倉庫「Odoo-Tutorial-Demo」中。