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

Django ModelForm按条件筛选下拉选项:仅显示当前用户分类

解决Django表单仅显示当前用户分类的问题

要让ProductForm的分类选择框只展示当前登录用户创建的分类,可通过以下步骤实现:

1. 修改ProductForm的初始化逻辑

在表单的__init__方法中动态过滤Category的查询集,只保留当前用户的分类:

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        # 先取出传入的当前用户,再调用父类初始化方法
        self.user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        
        # 若用户存在,过滤分类选项
        if self.user:
            self.fields['Category'].queryset = Category.objects.filter(user=self.user)

2. 在视图中传递当前用户到表单

实例化表单时,将当前登录用户作为参数传入:

# 基于函数的视图示例
def add_product(request):
    if request.method == 'POST':
        form = ProductForm(request.POST, user=request.user)
        if form.is_valid():
            # 手动设置Product的user字段,避免用户篡改
            product = form.save(commit=False)
            product.user = request.user
            product.save()
            form.save_m2m()  # 多对多字段需单独保存
            return redirect('product_list')  # 替换为你的成功跳转路径
    else:
        form = ProductForm(user=request.user)
    return render(request, 'add_product.html', {'form': form})

3. 可选:限制表单字段(增强安全性)

为防止用户通过表单修改user字段,建议在表单Meta中排除该字段,只保留需要用户输入的内容:

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['title', 'Category']  # 仅展示标题和分类字段

完成以上修改后,表单的分类选择框就只会显示当前用户创建的分类,不会出现其他用户的分类内容。

内容的提问来源于stack exchange,提问作者Shaheem PP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:40:32