我正在尝试对在这里找到的网站使用ajax搜索片:http://www.web2pyslices.com/slices/take_slice/51

但是由于某种原因,我不断收到错误:

IndexError: list index out of range


这是我的代码版本:

default.py(控制器)

def index():
listings = db().select(db.listing.ALL, orderby=db.listing.first_name)

return dict(listings=listings, livesearch=livesearch())

def livesearch():
    partialstr = request.vars.values()[0]
    query = db.listing.title.like('%'+partialstr+'%')
    listings = db(query).select(db.listing.title)
    items = []

    for (i,listing) in enumerate(listings):
        items.append(DIV(A(listing.title, _id="res%s"%i, _href="#", _onclick="copyToBox($('#res%s').html())"%i), _id="resultLiveSearch"))

    return TAG[''](*items)


livesearch.html(视图,我是layout.html中的{{includes}}

<input type="text" id="search" name="search" autocomplete="off" onkeyup="getData(this.value);" /><br />
<div id="ajaxresults"></div>


db.py(模型)

db.define_table(auth.settings.table_user_name,
            Field('first_name'),
            Field('last_name'),
            Field('email'),
            Field('password','password', length=512, readable=False, label='Password'),
            Field('title'),
            Field('photo','upload'),
            Field('bio','text'),
            Field('phone'), # Contact details
            Field('website'),
            Field('address'),
            Field('registration_key', length=512,
                writable=False, readable=False, default=''),
            Field('reset_password_key', length=512,
                writable=False, readable=False, default=''),
            Field('registration_id', length=512,
                writable=False, readable=False, default=''),
            )

listing = db[auth.settings.table_user_name]


任何帮助将不胜感激,因为我已经动脑筋了好几天了(因为我对编程非常陌生)

谢谢!

最佳答案

def index():
    listings = db().select(db.listing.ALL, orderby=db.listing.first_name)
    return dict(listings=listings, livesearch=livesearch())


您不想从livesearch函数返回index。根据您引用的slice,应从您的livesearch页面通过Ajax调用index函数。

def livesearch():
    partialstr = request.vars.values()[0]


我知道上面的代码是直接从切片中获取的,但是访问已发布变量的值的更好的方法(也是更典型的方法)是:

partialstr = request.vars.partialstr if request.vars else None


请注意,如果没有Nonerequest.vars不存在,上述语法将返回request.vars.partialstr,因此不会产生错误。

另外,只要没有请求变量,request.vars就会为None,因此您始终可以使用以下命令测试请求变量:

if request.vars:


最后,您可能对web2py的内置auto-complete widget感兴趣(尽管我认为IE中可能存在一些问题,正在对此进行修复)。

10-04 20:44