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

Django:如何为modelformset_factory定义__init__方法过滤产品

解决ModelFormSet中按当前用户过滤产品字段的问题

要在ModelFormSet中实现按当前登录用户过滤产品选项,你需要先自定义ModelForm并添加过滤逻辑,再将其关联到表单集,最后在视图中传递用户参数。具体步骤如下:

1. 自定义ModelForm并添加过滤逻辑

先创建一个继承自ModelForm的自定义表单类,在__init__方法中接收用户参数,以此过滤product字段的查询集:

from django import forms
from .models import Author, Products

class AuthorForm(forms.ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'age', 'gender', 'product')
        widgets={
            'name': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter Author Name here'
            }),
            'age': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter Author age'
            }),
            'gender': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter Author Gender'
            })
        }

    def __init__(self, *args, **kwargs):
        # 从参数中取出当前用户,默认值为None
        self.user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        # 若用户存在,过滤产品选项仅显示该用户的产品
        if self.user:
            self.fields['product'].queryset = Products.objects.filter(user=self.user)

2. 基于自定义表单创建ModelFormSet

使用modelformset_factory时,指定form参数为上面的自定义表单类:

from django.forms import modelformset_factory

AuthorFormset = modelformset_factory(
    Author,
    form=AuthorForm,  # 关联自定义表单
    extra=1,
)

3. 在视图中传递用户参数给表单集

在视图实例化表单集时,通过form_kwargs将当前登录用户传递给每个表单:

from django.shortcuts import render
from .forms import AuthorFormset

def author_formset_view(request):
    if request.method == 'POST':
        formset = AuthorFormset(request.POST, form_kwargs={'user': request.user})
        if formset.is_valid():
            formset.save()
            # 这里添加表单提交成功后的逻辑(如跳转页面)
    else:
        formset = AuthorFormset(form_kwargs={'user': request.user})
    return render(request, 'your_template.html', {'formset': formset})

这样表单集中的每个product字段都会只显示当前登录用户名下的产品选项。

内容的提问来源于stack exchange,提问作者Destiny Franks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:33:39