关于Django用户权限与基于类视图的配置技术咨询
优化你的Django基于类的视图代码
看你这段代码,已经用上了Django的通用基于类视图(CBV),还给大部分视图加了LoginRequiredMixin做登录校验,思路很对!不过还有几个细节可以优化,让代码更安全、简洁且功能完整:
1. 给删除视图补上登录校验
你会发现ReportDeleteView没继承LoginRequiredMixin,这会导致未登录用户也能访问删除页面,赶紧补上:
class ReportDeleteView(LoginRequiredMixin, DeleteView): model = Report
2. 统一用户数据过滤逻辑
ReportListView里已经做了只显示当前登录用户报告的过滤,但其他视图(详情、编辑、删除)还没做这个限制——这意味着用户可能能访问不属于自己的报告!建议把过滤逻辑抽成一个Mixin,复用在所有需要的视图里:
class UserOwnedReportMixin: def get_queryset(self): queryset = super().get_queryset() return queryset.filter(user=self.request.user)
然后让所有视图继承这个Mixin:
class ReportListView(LoginRequiredMixin, UserOwnedReportMixin, ListView): model = Report class ReportDetailView(LoginRequiredMixin, UserOwnedReportMixin, DetailView): model = Report class ReportUpdateView(LoginRequiredMixin, UserOwnedReportMixin, UpdateView): model = Report class ReportCreateView(LoginRequiredMixin, CreateView): model = Report class ReportDeleteView(LoginRequiredMixin, UserOwnedReportMixin, DeleteView): model = Report
3. 完善创建/编辑视图的表单与跳转逻辑
当前的ReportCreateView和ReportUpdateView没指定表单字段或表单类,如果你的Report模型有必填字段,用户操作时会出现错误;另外操作完成后也需要指定跳转页面,比如回到报告列表:
from django.urls import reverse_lazy class ReportCreateView(LoginRequiredMixin, CreateView): model = Report # 替换成你的Report模型实际字段,或者自定义表单类用form_class指定 fields = ['title', 'content', 'report_date'] success_url = reverse_lazy('report-list') def form_valid(self, form): # 创建报告时自动关联当前登录用户 form.instance.user = self.request.user return super().form_valid(form) class ReportUpdateView(LoginRequiredMixin, UserOwnedReportMixin, UpdateView): model = Report fields = ['title', 'content', 'report_date'] success_url = reverse_lazy('report-list')
4. 给删除视图指定成功跳转
删除完成后也需要跳转,避免停留在删除确认页面:
class ReportDeleteView(LoginRequiredMixin, UserOwnedReportMixin, DeleteView): model = Report success_url = reverse_lazy('report-list')
调整后,你的视图不仅能防止用户越权访问他人数据,功能也更完整,代码复用性也更高啦~
内容的提问来源于stack exchange,提问作者Saša Kalaba
相关产品推荐
相关产品推荐

