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

Django使用modelformset_factory传当前用户报__name__属性缺失错误求助

问题原因

你触发报错的核心原因是modelformset_factory的form参数要求接收表单类对象,但你的代码传入了已经实例化的MassnahmeForm实例,类才有__name__属性,实例没有该属性因此触发报错。

解决步骤
  1. 修正modelformset_factory调用逻辑,form参数直接传入MassnahmeForm类,不要提前实例化
  2. 实例化表单集时,通过表单集的form_kwargs参数将request.user传递给每一个表单的初始化方法
  3. 可在表单的__init__方法中用拿到的user动态过滤同公司员工,替换原写死的umsetzer选项

修正后的代码

views.py

# 先生成formset工厂,form参数直接传表单类
Mformset = modelformset_factory(Massnahmen, form=MassnahmeForm, extra=mn.count())
# 实例化formset时通过form_kwargs参数传user
mformset = Mformset(
    request.POST or None,
    queryset=你要编辑的Massnahmen数据集, # 按需填写对应查询集,新增场景可填Massnahmen.objects.none()
    form_kwargs={'user': request.user}
)

forms.py 补充同公司员工过滤逻辑

class MassnahmeForm(forms.ModelForm):
    id = forms.IntegerField(widget=forms.HiddenInput())
    pdca = forms.IntegerField(widget=forms.HiddenInput())
    status = forms.IntegerField(widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(MassnahmeForm, self).__init__(*args, **kwargs)
        # 动态过滤同公司员工,替换原写死的choices
        if self.user:
            # 按你实际的模型关联逻辑调整过滤条件即可,示例假设User模型有company字段关联所属公司
            self.fields['umsetzer'].queryset = User.objects.filter(company=self.user.company)

    class Meta:
        model = Massnahmen
        widgets = {
         'massnahme': forms.Textarea(attrs={'onkeyup':'resizeTextarea()', 'rows': 3, 'style': 'margin: -5px;'
                                            'width: 100%;'
                                            'height: 100%;'}),

         'umsetzer': forms.Select(attrs={'style': 'width: 100%;'
                                                                 'margin: 0px;'
                                                                 'font-size: 100%;'
                                                                 'padding: 0'}),

         'termin': forms.DateInput(attrs={'class': 'flatpickr flatpickr-input active',
                                          'placeholder': 'Termin',
                                          'readonly': 'readonly',
                                          'style': 'width: 100%;'
                                                   'margin: 0px;'
                                                   'font-size: 100%;'
                                                   'padding: 0'}),

        }
        fields = ('massnahme','umsetzer','termin','status')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:24:03