Django使用modelformset_factory传当前用户报__name__属性缺失错误求助
问题原因
你触发报错的核心原因是modelformset_factory的form参数要求接收表单类对象,但你的代码传入了已经实例化的MassnahmeForm实例,类才有__name__属性,实例没有该属性因此触发报错。
解决步骤
- 修正
modelformset_factory调用逻辑,form参数直接传入MassnahmeForm类,不要提前实例化 - 实例化表单集时,通过表单集的
form_kwargs参数将request.user传递给每一个表单的初始化方法 - 可在表单的
__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
相关产品推荐
相关产品推荐

