iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Odoo

利用【AI】工具,聰明進行 Odoo 程式開發系列 第 15

Day15:個案一:學校圖書管理(11)-網站查詢圖書

  • 分享至 

  • xImage
  •  

使用者故事

使用者故事
建立一個圖書館網站,供查詢現有圖書

1.建立網頁
2.表列現有圖書
3.點選圖書後可查看圖書詳細內容

GPT 重點回應內容


1. 建立網頁

在 Odoo 中,我們可以使用 website 模組來建立網站頁面。我們需要擴展現有的模組,添加網站控制器和模板。
首先,確保您的模組依賴於 website 模組。
__manifest__.py 中添加依賴:

'depends': ['base', 'mail', 'website'],

2. 表列現有圖書

我們需要建立一個控制器,處理網頁的路由,並在模板中顯示現有的圖書列表。

建立控制器

在您的模組目錄下,創建一個 controllers 目錄(如果尚未存在),並在其中添加一個 controllers.py 文件。

controllers/controllers.py

from odoo import http
from odoo.http import request

class LibraryWebsite(http.Controller):

    @http.route(['/library/books'], type='http', auth='public', website=True)
    def list_books(self, **kwargs):
        books = request.env['library.book'].search([])
        return request.render('your_module.library_book_list_template', {
            'books': books,
        })

    @http.route(['/library/book/<model("library.book"):book>'], type='http', auth='public', website=True)
    def view_book(self, book, **kwargs):
        return request.render('your_module.library_book_detail_template', {
            'book': book,
        })
  • 說明
    • @http.route 裝飾器定義了 URL 路由。
    • list_books 方法處理 /library/books 路徑,查詢所有的圖書,並渲染模板。
    • view_book 方法處理 /library/book/<id> 路徑,顯示特定圖書的詳細信息。

確保在 controllers 目錄下有 __init__.py 文件,並導入 controllers.py


建立模板

在您的模組目錄下,創建一個 views 目錄(如果尚未存在),並在其中添加模板文件。

views/library_book_templates.xml

<odoo>
    <template id="library_book_list_template" name="Library Book List">
        <t t-call="website.layout">
            <div class="container mt-5">
                <h1 class="mb-4">圖書列表</h1>
                <ul class="list-group">
                    <t t-foreach="books" t-as="book">
                        <li class="list-group-item">
                            <a t-att-href="'/library/book/%s' % book.id">
                                <t t-esc="book.name"/>
                            </a>
                        </li>
                    </t>
                </ul>
            </div>
        </t>
    </template>

    <template id="library_book_detail_template" name="Library Book Detail">
        <t t-call="website.layout">
            <div class="container mt-5">
                <h1><t t-esc="book.name"/></h1>
                <p><strong>作者:</strong> <t t-esc="book.author"/></p>
                <p><strong>ISBN:</strong> <t t-esc="book.isbn"/></p>
                <p><strong>分類:</strong> <t t-esc="book.category_id.name or '未分類'"/></p>
                <p><strong>狀態:</strong>
                    <t t-if="book.is_borrowed">已借出</t>
                    <t t-else>可借閱</t>
                </p>
                <a href="/library/books" class="btn btn-secondary mt-3">返回圖書列表</a>
            </div>
        </t>
    </template>
</odoo>
  • 說明
    • library_book_list_template 模板用於顯示圖書列表,每個圖書項目都鏈接到其詳細頁面。
    • library_book_detail_template 模板用於顯示圖書的詳細信息。

注意事項

  • 權限:我們在路由中使用了 auth='public',表示任何人都可以訪問。如果您希望限制訪問,可以將 auth 參數設置為 user,這樣只有登入的用戶才能訪問。

  • 模板的調整:您可以根據需要美化模板,添加更多的樣式和內容。可以使用 Bootstrap 等框架進行排版。

  • 多語言支持:如果需要支持多語言,可以使用 Odoo 的翻譯機制。在模板中使用 _() 方法標記需要翻譯的文本。


搜尋功能示例

修改控制器

class LibraryWebsite(http.Controller):

    @http.route(['/library/books'], type='http', auth='public', website=True)
    def list_books(self, search='', **kwargs):
        domain = []
        if search:
            domain += ['|', '|',
                       ('name', 'ilike', search),
                       ('author', 'ilike', search),
                       ('isbn', 'ilike', search)]
        books = request.env['library.book'].search(domain)
        return request.render('your_module.library_book_list_template', {
            'books': books,
            'search': search,
        })

修改模板

<odoo>
    <template id="library_book_list_template" name="Library Book List">
        <t t-call="website.layout">
            <div class="container mt-5">
                <h1 class="mb-4">圖書列表</h1>
                <form method="get" action="/library/books">
                    <div class="input-group mb-3">
                        <input type="text" name="search" class="form-control" placeholder="搜尋書名、作者或ISBN" t-att-value="request.params.get('search')"/>
                        <div class="input-group-append">
                            <button class="btn btn-primary" type="submit">搜尋</button>
                        </div>
                    </div>
                </form>
                <ul class="list-group">
                    <t t-foreach="books" t-as="book">
                        <li class="list-group-item">
                            <a t-att-href="'/library/book/%s' % book.id">
                                <t t-esc="book.name"/>
                            </a>
                        </li>
                    </t>
                    <t t-if="not books">
                        <li class="list-group-item">沒有找到相關的圖書。</li>
                    </t>
                </ul>
            </div>
        </t>
    </template>
</odoo>

本章小節

在本章中,我們建立了一個圖書館網站,供用戶查詢現有的圖書,並詳細了解每本書的資訊。我們主要完成了以下幾個步驟:

建立網頁選單

透過擴展 Odoo 的 website 模組,我們為圖書館系統新增了網站功能。在模組的 __manifest__.py 中,我們添加了對 website 的依賴,讓我們可以利用 Odoo 的網站框架建立前端頁面。
https://ithelp.ithome.com.tw/upload/images/20240929/20102255LruzNWqubx.jpg

前台網站的應用

本章著重介紹了如何在 Odoo 中使用前台網站功能,為用戶提供友好的圖書查詢介面。透過 Odoo 的 website 模組,我們可以:

  • 建立自定義的網站頁面:利用控制器和模板,我們可以自定義網站的各個頁面,滿足特定的業務需求。

  • 與模型數據交互:在控制器中,我們可以訪問 Odoo 的模型數據,將後端的資料展示在前端頁面上。

  • 使用 QWeb 模板語言:QWeb 是 Odoo 的模板引擎,支持動態渲染和模板繼承,方便我們構建複雜的網頁。

  • 整合搜尋功能:我們還可以在頁面上添加搜尋功能,讓用戶能夠快速找到他們感興趣的圖書。

詳細程式碼,可查看github修改記錄

https://github.com/kulius/odoo17_ithelp

上一篇
Day14:個案一:學校圖書管理(10)-逾期提醒寄送e-mail
下一篇
Day16:個案一:學校圖書管理(12)-網站圖書預約-新增網頁選單
系列文
利用【AI】工具,聰明進行 Odoo 程式開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言