Enable Dark Mode!
By: Varsha Vivek K

How to Upload Files from Web Form in Odoo 13

Technical Odoo 13 Website&E-commerce

On the Odoo website, we have different forms like contact forms, contact details forms, etc. These forms are used to collect information from the end-user. End users can enter the data based on the fields defined in a web form.

We know that there are different types of input fields like text, submit, checkbox, date, button, etc. Basically, in the Odoo field types in the web forms like text, text area, checkbox, submit, etc are used. But if we want to upload some files with these fields we have to add an input field with type as a file. So in this blog, I am going to explain how to upload files through web forms.

First of all, we want to define a field to store attachments in our model as below,

attachment = fields.Many2many('ir.attachment', 'attach_rel', 'doc_id','attach_id3',               
                        help='You can attach the copy of your document', copy=False)

And there must be a related field in the model ‘ir.attachment’.

class Attachment(models.Model):
    _inherit = 'ir.attachment'
    attach_rel = fields.Many2many('res.partner', 'attachment', 'attachment_id3', 'document_id',string="Attachment", invisible=1 )


Now let’s create a web form on our website. In the below code it shows only the form tag with the input field for the attachment. You can define this field inside a form where ever you want. But there must be an important thing to note. That is, you can see the form tag has a number of attributes like action, method, enctype, etc, but the attribute named enctype has an important role in transferring attachment data.

enctype="multipart/form-data": It means no characters in the files will be encoded. So it is used when a web form requires binary data (like contents of a file to be uploaded) and it is also used for uploading files to the database.

.xml :

<form action="/my/account" method="post" enctype="multipart/form-data">
<------ your code ------->
<div class="form-group">
      <div class="col-lg-3 col-md-4 text-right">
          <label class="col-form-label" for="attachment">Attachment(s)</label>
      <div class="col-lg-7 col-md-8">
           <input type="file" name="attachment" multiple="true"
<------ your code ------->

The above code helps us to make a field like as shown below,


When the form action occurs, the action goes to the controller file. This is from where we can convert our data and store it into the database.

main.py :

@route(['/my/account'], type='http', auth='user', website=True)
def account(self, redirect=None, **post):
    <------ your code ------->
partner = request.env.user.partner_id
        Attachments = request.env['ir.attachment']
        name = post.get('attachment').filename
        file = post.get('attachment')
        attachment_id = Attachments.create({
            'name': name,
            'type': 'binary',
            'datas': base64.b64encode(file.read()),
            'res_model': partner._name,
         'res_id': partner.id
            'attachment': [(4, attachment_id.id)],
    <------ your code ------->


The above code creates an attachment with name, rec_model, etc. You can see your uploaded files in the rec_model because we already define an attachment field in our rec_model.

This is how we add a file upload field in a web form and so it helps the end-users to upload their document from the website. I hope this blog is helpful for you.

If you need any assistance in odoo, we are online, please chat with us.



AttributeError: 'str' object has no attribute 'read'




Kevin Cruz

Hello thanks for the tutorial, I got a question. Do this Guide works for odoo 12? The form is being send but i don't get the file in the contact attachment files, could help me please. Thanks




Leave a comment




Cybrosys Technologies Pvt. Ltd.
Neospace, Kinfra Techno Park
Kakkancherry, Calicut
Kerala, India - 673635



Cybrosys Technologies Pvt. Ltd.
1st Floor, Thapasya Building,
Infopark, Kakkanad,
Kochi, India - 682030.



Cybrosys Techno Solutions
The Estate, 8th Floor,
Dickenson Road,
Bangalore, India - 560042

Send Us A Message