web2py,数据库关系与权限

1 投票
1 回答
830 浏览
提问于 2025-04-16 22:31

我遇到了一个问题。

我有两个表,比如说:

templates(模板表):包含字段(id, user_id, template_name, reference)

user_settings(用户设置表):包含字段(id, user_id, default_template)

每个用户可以创建多个模板,并且在他的设置中可以选择一个默认模板,这个模板是他每次都会使用的。

现在有很多用户,当一个用户想选择默认模板时,他能看到所有的模板,包括他自己的和其他用户的模板。

这两个表是这样定义的:

db.define_table('i2l_templates',
    Field('id','id',
          represent=lambda id:SPAN(A('view',_href=URL('view_template',args=id)),' | ',
                                          A('edit',_href=URL('edit_template',args=id)))),
    Field('user_id', db.auth_user, default=auth.user_id, writable=False,readable=False,
          label=T('User Id')),
    Field('template_name', requires=IS_NOT_EMPTY(), type='string',
          label=T('Template name')),
...
...
...
)

db.define_table('user_settings',
    Field('id','id',
          represent=lambda id:SPAN(A('view',_href=URL('view_settings',args=id)))),
    Field('user_id', db.auth_user, default=auth.user_id, writable=False,readable=False,
          label=T('User Id')), 
    Field('standard_template_id', templates,
          label=T('Standard Template')),
...
...
)

我该怎么做才能让用户只能选择自己的模板呢?

1 个回答

0

首先,应该不是

    Field('standard_template_id', templates,

而是

    Field('standard_template_id', db.i2l_templates,

对于一个引用字段,默认的表单验证器是 IS_IN_DB(db,'<table>.id'),这个验证器会选择被引用表中的所有记录。不过,你可以覆盖这个默认的验证器,指定一部分记录:

requires = IS_IN_DB(db(db.i2l_templates.id==auth.user_id),
                    'i2l_templates.id', '%(template_name)s')

想了解更多关于数据库验证器的信息,可以查看 这里

撰写回答