|
|
(未显示1个用户的5个中间版本) |
第251行: |
第251行: |
| ==[[创建向导]]== | | ==[[创建向导]]== |
| ===[[向导模型]]=== | | ===[[向导模型]]=== |
− |
| |
− | 向导显示窗体视图向用户,通常作为一个对话框窗口,某些字段必须填写。这些然后会利用向导逻辑。
| |
− | 这实施使用相同的模型/视图体系结构对于常规视图,但支持模型基于 models.TransientModel 而不是models.Model.
| |
− | 这种类型的模型还具有数据库的代表性和存储状态存在,但这一数据预计将是有用的只是直到向导完成其工作。计划的作业定期清理向导数据库表中的旧数据。
| |
− | models/todo_wizard_model.py文件将定义的字段,我们需要与用户进行交互︰ 要更新的任务清单,用户负责和期限日期来设置它们。
| |
− | 首先添加 models/__init__.py文件,写下面的代码行︰from .import todo_wizard_model
| |
− | 然后创建实际models/todo_wizard_model.py文件︰
| |
− | <nowiki>
| |
− | #-*- coding︰ utf-8 -*-
| |
− | from odoo import models,fields,api
| |
− | class TodoWizard(models.TransientModel):
| |
− | _name = 'todo.wizard'
| |
− | _description = 'To-do Mass Assignment'
| |
− | task_ids = fields.Many2many('todo.task',string='Tasks')
| |
− | new_deadline = fields.Date('Deadline to Set')
| |
− | new_user_id = fields.Many2one('res.users',string='Responsible to Set')
| |
− | </nowiki>
| |
− | 使用常规模型一对多关系时,不应在瞬态模型,它是值得的。为此原因是它需要常规模型有瞬态模型,但不允许反转的多对一关系,因为可能随着瞬态记录需要收集垃圾常规模型。
| |
| | | |
| ===[[向导窗体]]=== | | ===[[向导窗体]]=== |
− | 向导窗体视图是相同的常规模型,除了两个具体因素︰
| |
− | A< footer >节可以用于放置动作按钮
| |
− | 一种特殊type ="cancel"按钮可用于中断不执行任何操作向导
| |
− | 这是我们的内容views/todo_wizard_view.xml文件︰
| |
− | <nowiki>
| |
− | <odoo>
| |
− | <record id="To-do Task Wizard" model="ir.ui.view">
| |
− | <field name="name">To-do Task Wizard</field>
| |
− | <field name="model">todo.wizard</field>
| |
− | <field name="arch" type="xml">
| |
− | <form>
| |
− | <div class="oe_right">
| |
− | <button type="object" name="do_count_tasks"
| |
− | string="Count"/>
| |
− | <button type="object" name="do_populate_tasks"
| |
− | string="Get All"/>
| |
− | </div>
| |
− | <field name="task_ids">
| |
− | <tree>
| |
− | <field name="name"/>
| |
− | <field name="user_id"/>
| |
− | <field name="date_deadline"/>
| |
− | </tree>
| |
− | </field>
| |
− | <group>
| |
− | <group>
| |
− | <field name="new_user_id"/>
| |
− | </group>
| |
− | <group>
| |
− | <field name="new_deadline"/>
| |
− | </group>
| |
− | </group>
| |
− | <footer>
| |
− | <button type="object" name="do_mass_update"
| |
− | string="Mass Update" class="oe_highlight"
| |
− | attrs="{'invisible':[('new_deadline','=',False),('new_user_id', '=',False)]}"/>
| |
− | <button special="cancel" string="Cancel"/>
| |
− | </footer>
| |
− | </form>
| |
− | </field>
| |
− | </record>
| |
− | <!-- More button Action -->
| |
− | <act_window id="todo_app.action_todo_wizard"
| |
− | name="To-Do Tasks Wizard"
| |
− | src_model="todo.task" res_model="todo.wizard"
| |
− | view_mode="form" target="new" multi="True"/>
| |
− | </odoo>
| |
− | </nowiki>
| |
− |
| |
− | 在 XML 中我们看到<act_window>窗口,将选项添加到 To-do Task窗体的多个按钮,通过使用src_model属性。target ="new" 属性做为一个对话框窗口打开。
| |
− | 你可能也注意到attrs用于更新模块列表按钮,直到选择新的截止日期或负责任的用户选择更新后才能可见。
| |
| | | |
| ===[[向导业务逻辑]]=== | | ===[[向导业务逻辑]]=== |
− | 接下来,我们需要实现对窗体按钮执行的操作。排除Cancel按钮,我们有三个操作按钮来实现,但现在我们将专注于Mass Update按钮。
| |
− | 通过按钮调用的方法是do_mass_update和它应该被定义在models/todo_wizard_model.py文件,如下面的代码所示︰
| |
| | | |
− | from odoo import exceptions
| + | ===[[记录]]=== |
− | import logging
| + | ===[[抛出异常]]=== |
| | | |
− | _logger = logging.getLogger(__name__)
| |
− |
| |
− |
| |
− | <nowiki># ...</nowiki>
| |
− | <nowiki># class TodoWizard(models.TransientModel):</nowiki>
| |
− | <nowiki># ...</nowiki>
| |
− |
| |
− | @api.multi
| |
− | def do_mass_update(self):
| |
− |
| |
− |
| |
− | self.ensure_one()
| |
− | if not (self.new_deadline or self.new_user_id):
| |
− | raise exceptions.ValidationError('No data to update!')
| |
− | _logger.debug('Mass update on Todo Tasks %s',
| |
− | self.task_ids.ids)
| |
− | vals = {}
| |
− | if self.new_deadline:
| |
− | vals['date_deadline'] = self.new_deadline
| |
− | if self.new_user_id:
| |
− | vals['user_id'] = self.new_user_id
| |
− | <nowiki># Mass write values on all selected tasks</nowiki>
| |
− | if vals:
| |
− | self.task_ids.write(vals)
| |
− | return True
| |
− |
| |
− |
| |
− | 我们的代码应该处理一次,所以我们用一个向导实例self.ensure_one()要明确指出这一点。在这里 self表示向导窗体上的数据的浏览记录。
| |
− | 该方法通过验证如果新的截止日期或负责用户被给出,并将引发错误,如果不开始。接下来,我们有如何调试消息写入服务器日志的示例。
| |
− | 然后vals要设置与大规模更新的值与建立字典︰ 新的日期,新负责,或两者。然后write方法来执行大规模的更新。这是一个循环,在每个记录上执行单个写入效率更高。
| |
− | 是一个好的做法,方法总是返回一些内容。这就是为什么它返回True的值就结束了。唯一的理由是,XML-RPC 协议不支持无值,所以这些方法不会可使用该协议。在实践中,你可能不知道的问题因为 web 客户端使用 JSON RPC,没有 XML-RPC,但它仍是一个好的习惯,效仿。
| |
− | 接下来,我们会仔细看看日志记录,工作,然后会在顶部的两个按钮背后的逻辑︰Count和Get All.
| |
− |
| |
− | ===[[记录]]===
| |
− | ===[[提出异常]]===
| |
| ===[[向导中的助手操作]]=== | | ===[[向导中的助手操作]]=== |
| | | |