Ich habe ein Übergangsmodell, das als Dialog dient. In meiner Formularansicht habe ich eine Schaltfläche wie diese:

<footer states="partnerId">
   <button name="check_tax_id" string="Tovább" type="object"/>
</footer>

Die Schaltfläche ruft diese Funktion auf (ich kann bestätigen, dass sie tatsächlich aufgerufen wird):

@api.one
    def check_tax_id(self, context=None):
        self.state = "partnerDetails"

        return None;

Mein Problem ist, dass das Dialogfenster sofort geschlossen wird, sobald ich auf diese Schaltfläche klicke! Was mache ich falsch?

13
Aron Lorincz 12 Aug. 2015 im 13:56

6 Antworten

Beste Antwort

Lösung 0

@api.multi
def check_tax_id(self):
    self.ensure_one()
    self.name = "New name"
    return {
        "type": "ir.actions.do_nothing",
    }

Diese Lösung wurde hier von Tadeusz Karpinski bereitgestellt.

Lösung 1

Sie können ein neues Formular mit derselben Datensatz-ID zurückgeben.

@api.multi
def check_tax_id(self):
    self.ensure_one()
    self.name = "New name"
    return {
        'context': self.env.context,
        'view_type': 'form',
        'view_mode': 'form',
        'res_model': 'model_name',
        'res_id': self.id,
        'view_id': False,
        'type': 'ir.actions.act_window',
        'target': 'new',
    }

Lösung 2

Sie können ein Widget in jQuery erstellen. Dadurch wird der Assistent geöffnet und Sie können den Schaltflächen das gewünschte Verhalten manuell zuweisen. Mit der Funktion call können Sie auch Python-Funktionen aufrufen:

[...]

new instance.web.Dialog(this, { 
    title: _t("Title"), 
    width: '95%', 
    buttons: [
          { text: _t("First button"), click: function() { self.first_button(); }}, 
          { text: _t("Second button"), click: function() { self.second_button(); }},
          { text: _t("Close"), click: function() {  dialog.close(); }},                       
      ],
});

[...]

Lösung 3

Natürlich können Sie auch die Erstellungsmethode überschreiben, um in einigen Fällen die Erstellung des Datensatzes zu vermeiden

Lösung 4

Eine letzte Option. Erstellen Sie einen Workflow mit einem Statusfeld. Erstellen Sie Workflow-Schaltflächen, um Signale zum Ändern des Status zu senden. Sie können den Rest der Felder mit dem Attribut attrs und dem Statusfeld ein- oder ausblenden. Aber ich weiß nicht, ob sich das an Ihre Bedürfnisse anpassen würde.

24
ChesuCR 1 Feb. 2018 im 17:12

Sie können die Schaltfläche einen anderen Assistenten öffnen lassen, der den Kontext mit allen im ersten Assistenten eingegebenen Werten übergibt. Dies ermöglicht es Ihnen, einige Funktionen auszuführen, z. Ihr Knopf. Und behalten Sie den Status Ihres Assistenten bei. Der Standardwert für Felder in Ihrem Assistenten muss daher zuerst den Kontext überprüfen und auf etwas anderes zurückgreifen.

Hier ist ein Beispiel:

class MyWizard(models.TransientModel):
    _name = 'myaddon.mywizard'

    def _get_default_char(self):
        return self._context.get('mychar',"")

    mychar = fields.Char(string="My Char", default=_get_default_char)

    @api.multi
    def my_button(self):
        # Execute Function Here
        # reload wizard with context

        return {
            'view_type': 'form',
            'view_mode': 'form',
            'res_model': 'myaddon.mywizard',
            'type': 'ir.actions.act_window',
            'target': 'new',
            'context': '{"mychar":'HELLO WORLD'}',
        }
0
Phillip Stack 7 Sept. 2016 im 15:52

Gestern bin ich auf dasselbe Thema gestoßen. Ich musste einen Knopf zeigen, um etwas zu tun, ohne den gesamten Assistenten einzureichen. Ich habe es umgangen, indem ich überhaupt keinen Knopf benutzt habe. Es ist ziemlich einfach und effektiv. Was du brauchst:

  1. ein boolesches Flag in Ihrem Assistentenmodell
  2. eine Änderung, die an das Flag angehängt ist (die Ihre Übermittlungsfunktion ersetzt)
  3. Ersetzen Sie die Schaltfläche in der Ansicht mit der Flagge mit invisible="1" und einer Beschriftung, die als Schaltfläche gestaltet werden soll

Hier ist der Code:

source_it = fields.Boolean(string='Source')
[...]
def action_source(self):
    # do stuff

@api.onchange('source_it')
def onchange_source_it(self):
    if self.env.context.get('sourcing_now') or not self.source_it:
        return
    self.action_source()
[...]
<label for="source_it" class="pull-left btn btn-success" />
<field name="source_it" invisible="1" />

Der Trick funktioniert, weil sich ein Label mit dem Attribut for wie das Kontrollkästchen selbst verhält. Wenn Sie also auf das Label klicken, wechseln Sie das Kontrollkästchen.

2
simahawk 30 Aug. 2017 im 06:25

Auf odoo 7

def traszero(self ,cr ,uid ,ids ,context=None):
        data_obj = self.pool.get('stock.return.picking.line')
        ret_wizard = self.browse(cr, uid, ids, context=context)
        if ret_wizard.product_return_moves:
            line_ids = ret_wizard.product_return_moves.mapped('id')
            data_obj.write(cr, uid, line_ids, {'quantity': 0}, context=context)
        return {'name':"Return Shipment",
            'res_model':"stock.return.picking",
            'src_model':"stock.picking",
            'view_mode':"form",
            'target':"new",
            'key2':"client_action_multi",
            'multi':"True",
            'res_id':ids[0],
            'type': 'ir.actions.act_window',
            }
0
Hamza Salem 28 Apr. 2016 im 10:29

Das Einfachste ist:

@api.multi
def null_action(self):
    return {
        "type": "set_scrollTop",
    }

Da der Typ verwendet wird, um eine Methode in der Klasse ActionManager (Javascript) aufzurufen

Es ist besser als "type": "ir.actions.do_nothing", das eine Ausnahme generiert (dieses Attribut existiert nicht).

4
user3778322 4 Mai 2017 im 14:06

In meinem Fall funktioniert dieser Code.

@api.multi
def test(self):
    l = logging.getLogger()
    l.warn("xD")
    return {
        "type": "ir.actions.do_nothing",
    }
7
Tadeck 23 Feb. 2017 im 17:05