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

问题描述 投票:13回答:2

我正在尝试为使用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实例和基于它是添加还是更改对象的布尔值。”

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

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

django django-admin auto-update
2个回答
41
投票

更新

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

2
投票

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

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

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

def save(self, *args, **kwargs):
    '''do your custom stuff here'''
    return super(Activity, self).save(*args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.