如何在Django ModelForm中按当前登录用户筛选下拉框选项
解决Django ModelForm中仅显示当前登录用户分类的问题
问题分析
你当前的代码仅在POST请求时设置Category的查询集,这会导致首次加载页面(GET请求)时仍显示所有用户的分类;且直接修改budget_form.fields["category"].queryset会全局修改表单类字段,影响其他请求。正确的做法是在表单实例化时动态绑定当前用户的分类查询集。
方案一:在视图中动态设置QuerySet
修改add_budget视图,无论GET还是POST请求,都在实例化表单时过滤分类,确保每次加载表单仅显示当前用户的分类:
from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .forms import budget_form from .models import Category @login_required # 确保用户已登录 def add_budget(request): # 实例化表单时直接设置分类查询集 b_form = budget_form(request.POST or None) b_form.fields["category"].queryset = Category.objects.filter(user=request.user) if request.method == 'POST' and "budgetForminfo" in request.POST: if b_form.is_valid(): b_form.save() return redirect('add_budget') return render(request, 'your_template.html', {'b_form': b_form})
方案二:重写表单__init__方法(更优雅)
在forms.py中修改表单类,通过重写__init__方法接收用户参数,动态过滤分类:
修改后的forms.py
from django import forms from .models import Budget, Category class budget_form(forms.ModelForm): def __init__(self, user=None, *args, **kwargs): super().__init__(*args, **kwargs) if user: # 仅加载当前用户的分类 self.fields['category'].queryset = Category.objects.filter(user=user) class Meta: model = Budget fields = ['category','date','budget_amt','comments' ] widgets = { 'category' : forms.Select(attrs={'class':'form-control'}), 'date' : forms.DateInput(attrs={'class':'form-control'}), 'budget_amt' : forms.NumberInput(attrs={'class':'form-control'}), 'comments' : forms.TextInput(attrs={'class':'form-control'}), }
对应视图修改
from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .forms import budget_form @login_required def add_budget(request): # 实例化表单时传入当前用户 b_form = budget_form(user=request.user, data=request.POST or None) if request.method == 'POST' and "budgetForminfo" in request.POST: if b_form.is_valid(): b_form.save() return redirect('add_budget') return render(request, 'your_template.html', {'b_form': b_form})
额外注意事项
- 必须确保用户已登录:使用
@login_required装饰器避免未登录用户访问,防止request.user为匿名用户导致查询错误。 - 优化Category模型:如果要求分类必须属于某个用户,建议移除
user字段的null=True, blank=True参数,强制每个分类关联到具体用户。
内容的提问来源于stack exchange,提问作者thatoneguy22
相关产品推荐
相关产品推荐

