Django任务管理器项目问题:创建/编辑任务时仅显示自身添加的分类
解决Django任务管理器中分类仅显示当前用户创建项的问题
1. 确认分类模型与用户关联
首先确保Category模型已通过外键绑定到用户,让每个分类归属到特定用户:
# tasks/models.py from django.contrib.auth.models import User from django.db import models class Category(models.Model): name = models.CharField(max_length=100) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='categories') def __str__(self): return self.name
2. 重写表单初始化方法过滤分类
在任务表单的__init__方法中接收当前用户,过滤分类选项仅显示该用户创建的内容:
# tasks/forms.py from django import forms from .models import Task, Category class TaskForm(forms.ModelForm): class Meta: model = Task fields = ['title', 'description', 'category', 'due_date', 'status'] def __init__(self, *args, **kwargs): user = kwargs.pop('user') super().__init__(*args, **kwargs) self.fields['category'].queryset = Category.objects.filter(user=user)
3. 在视图中传递当前用户到表单
创建和编辑任务的视图里,初始化表单时传入当前登录用户,同时确保用户只能操作自己的任务:
# tasks/views.py from django.shortcuts import render, redirect from .forms import TaskForm from .models import Task def task_create(request): if request.method == 'POST': form = TaskForm(request.POST, user=request.user) if form.is_valid(): task = form.save(commit=False) task.user = request.user # 若Task模型关联用户,需设置归属 task.save() return redirect('task_list') else: form = TaskForm(user=request.user) return render(request, 'tasks/task_form.html', {'form': form}) def task_edit(request, pk): task = Task.objects.get(pk=pk) if task.user != request.user: return redirect('task_list') if request.method == 'POST': form = TaskForm(request.POST, instance=task, user=request.user) if form.is_valid(): form.save() return redirect('task_list') else: form = TaskForm(instance=task, user=request.user) return render(request, 'tasks/task_form.html', {'form': form})
补充建议
- 若
Task模型尚未关联用户,建议添加user外键字段,实现任务的用户隔离,避免越权访问。 - 模板无需额外修改,表单会自动渲染过滤后的分类选项。
内容的提问来源于stack exchange,提问作者Joao Paulo Genari
相关产品推荐
相关产品推荐

