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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:57:17