odoo 上传附件的几种方式

目录

1、上传图片

2、上传不同附件

3、page页面添加附件看板

4、如何在一个视图里面多个page页面添加文件?


1、上传图片

odoo中有一个product.image模型,继承该模型可以实现多张图片的上传和预览。实现效果如下图所示:

python代码:

# -*- coding: utf-8 -*-
from odoo import api, fields, models


class ProductImage(models.Model):
    _inherit = 'product.image'
    cooperation_id = fields.Many2one("market.cooperation")

 xml代码:

<page string="成品文件">
     <field name="finished_file_ids" class="o_website_sale_image_list" mode="kanban"
     options="{'create_text':'Add an Image'}" nolabel="1"/>
</page>

其中finished_file_ids这个字段是一个一对多字段,关联的就是之前所继承的product.image模型。

因为该模型使用的是fields.Image字段,所以只能实现图片的上传,当需要上传其他附件的时候该方法就不可行

2、上传不同附件

实现效果如下图所示:

通过点击添加附件按钮,将附件添加到ir.attachment模型 ,然后点击右上角的合约文件就可以看到相应的文件。

实现方式:

在header标签内定义左边按钮组件:

<widget name="attach_document" string="Attach Document" action="message_post"/>

视图右边按钮:

   <button name="action_get_attachment_view" class="oe_stat_button" icon="fa-file-text-o"
                                type="object">
      <field name="attachment_number" widget="statinfo" string="合约文件" 
                                         options="{'reload_on_button': true}"/>
   </button>

其中attachment_number是一个计算字段,计算ir.attachment中这个模型的附件数量:

  def _compute_attachment_number(self):
        attachment_data = self.env['ir.attachment'].read_group(
            [('res_model', '=', 'market.cooperation'), ('res_id', 'in', self.ids)], ['res_id'], ['res_id'])
        attachment = dict((data['res_id'], data['res_id_count']) for data in attachment_data)
        for record in self:
            record.attachment_number = attachment.get(record.id, 0)
action_get_attachment_view 是点击右边按钮所调用的方法,可以自行添加domain和context对返回的视图数据过滤,例如:
 def action_get_attachment_view(self):
        self.ensure_one()
        res = self.env['ir.actions.act_window'].for_xml_id('base', 'action_attachment')
        res['domain'] = [('res_model', '=', 'market.cooperation'), ('res_id', 'in', self.ids)]
        res['context'] = {'default_res_model': 'market.cooperation', 'default_res_id': self.id}
        return res

3、page页面添加附件看板

可以通过继承ir.attachment模型,写一个一对多字段 

4、如何在一个视图里面多个page页面添加文件?

并且是图片的话将它预览

 

这时候就需要我们自己定义模型,如果继承ir.attachment的话就会到时这几个page页的文件是共用的,以上为成品文件和合约文件分别定义模型,并且为这两个模型添加看板视图和form视图,看板视图用于文件在page页面的显示,form视图用于添加文件时的显示。

其中一个模型定义如下,大家可以参照原生的ir.attachment模型是如何定义的:

class MarketDocument(models.Model):
    _name = 'market.document'
    # 文件名
    filename = fields.Char('Name')
    # 文件
    document = fields.Binary(string='File Content', )
    mimetype = fields.Char('Mime Type', readonly=True, compute='_compute_mimetype')
    url = fields.Char('Url', index=True, size=1024)
    type = fields.Selection([('url', 'URL'), ('binary', 'File')],
                            string='Type', required=True, default='binary', change_default=True,
                            help="You can either upload a file from your computer or copy/paste an internet link to your file.")
    cooperation_id = fields.Many2one("market.cooperation")

上图的按钮定义如下:

   <field name="finished_file_ids" mode="kanban"
            options="{'create_text':'Add an File'}"  nolabel="1">
    </field>

 form视图定义如下:

    <record id="action_marking_cooperation_document_form" model="ir.ui.view">
        <field name="name">cooperation.document.form</field>
        <field name="model">market.document</field>
        <field name="arch" type="xml">
            <form>
                <sheet>
                    <group>
                        <field name="filename"/>
                        <field name="document" widget="binary" filename="filename"/>
                        <field name="type"/>
                    </group>

                </sheet>
            </form>
        </field>
    </record>

其中的 filename属性是为了获取文件上传时候的文件名赋值给filename字段。

实现图片预览和布局就需要写相应的看板视图,这里就不多说了....

Odoo中,后台与前端文件的存储与下载可以通过以下几种方式实现: 1. 文件字段 Odoo中可以通过File字段来存储文件,例如片、文档等。文件字段的值会被存储在数据库中,并且可以在前端展示和下载。例如: ```python from odoo import fields, models class MyModel(models.Model): _name = 'my.model' name = fields.Char() file = fields.Binary(string='File') file_name = fields.Char(string='File Name') ``` 其中,`file`字段存储了文件的二进制数据,`file_name`字段存储了文件的名称。在前端展示时,可以通过以下方式实现: ```xml <field name="file" widget="download_link" filename="file_name"/> ``` 这样,就可以在前端展示并下载文件了。 2. FTP服务器 如果需要存储大量的文件,或者需要对文件进行管理,可以考虑使用FTP服务器来存储文件。Odoo可以通过Python的ftplib库来连接FTP服务器,例如: ```python import ftplib FTP_SERVER = 'ftp.example.com' FTP_USER = 'username' FTP_PASSWORD = 'password' with ftplib.FTP(FTP_SERVER, FTP_USER, FTP_PASSWORD) as ftp: with open('my_file.txt', 'rb') as f: ftp.storbinary('STOR /path/to/my_file.txt', f) ``` 这样,就可以将文件上传到FTP服务器中。在前端展示时,可以通过以下方式实现: ```xml <a href="ftp://username:password@ftp.example.com/path/to/my_file.txt">Download</a> ``` 这样,就可以在前端下载FTP服务器中的文件了。 3. 外部存储 如果需要存储大量的文件,并且需要更好的性能和可扩展性,可以考虑使用外部存储,例如AWS S3、Google Cloud Storage等。Odoo可以通过Python的boto3库来连接外部存储,例如: ```python import boto3 S3_BUCKET = 'my-bucket' S3_ACCESS_KEY = 'access-key' S3_SECRET_KEY = 'secret-key' s3 = boto3.client('s3', aws_access_key_id=S3_ACCESS_KEY, aws_secret_access_key=S3_SECRET_KEY) with open('my_file.txt', 'rb') as f: s3.upload_fileobj(f, S3_BUCKET, 'path/to/my_file.txt') ``` 这样,就可以将文件上传到外部存储中。在前端展示时,可以通过以下方式实现: ```xml <a href="https://s3.amazonaws.com/my-bucket/path/to/my_file.txt">Download</a> ``` 这样,就可以在前端下载外部存储中的文件了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值