我的表是:
db.define_table('test', Field('name'), Field('pics', 'upload'))
行动:
def index():
rows = db().select(db.test.ALL, limitby=(0, 5), orderby='<random>')
return locals()
def other():
image = db.test(request.args(0,cast=int)) or redirect(URL('index'))
return locals()
索引视图:
{{import random
k=random.randint(0, 4)}}
<div>
<img width="500px"
src="{{=URL('download', args=rows[k].pics)}}" />
</div>
{{block left_sidebar}}
{{for row in rows:}}
{{=LI(A(row.name, _href=URL('other', args=row.id)))}}
{{pass}}
{{end}}
现在我显示了5个随机name
和1个随机pics
,1 pics
与五个name
中的一个具有相同的ID。
我想要实现的目标是:如果点击与name
匹配的pics
,我想在other
中显示某些内容,正确答案如果点击其他4 name
中的任何一个,我想在other
,错误答案中显示其他内容。
我很感激这方面的帮助。
答案 0 :(得分:0)
一种选择是将pic id存储在会话中:
import random
def index():
rows = db().select(db.test.ALL, limitby=(0, 5), orderby='<random>')
pic_row = rows[random.randint(0, 4)]
session.pic_id = pic_row.id
return dict(rows=rows, pic_row=pic_row)
在视图中:
<div>
<img width="500px"
src="{{=URL('download', args=pic_row.pics)}}" />
</div>
最后,检查other()
中的匹配项:
def other():
image = db.test(request.args(0,cast=int)) or redirect(URL('index'))
correct = image.id == session.pic_id
del session.pic_id # to prevent multiple attempts
return dict(image=image, correct=correct)
最好将pic id存储在会话中,而不是将其嵌入页面中的URL中,这样用户就无法通过检查HTML来破解URL或找出正确的答案。另请注意,单次检查后会删除session.pic_id
,因此用户无法通过点击后退按钮进行多次猜测。
最后,请注意,最好在控制器中保留尽可能多的逻辑,而不是在视图中。因此,不是在视图中选择随机记录,而是在控制器中执行,然后将选定的记录发送到视图。