用 auth_membership.group_id 识别特定的组内容
Identify specific group content with auth_membership.group_id
我可以让注册用户只查看他们 post 而不是其他人 post 的内容,下面是我使用的简单代码。我现在想要的是如何让组成员只查看他们组成员 post 而不是其他组成员的内容:
我怎样才能改变我的 postedDetails 控制器 才能实现这一点?
型号
db.define_table('post',
Field('body', 'text', requires=IS_NOT_EMPTY(), label='What is on your mind'),
Field('posted_on', 'datetime', default=request.now, readable=False, writable=False),
Field('posted_by', 'reference auth_user', default=auth.user_id, readable=False, writable=False))
控制器
@auth.requires_membership('firstGroup')
def index():
form=SQLFORM(db.post)
if form.process().accepted:
response.flash=T('Entered')
return locals()
@auth.requires_membership('firstGroup')
def postedDetails():
user=db.auth_user(auth.user_id)
if not user or not(user.id==auth.user_id): redirect(URL('index'))
details=db(db.post.posted_by==user.id).select(db.post.ALL)
return locals()
浏览量
索引
{{extend 'layout.html'}}
{{=form}}
{{pass}
postedDetails
{{extend 'layout.html'}}
{{for details in details:}}
Post: {{=details.body}}<br />
Date & Time of Post: {{=details.posted_on}}<br />
Posted By: {{=details.posted_by.first_name}}<br />
{{pass}}
问候:
最受欢迎
因为与post关联的组必须在post创建时被冻结,您应该将组添加到post记录:
在模型文件中:
def get_group():
groups = auth.user_groups
if not groups:
return None
group_ids = [id for id in groups if not groups[id].startswith('user_')]
return group_ids[0] if group_ids else None
db.define_table('post',
Field('body', 'text', requires=IS_NOT_EMPTY(), label='What is on your mind'),
Field('posted_on', 'datetime', default=request.now, readable=False, writable=False),
Field('posted_by', 'reference auth_user', default=auth.user_id,
readable=False, writable=False),
Field('group', 'reference auth_group', default=get_group()
注意,auth.user_groups
是一个字典,以用户所属组的ID为键,关联的角色为值。它存储在会话中,并在调用 auth.add_membership
和 auth.del_membership
时更新。默认情况下,除了你设置的任何组之外,每个用户都会有一个以"user_"开头的个人组,所以上面的get_group
函数过滤掉那个组和returns的ID auth.user_groups
中的剩余组,使用该值作为 db.post.group
字段的默认值。
然后,在控制器中:
@auth.requires_membership('firstGroup')
def postedDetails():
user_group = get_group()
details = db(db.post.group == user_group).select()
return locals()
顺便说一句,在您的原始代码中:
@auth.requires_membership('firstGroup')
def postedDetails():
user=db.auth_user(auth.user_id)
if not user or not(user.id==auth.user_id): redirect(URL('index'))
details=db(db.post.posted_by==user.id).select(db.post.ALL)
return locals()
首先,auth.user_id
已经是用户的ID了,没必要为了获取ID而调用db.auth_user(auth.user_id)
。事实上,auth.user
是来自db.auth_user
的用户记录,所以一般来说,没有理由调用db.auth_user(auth.user_id)
,即使你需要记录中的其他字段。
其次,auth.requires_membership
也需要登录,因此不需要检查用户并重定向的原始函数的第二行。
'anygroup' 在 auth.user_groups.values()
返回
对或错
我可以让注册用户只查看他们 post 而不是其他人 post 的内容,下面是我使用的简单代码。我现在想要的是如何让组成员只查看他们组成员 post 而不是其他组成员的内容: 我怎样才能改变我的 postedDetails 控制器 才能实现这一点?
型号
db.define_table('post',
Field('body', 'text', requires=IS_NOT_EMPTY(), label='What is on your mind'),
Field('posted_on', 'datetime', default=request.now, readable=False, writable=False),
Field('posted_by', 'reference auth_user', default=auth.user_id, readable=False, writable=False))
控制器
@auth.requires_membership('firstGroup')
def index():
form=SQLFORM(db.post)
if form.process().accepted:
response.flash=T('Entered')
return locals()
@auth.requires_membership('firstGroup')
def postedDetails():
user=db.auth_user(auth.user_id)
if not user or not(user.id==auth.user_id): redirect(URL('index'))
details=db(db.post.posted_by==user.id).select(db.post.ALL)
return locals()
浏览量
索引
{{extend 'layout.html'}}
{{=form}}
{{pass}
postedDetails
{{extend 'layout.html'}}
{{for details in details:}}
Post: {{=details.body}}<br />
Date & Time of Post: {{=details.posted_on}}<br />
Posted By: {{=details.posted_by.first_name}}<br />
{{pass}}
问候:
最受欢迎
因为与post关联的组必须在post创建时被冻结,您应该将组添加到post记录:
在模型文件中:
def get_group():
groups = auth.user_groups
if not groups:
return None
group_ids = [id for id in groups if not groups[id].startswith('user_')]
return group_ids[0] if group_ids else None
db.define_table('post',
Field('body', 'text', requires=IS_NOT_EMPTY(), label='What is on your mind'),
Field('posted_on', 'datetime', default=request.now, readable=False, writable=False),
Field('posted_by', 'reference auth_user', default=auth.user_id,
readable=False, writable=False),
Field('group', 'reference auth_group', default=get_group()
注意,auth.user_groups
是一个字典,以用户所属组的ID为键,关联的角色为值。它存储在会话中,并在调用 auth.add_membership
和 auth.del_membership
时更新。默认情况下,除了你设置的任何组之外,每个用户都会有一个以"user_"开头的个人组,所以上面的get_group
函数过滤掉那个组和returns的ID auth.user_groups
中的剩余组,使用该值作为 db.post.group
字段的默认值。
然后,在控制器中:
@auth.requires_membership('firstGroup')
def postedDetails():
user_group = get_group()
details = db(db.post.group == user_group).select()
return locals()
顺便说一句,在您的原始代码中:
@auth.requires_membership('firstGroup')
def postedDetails():
user=db.auth_user(auth.user_id)
if not user or not(user.id==auth.user_id): redirect(URL('index'))
details=db(db.post.posted_by==user.id).select(db.post.ALL)
return locals()
首先,auth.user_id
已经是用户的ID了,没必要为了获取ID而调用db.auth_user(auth.user_id)
。事实上,auth.user
是来自db.auth_user
的用户记录,所以一般来说,没有理由调用db.auth_user(auth.user_id)
,即使你需要记录中的其他字段。
其次,auth.requires_membership
也需要登录,因此不需要检查用户并重定向的原始函数的第二行。
'anygroup' 在 auth.user_groups.values() 返回 对或错