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

Django:如何在CreateView的GET方法中限制表单仅显示当前用户分类

Django Todo项目分类创建功能优化方案

问题描述

我是Django新手,正在开发Todo项目,目前在分类功能上遇到问题:在创建分类的CreateView中,用户不应看到其他用户的分类,同时支持创建子分类。请问该如何实现?

解决方案

1. 修正用户关联字段不一致问题

模型中用户关联字段为creater,但原视图中错误使用了form.instance.user,需统一字段名,确保分类正确关联到创建用户。

2. 限制子分类选项仅显示当前用户的分类

重写CreateView的get_form方法,修改sub_category字段的查询集,仅返回当前登录用户创建的分类,避免用户看到他人的分类。

3. 优化表单验证逻辑

改用form.cleaned_data获取验证后的子分类数据(比直接读取POST更安全),同时确保无论是否选择子分类,都为当前分类绑定创建用户。


修改后的视图代码

from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import TaskCategory

class CategoryCreate(CreateView):
    model = TaskCategory
    template_name = 'category_create.html'
    success_url = reverse_lazy('task_list')
    fields = ['title', 'sub_category']
    context_object_name = 'categories'

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        # 过滤子分类选项,仅显示当前用户创建的分类
        form.fields['sub_category'].queryset = TaskCategory.objects.filter(creater=self.request.user)
        return form

    def form_valid(self, form):
        # 绑定当前用户为分类创建者
        form.instance.creater = self.request.user
        # 若选择了父分类,自动计算层级
        parent_category = form.cleaned_data.get('sub_category')
        if parent_category:
            form.instance.depth = parent_category.depth + 1
        return super().form_valid(form)

模型代码(可保留原结构,建议补充字段说明)

from django.db import models
from django.contrib.auth.models import User

class TaskCategory(models.Model):
    title = models.CharField(max_length=200, verbose_name="分类名称")
    sub_category = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name="父分类")
    depth = models.IntegerField(default=0, blank=True, verbose_name="分类层级")
    creater = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="创建者")
    
    def __str__(self):
        return self.title

效果说明

  • 子分类下拉框仅展示当前用户创建的所有分类,完全隔离其他用户的数据。
  • 自动为新分类绑定创建用户,避免出现无归属的分类。
  • 通过表单验证后的cleaned_data获取父分类,防止恶意提交非法分类ID。

内容的提问来源于stack exchange,提问作者Eduard Zabrodsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:37