如何通过Django限制用户仅查看数据库中的指定数据表?
嘿,作为Django新手,你已经在模型里定义了自定义权限,这步走得很对!接下来咱们一步步搞定仅让有权限的用户查看Execution_Results数据的功能:
第一步:确保权限同步到数据库
自定义权限是在执行迁移时被创建到数据库的,所以先在终端运行这两条命令,把模型变更同步过去:
python manage.py makemigrations python manage.py migrate
完成后,你就能在Django Admin的「权限」管理界面里看到view_results这个权限了,之后可以给需要的用户或用户组分配它。
第二步:在视图层控制访问权限
根据你用的视图类型,有两种常见的实现方式:
基于函数的视图(FBV)
如果是函数视图,先确保用户已登录,再用user.has_perm()方法判断权限:
from django.shortcuts import render from django.contrib.auth.decorators import login_required from .models import Execution_Results @login_required # 强制用户先登录 def results_list(request): # 权限格式是「应用名.权限码」,记得替换成你的实际应用名 if not request.user.has_perm('your_app_name.view_results'): # 无权限时返回403页面,或者重定向到其他页面 return render(request, '403.html') # 有权限就获取数据并渲染页面 results = Execution_Results.objects.all() return render(request, 'results_list.html', {'results': results})
基于类的视图(CBV)
如果用类视图,直接用PermissionRequiredMixin就能简化权限控制:
from django.views.generic import ListView from django.contrib.auth.mixins import PermissionRequiredMixin from .models import Execution_Results class ResultsListView(PermissionRequiredMixin, ListView): model = Execution_Results template_name = 'results_list.html' context_object_name = 'results' # 指定需要的权限,同样替换成你的应用名 permission_required = 'your_app_name.view_results' # 未登录用户会被重定向到这个登录页,换成你的实际登录URL login_url = '/login/'
第三步:在模板中控制内容可见性
如果要在模板里隐藏无权限用户的入口或数据,可以用Django模板自带的perms变量:
<!-- 只有有权限的用户能看到「查看结果」的链接 --> {% if perms.your_app_name.view_results %} <a href="{% url 'results_list' %}">查看执行结果</a> {% endif %} <!-- 遍历结果时,仅对有权限的用户显示内容 --> {% for result in results %} {% if perms.your_app_name.view_results %} <div>执行时间:{{ result.exec_time }} | 配置:{{ result.config_id }}</div> {% endif %} {% endfor %}
第四步:在Django Admin中限制访问
如果你想在Admin界面也控制只有有权限的用户能查看Execution_Results,可以自定义Admin类:
from django.contrib import admin from .models import Execution_Results class ExecutionResultsAdmin(admin.ModelAdmin): list_display = ('config_id', 'exec_time') # 列表页显示的字段 # 重写视图权限判断 def has_view_permission(self, request, obj=None): return request.user.has_perm('your_app_name.view_results') # 可选:禁止所有用户编辑/删除数据 def has_change_permission(self, request, obj=None): return False def has_delete_permission(self, request, obj=None): return False admin.site.register(Execution_Results, ExecutionResultsAdmin)
做完这些,只有被分配了view_results权限的用户,才能在前端视图和Admin界面查看Execution_Results的数据啦!记得去Admin的用户/用户组管理里给目标用户分配权限哦~
内容的提问来源于stack exchange,提问作者Pawankumar Dubey
相关产品推荐
相关产品推荐

