如何限制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
相关产品推荐
相关产品推荐

