django autoupdate用户; save()得到了一个意外的关键字参数'force_insert'

时间:2012-10-06 13:37:46

标签: django django-admin auto-update

我正在尝试为使用ModelAdmin save_model创建记录的用户实施自动更新,如here所述。我无法弄清楚如何绕过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)

documentation表示

  

“save_model方法给出了HttpRequest,一个模型实例,一个   ModelForm实例和基于是否添加的布尔值   或改变对象。“

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

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

2 个答案:

答案 0 :(得分:40)

更新

如果您已覆盖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() 

答案 1 :(得分:2)

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

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

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

def save(self, *args, **kwargs):
    '''do your custom stuff here'''
    return super(Activity, self).save(*args, **kwargs)