我正在尝试为使用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)
“save_model方法给出了HttpRequest,一个模型实例,一个 ModelForm实例和基于是否添加的布尔值 或改变对象。“
这是自动的还是我需要从视图中传递它?如果这不是问题,那还有什么呢?
编辑:更改代码以匹配示例。
答案 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)