14

我正在尝试为使用ModelAdmin save_model创建记录的用户实现自动更新,如此所述。我无法弄清楚如何解决 kwarg 错误“save() 有一个意外的关键字参数 'force_insert'”。

admin.py
from myapp.myproj.models import Activity
from django.contrib import admin

class ActivityAdmin(admin.ModelAdmin):
    exclude = ('cruser',)
    list_display = ('activity_nm', 'activity_desc', 'startdt', 'enddt','upddt','crdt')

    def save_model(self, request, obj, form, change):
        if not change:
            obj.cruser = request.user
        obj.save()

admin.site.register(Activity, ActivityAdmin)

文件指出

“根据是否添加或更改对象,为 save_model 方法提供了 HttpRequest、模型实例、ModelForm 实例和布尔值。”

这是自动的还是我需要从视图中传递它?如果这不是问题,那还能是什么?

编辑:将代码改回以匹配示例。

4

2 回答 2

42

更新

如果您有覆盖save()的方法Activity或其他一些同时保存的模型,但忘记接受force_insert作为关键字参数,则可能会发生此错误:

def save(self):
   ...
# should be
def save(self, force_insert=False, force_update=False, using=None):
    ...
# or at least
def save(self, **kwargs):
    ...

检查引用以找到失败的save


您的代码未完全遵循 b-list.org 中的代码,请尝试:

def save_model(self, request, obj, form, change): 
    if not change:
        obj.cruser = request.user
    obj.save() 
于 2012-10-06T13:43:34.980 回答
4

作为一般规则,您应该只save()在模型本身中覆盖该方法,而不是在某些模型管理员中。

在模型中覆盖 save() 方法时,您应该始终使用(*args, **kwargs)以确保安全。在保存特定模型时,您无法知道使用了哪些特定参数。

您的Activity模型应该包含这样的方法:

def save(self, *args, **kwargs):
    '''do your custom stuff here'''
    return super(Activity, self).save(*args, **kwargs)
于 2019-02-28T20:35:13.573 回答