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

如何限制Django表单仅显示当前用户创建的分类?

解决Django收支应用中表单分类仅显示当前用户创建项的问题

要解决用户创建收支记录时看到其他用户分类的问题,核心是过滤表单中category字段的可选范围,仅保留当前登录用户的分类,具体实现分两步:

1. 修改ExpenseForm,支持传入用户并过滤分类

在forms.py中,重写表单的__init__方法,接收用户参数并动态调整category字段的查询集:

class ExpenseForm(forms.ModelForm):
    class Meta:
        model = Expense
        fields = ('name', 'amount', 'category')

    def __init__(self, *args, **kwargs):
        # 从参数中取出用户,若未传入则设为None
        self.user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        # 仅当用户存在时,过滤分类为当前用户创建的项
        if self.user:
            self.fields['category'].queryset = Category.objects.filter(user=self.user)

2. 在ExpenseCreateView中传递当前用户给表单

修改视图的get_form_kwargs方法,将当前登录用户注入表单参数:

class ExpenseCreateView(LoginRequiredMixin, CreateView):
    model = Expense
    success_url = '/record/expense'
    form_class = ExpenseForm

    def get_form_kwargs(self):
        # 获取默认的表单参数
        kwargs = super().get_form_kwargs()
        # 添加当前登录用户到参数中
        kwargs['user'] = self.request.user
        return kwargs

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

额外优化:给CategoryCreateView添加登录验证

别忘了给CategoryCreateView也加上LoginRequiredMixin,防止未登录用户创建分类:

class CategoryCreateView(LoginRequiredMixin, CreateView):
    model = Category
    success_url = '/record/expense'
    form_class = CategoryForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

这样修改后,每个用户在创建收支记录时,category下拉框只会显示自己创建的分类,完全隔离不同用户的分类数据。

内容的提问来源于stack exchange,提问作者Filip Kania

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:25