在Python中自动完成字段

在Python中自动完成字段,python,python-2.7,openerp-7,Python,Python 2.7,Openerp 7,我有一个名为“name”的字段,“name”中输入的数据将进入数据库。每当我想输入一个新名字,例如“hello”,它应该显示以“he”开头的相关单词 我是Python新手。我们怎样才能做到这一点?我已经为此编写了一个函数 def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100): if not args: args = []

我有一个名为“name”的字段,“name”中输入的数据将进入数据库。每当我想输入一个新名字,例如“hello”,它应该显示以“he”开头的相关单词

我是Python新手。我们怎样才能做到这一点?我已经为此编写了一个函数

def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):
        if not args:
            args = []
        if context is None:
            context = {}
        ids = []
        name = name + '%'
        cr.execute("select name from learner_info where name like %s", (name,))
        ids = cr.dictfetchall()
        return self.name_get(cr, uid, ids, context)

如何在字段中调用此函数?

让我稍微解释一下以下代码:

# this is just for demonstration purposes, for large sets this will blow up quickly

# "element" is comprised of a character [0], special item (id here) [1], next list [2]

class Root():
    root = []
在这里,您可以读取表数据。 为了方便起见,我只使用了一个纯文本文件。 Name是指要建议的字符串,而id是行的id

    # read names from file
    def __init__(self, fname):

        with open(fname, 'r', encoding='utf-8') as infile:
            for line in infile:
                name, id = line.split(" ")
                self.add(name, int(id))

    def add(self, name, item):
        current = self.root
        last = None

        # for every character of string traverse the list
        for character in name:
            has = False

            # for every character in current list compare character
            for element in current:
                last = element

                if element[0] == character:
                    current = element[2]
                    has = True
                    break

            if not has:
                current.append([character, None, []])
                last = current[-1]
                current = current[-1][2]
我们在字符串的末尾,添加id

        if last is not None:
            last[1] = item

    def delete(self):
        pass # dunno if you need that =)

    def traverse(self, node=root, partial=""):
        list = []

        for element in node:
            if element[1] is not None:
                print ("%s%s = %s" % (partial, element[0], element[1]))
                list.append([partial+element[0], element[1]])
            if len(element[2]) > 0:
                list += self.traverse(element[2], partial+element[0])

        return list

    def lookup(self, partial):
        print ("\nlooking up matches for \"%s%%\":" % (partial))
        current = self.root
        counter = 0

        # for every character of string traverse
        for character in partial:

            # for every character in current list compare character
            for element in current:
                if element[0] == character:
                    current = element[2]
                    counter += 1
                    break

        if counter == len(partial):
            print (self.traverse(current, partial))

def test():
    root = Root("names.txt")
    root.traverse()
    root.lookup("ro")

if __name__ == "__main__":
    test()
我使用了以下names.txt:

迈克尔1

米克2

米克尔3

bla 5

罗德里戈2号

罗斯克斯51

罗伯托13


rosquin 1111

让我稍微解释一下以下代码:

# this is just for demonstration purposes, for large sets this will blow up quickly

# "element" is comprised of a character [0], special item (id here) [1], next list [2]

class Root():
    root = []
在这里,您可以读取表数据。 为了方便起见,我只使用了一个纯文本文件。 Name是指要建议的字符串,而id是行的id

    # read names from file
    def __init__(self, fname):

        with open(fname, 'r', encoding='utf-8') as infile:
            for line in infile:
                name, id = line.split(" ")
                self.add(name, int(id))

    def add(self, name, item):
        current = self.root
        last = None

        # for every character of string traverse the list
        for character in name:
            has = False

            # for every character in current list compare character
            for element in current:
                last = element

                if element[0] == character:
                    current = element[2]
                    has = True
                    break

            if not has:
                current.append([character, None, []])
                last = current[-1]
                current = current[-1][2]
我们在字符串的末尾,添加id

        if last is not None:
            last[1] = item

    def delete(self):
        pass # dunno if you need that =)

    def traverse(self, node=root, partial=""):
        list = []

        for element in node:
            if element[1] is not None:
                print ("%s%s = %s" % (partial, element[0], element[1]))
                list.append([partial+element[0], element[1]])
            if len(element[2]) > 0:
                list += self.traverse(element[2], partial+element[0])

        return list

    def lookup(self, partial):
        print ("\nlooking up matches for \"%s%%\":" % (partial))
        current = self.root
        counter = 0

        # for every character of string traverse
        for character in partial:

            # for every character in current list compare character
            for element in current:
                if element[0] == character:
                    current = element[2]
                    counter += 1
                    break

        if counter == len(partial):
            print (self.traverse(current, partial))

def test():
    root = Root("names.txt")
    root.traverse()
    root.lookup("ro")

if __name__ == "__main__":
    test()
我使用了以下names.txt:

迈克尔1

米克2

米克尔3

bla 5

罗德里戈2号

罗斯克斯51

罗伯托13


rosquin 1111

更大的图景是什么?这个函数在隔离状态下成功了吗?没有,还有其他方法吗?更大的图景是什么?此函数是否在隔离状态下成功?否,是否有其他方法?