Почему двоичное поле имени файла отсутствует в переходной модели в Odoo 9? - PullRequest
0 голосов
/ 26 февраля 2019

Я создал TransientModel, в котором есть двоичное поле, ожидающее ZIP-файл, поэтому я хочу поработать с его именем файла, чтобы убедиться, что загруженный пользователем файл на самом деле является ZIP-файлом.Так я и сделал как всегда:

КОД

XML

<field name="filename" invisible="0"/>
<field name="source_file" widget="binary" filename="filename"/>

<button name="import_zip" string="Import" type="object" class="oe_highlight"/>

Python 2.7

class EasyImport(models.TransientModel):
    _name = 'easy.import'

    source_file = fields.Binary(
        string='Choose a ZIP File',
        required=True,
    )
    filename = fields.Char(
        string='Filename',
        readonly=True,
        required=True,
    )

    @api.onchange('filename')
    def onchange_filename(self):
        _logger.critical(self.filename)  # Returns the filename OK

    @api.multi
    def import_zip(self):
        self.ensure_one()
        _logger.critical(self.filename)  # Returns False

НАЗНАЧЕНИЕ

Отклонить файлы не в формате ZIP.Или, по крайней мере, прочитайте поле filename.

ПРОБЛЕМА

Поле filename всегда False (кроме метода onchange).

Я пытался получить его значение в ограничении, в методе import_zip ... но он возвращает False.Тем не менее, я вижу имя файла в интерфейсе, поскольку я показываю поле filename в представлении XML, и оно правильно и автоматически заполняется.

У меня есть уродливый обходной путь с вычисленным полем для работыс именем файла, но я хочу улучшить это и знать, что здесь происходит.

Есть идеи?Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Проблема не связана с переходными моделями, ни двоичными полями, ни с какими-либо из них.

Поле filename доступно только для чтения, и я только что понял, что произошло с полями только для чтения в сочетании с методами onchange, тамЭто большая ошибка в Odoo, по моему мнению, до сих пор без исправления - по крайней мере, в версии 9 -: ​​

Если вы измените поле только для чтения в событии onchange, вы можете работать с OKего новое значение, пока вы не сохраните запись.Когда это происходит, новое значение превращается в старое, и каждый метод, который его использует, получает старое значение.

В моем случае я видел filename OK в onchangeметод, потому что запись не была сохранена, но когда я нажал на кнопку, которая выполняет метод import_zip, перед выполнением ее содержимого, запись сохраняется, и из-за ошибки Odoo значение filename было заменено его старым значением (котороевсегда False).

Таким образом, в основном решение состоит в том, чтобы сделать поле «не только для чтения» fieldname:

filename = fields.Char(
    string='Filename',
    readonly=False,
    required=True,
)

А в XML сделать его невидимым, чтобы избежать несоответствий:

<field name="filename" invisible="1"/>
...