我试图为Django中的附加字段创建自定义表单,但是当我尝试提交表单时,出现以下错误:
AttributeError: 'UnitForm' object has no attribute 'save_m2m'
这特别奇怪,因为我没有名为UnitForm的表单。
我的forms.py
看起来像
class UnitAdminForm(forms.ModelForm):
time_changed = forms.SplitDateTimeField(widget=widgets.AdminSplitDateTime)
class Meta:
model = Unit
fields = ['status','time_changed']
def save(self, commit=True):
changed_at = self.cleaned_data.get('time_changed', None)
self.instance.status = self.cleaned_data['status']
self.instance.save(changed_at=changed_at) #the changed_at part is handled on the model
super(UnitAdminForm, self).save()
return self.instance
和我的admin.py
看起来像:
class UnitAdmin(admin.ModelAdmin):
form = UnitAdminForm
list_display = ('__unicode__','status')
admin.site.register(Unit, UnitAdmin)
管理员似乎正在创建一个新类(UnitForm),它是我提供的类的孩子,但我仍然不确定为什么这个save_m2m方法不存在或如何我应该正确修复此错误。
答案 0 :(得分:1)
您没有UnitForm
,但在UnitAdmin
中声明了一个class UnitAdmin(admin.ModelAdmin):
form = UnitAdminForm
list_display = ('__unicode__','status')
admin.site.register(Unit, UnitAdmin)
。尝试将UnitAdmin类更改为:
{{1}}
编辑:好吧我想您的问题是您手动保存并忘记从django docs about save()调用save_m2m():
要解决此问题,每次使用commit = False保存表单时,Django都会向您的ModelForm子类添加save_m2m()方法。手动保存表单生成的实例后,可以调用save_m2m()来保存多对多表单数据。
答案 1 :(得分:0)
我遇到了同样的问题,我设法通过调用super()来解决了这个问题,
class UnitAdminForm(forms.ModelForm):
time_changed = forms.SplitDateTimeField(widget=widgets.AdminSplitDateTime)
class Meta:
model = Unit
fields = ['status','time_changed']
def save(self, commit=True):
self.instance.status = self.cleaned_data['status']
self.instance.changed_at = self.cleaned_data['time_changed']
# dont call the .save() here
# self.instance.save(changed_at=changed_at)
# change return statement to this
return super().save(commit=commit)
我希望这对您有帮助