Django校园类任务系统:用户归属校验与个人任务查询实现方案
解决方案:你的校园任务分配系统问题处理
Hey there! Let's work through your two issues step by step to get your system running as expected.
问题1:校验当前用户是否属于Manager模型(仅允许Manager创建任务)
要实现只有Manager身份的用户才能创建任务,我们可以用Django的UserPassesTestMixin做权限校验,同时自动关联当前用户对应的Manager实例(避免手动选择)。
修改你的views.py代码:
from django.shortcuts import render from django.views.generic import ListView, CreateView from django.contrib.auth.mixins import UserPassesTestMixin # 新增权限校验Mixin from .models import Job, Manager # 新增导入Manager模型 from profiles.models import User class jobs(ListView): model = Job template_name = 'users/user_jobs.html' context_object_name = 'jobs' class createjob(UserPassesTestMixin, CreateView): # 继承权限校验Mixin model = Job fields = ['member','title', 'description', 'file'] # 校验当前用户是否是Manager def test_func(self): return Manager.objects.filter(manager=self.request.user).exists() # 自动绑定当前用户对应的Manager到新任务 def form_valid(self, form): manager_instance = Manager.objects.get(manager=self.request.user) form.instance.manager = manager_instance return super().form_valid(form)
说明:
UserPassesTestMixin会在用户访问创建任务页面时自动执行校验,若返回False,会默认跳转到登录页,你可以添加raise_exception=True直接返回403权限错误。form_valid方法帮你自动完成任务与Manager的关联,不用用户手动选择,更符合业务逻辑。
问题2:实现用户仅查看分配给自己的任务
当前ListView返回所有任务,我们需要重写get_queryset方法,过滤出仅分配给当前登录用户的任务。
修改你的jobs类代码:
class jobs(ListView): model = Job template_name = 'users/user_jobs.html' context_object_name = 'jobs' def get_queryset(self): # 获取当前登录用户 current_user = self.request.user # 跨表过滤:通过Job关联的Member找到对应的用户,只保留当前用户的任务 return Job.objects.filter(member__member=current_user)
说明:
- Django ORM支持双下划线
__跨表查询,member__member表示先找到Job关联的Member实例,再匹配该实例绑定的User等于当前登录用户。 - 这样返回的查询集只会展示分配给当前用户的任务,完美符合需求。
额外小提示
注意到你的Job模型中manager字段是OneToOneField,这意味着一个Manager只能创建一个任务,这大概率不符合实际场景。建议改成ForeignKey,让一个Manager可以发布多个任务:
# 在models.py的Job类中修改 class Job(models.Model): manager = models.ForeignKey(Manager, on_delete=models.CASCADE) # 替换OneToOneField为ForeignKey # 其他字段保持不变
内容的提问来源于stack exchange,提问作者Edjeil Dominic B. Labra
相关产品推荐
相关产品推荐

