「Odoo 基礎教程系列」第五篇——從 Todo 應用開始(4)

Powered by @atgranberry

在前面教程中,咱們使用了兩種類型的視圖——TreeView 和 FormView. 今天咱們將學習使用另外一種類型的視圖——SearchView, 搜索視圖。git

搜索字段

經過以前的實踐,咱們應該已經知道 Odoo 會爲咱們的模型定義默認的 TreeView 和 FormView 了吧,那對於咱們今天要說的主角 SearchView 其實也是同樣的,咱們打開任意一個列表視圖,均可以在列表的右上方看到有搜索框,除了能在搜索框裏輸入文字進行檢索外,點一下搜索框右側的放大鏡還能展開更多的搜索功能,包括過濾器(Filters),分組(Group By)以及收藏(Favorites),其中最經常使用的就是過濾器了,咱們稍候將會講到。github

默認的搜索視圖只會對模型的 name 字段(或 _rec_name 指定的字段)進行檢索,例如在咱們的待辦事項列表中搜索,會看到搜索框下方自動出現了搜索項,這裏的「描述」也就是咱們的待辦事項模型 todo.taskname 字段了:數據庫

默認搜索

那咱們若是想讓「分類」也能用於待辦事項的搜索,該怎麼作呢?咱們接下來就打開視圖文件,先定義好搜索視圖的基本結構: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」中。

相關文章
相關標籤/搜索