请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

课程里面设为/取消管理员的逻辑是否有问题?

1.在admin.html是通过url参数来向后端传送是否取消管理员的:

% for user in users:
                <tr>
                    <td>${user.username}</td>      # 这里的user对象是迭代出循环的每一个user对象
                    <td>${user.is_superuser}</td>
                    <td>${user.date_joined}</td>
                    <td>
                        % if user.is_superuser:
                            <td><a href="${reverse('admin_update_status')}?status=off">取消管理员</a></td>
                        %else:
                            <td><a href="${reverse('admin_update_status')}?status=on">设为管理员</a></td>
                        % endif
                    </td>
                </tr>
            % endfor

2.在后端处理的视图函数,

class UpdateAdminStatus(View):
    def get(self, request):
        status = request.GET.get('status', 'on')

        _status = True if status == 'on' else False
        request.user.is_superuser = _status  # 这里request.user是当前登录的用户的对象
        request.user.save()    # 数据库中实际修改的是当前登录用户的user对象的管理员状态

        return redirect(reverse('admin_manager'))

问题现象:

修改用户的管理员状态,实际修改的时当前用户的管理员状态:

https://img1.sycdn.imooc.com//szimg/5dfb20f50945afbb11050402.jpg

https://img1.sycdn.imooc.com/szimg/5dfb20f5099c3dd007270465.jpg


正在回答

2回答

我没有看代码哈,正确逻辑应该是过去到该管理员的id 然后 他如果是管理员 并且你想注销他,就把他的状态调整为off(是off吗?我忘了哈 你可以对号入座检查下)。肯定不是修改自己管理员的状态。如果可以 那应该是我逻辑上的漏洞,理论上自己无权限取消自己是管理员

0 回复 有任何疑惑可以回复我~
  • 提问者 追蝴蝶的少年ww #1
    是,是需要传被修改用户的id过去,改好了逻辑就正常了。
    回复 有任何疑惑可以回复我~ 2019-12-19 16:18:56
隔壁额老余 2019-12-29 10:54:06

% if user.is_superuser:

                <td><a href="${reverse('admin_update_status')}?status=off&user_id=${user.id}">取消管理员</a></td>

                % else:

                <td><a href="${reverse('admin_update_status')}?status=on&user_id=${user.id}">成为管理员</a></td>

                % endif

--------------------------------------------------------------------------------

class UpdateAdminStatus(View):
    
   def get(self, request):
     status = request.GET.get('status', 'on')
     _status = True if status == 'on' else False
     #request.user.is_superuser = _status
     #request.user.save()
     user_id = request.GET.get('user_id')
     user = User.objects.filter(id=user_id)
     user.update(is_superuser=_status)      
     return redirect(reverse('admin_manger'))

自己写的。可参考


2 回复 有任何疑惑可以回复我~
  • 验证的方案有多种 根据自己的业务需要 可以多思考
    回复 有任何疑惑可以回复我~ 2019-12-29 10:54:56
  • 请问 你这里的user_id 的值从何而来呢?
    最后为什么不需要将数据渲染到前端。
    不进行这一步
    return render_to_response(request, self.TEMPLATE, data=data)
    回复 有任何疑惑可以回复我~ 2019-12-31 03:35:01
  • 我想通了。
    这里这样写 觉得更好些
    当前登陆的用户不能更改自己的状态
    user = User.objects.filter(id=user_id).exclude(id=request.user.id)
    回复 有任何疑惑可以回复我~ 2019-12-31 03:46:32
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信