You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:37:46