2017-01-20 3 views
0

У меня есть 2 вопроса. Первый.Simple Odoo/Python/XML

Это поле должно быть целым большим или равным, чем 50. Как я могу это сделать.

value = fields.Integer("Value", required=True) 

второй вопрос.

Я хотел добавить поиск по «имени», но если я запустил этот coed, я получаю TypeError: Type не является конструктором. что не так с моим поисковым разделом? без секции поиска он работает нормально.

<record model="ir.ui.view" id="helloworld.list2"> 
     <field name="name">helloworld listx</field> 
     <field name="model">helloworld.test2</field> 
     <field name="arch" type="xml"> 
     <search> 
      <field name="name"/> 
     </search> 
     <tree> 
      <field name="name"/> 
      <field name="reference"/> 
     </tree> 
     </field> 
    </record> 

ОБНОВЛЕНИЕ.

from openerp import models, fields, api 
from openerp.exceptions import ValidationError 


class HelloWorld(models.Model): 
    _name = 'helloworld.test' 
    name = fields.Char("Name", required=True, size=20) 
    value = fields.Integer("Value", required=True) 

    # I am adjusting the indentation below so the methods become part of your class 

    @api.onchange('value') 
    def _onchange_value(self): 
     for record in self: 
      if record.value < 20: 
       raise ValidationError("Your record is too small: %s" % record.value) 
+0

Если вы нашли этот ответ полезным, я был бы признателен, если вы отметите его как правильное. Благодаря! –

ответ

2

Есть несколько способов это может быть сделано, однако декоратор «Сдерживает», вероятно, что вы хотите. Если нет, вы можете переопределить методы «write» и «create» для создания исключений.

Функции ограничений будут выполняться перед записью или созданием записи. И не позволит записывать запись, если значение не проходит проверку.

from odoo.exceptions import ValidationError 

@api.constrains('value') 
def _check_value_field(self): 
    for record in self: 
     if record.value < 50: 
      raise ValidationError("Your record is too small: %s" % record.value) 

Что касается вашего поиска. У вас также есть древовидная структура. Вид поиска и древовидный вид - отдельные вещи. Вы должны определить их отдельно.

<record model="ir.ui.view" id="helloworld.tree2"> 
     <field name="name">test2.tree</field> 
     <field name="model">helloworld.test2</field> 
     <field name="arch" type="xml"> 
     <tree> 
      <field name="name"/> 
      <field name="reference"/> 
     </tree> 
     </field> 
</record> 

<record model="ir.ui.view" id="helloworld.search2"> 
     <field name="name">test2.search</field> 
     <field name="model">helloworld.test2</field> 
     <field name="arch" type="xml"> 
     <search> 
      <field name="name"/> 
     </search> 
     </field> 
</record> 

Вы можете, если вы хотите обеспечить немедленную проверку полевых данных с использованием «OnChange» функции, а также (как CZoellner рекомендуется), это будет немедленно уведомлять пользователя введенное значение является недействительным, однако не следует используется для проверки записи, поскольку пользователь может просто обходить сообщение об ошибке. Вот пример.

from odoo.exceptions import ValidationError 

@api.onchange('value') 
def _onchange_value(self): 
    for record in self: 
     if record.value < 50: 
      raise ValidationError("Your record is too small: %s" % record.value) 
+0

Есть ли более простой способ? Например, если мы хотим, чтобы длина нашего поля была 20 макс, мы делаем это как fields.interger (size = 20), может быть, есть что-то подобное? – Grf

+0

Не об этом я знаю. –

+0

Полностью согласен с вашим ответом Филиппом. Возможно, вы захотите увеличить его, изменив значение 'record.value <50' на' record.value> = 50', так как OP упоминается «больше или равно 50» –