今天掉进了Django M2M更新的坑

大概就是在Override save方法的时候, admin是不能直接更新ManytoManyField的, 虽然在save后可以看到M2M改变了,但其实后来会被admin改回去(当时debug到这里简直要抓狂了(╯‵□′)╯︵┻━┻)。
admin会在save后clean掉M2M的数据,然后添加上它知道数据(大概就是表单数据)。
所以我们要override它的clean方法,或者一堆monkey patch…Orz
大概就是这样override

class UserGroupAdminForm(ModelForm):
    class Meta:
        model = UserGroup

    def clean(self):
        """Make sure all managers are also members. example"""
        for manager in self.cleaned_data['managers']:
            if manager not in self.cleaned_data['members']:
                self.cleaned_data['members'].append(manager)
        return self.cleaned_data


class UserGroupAdmin(admin.ModelAdmin):
    model = UserGroup
    form = UserGroupAdminForm

解决方法来源

    原文作者:kamushin233
    原文地址: https://segmentfault.com/a/1190000000618157
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞