django autoupdate user; save() got an unexpected keyword argument 'force_insert'

你。 提交于 2019-11-30 07:26:10

问题


I'm trying to implement an auto update for the user who creates a record using ModelAdmin save_model as described here. I wasn't able to work out how to get around the kwarg error "save() got an unexpected keyword argument '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)

The documentation states that

"The save_model method is given the HttpRequest, a model instance, a ModelForm instance and a boolean value based on whether it is adding or changing the object."

Is this something automatic or do I need to pass it in from the view? If that's not the issue, then what else could it be?

EDIT: changed code back to match example.


回答1:


update

If you have overridden save() method of Activity or some other Models that get saved in meanwhile, but forgotten to accept force_insert as keyword argument, this error could happen:

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

Check the trackback to locate the failed save


Your code does not fully follow the code from b-list.org, try:

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



回答2:


As a general rule, you should only override the save() method in the model itself, not in some model admin.

When overriding the save() method in a model, you should always use (*args, **kwargs) to be safe. You have no way of knowing which specific parameters are being used when a specific model is being saved.

Your Activity model should contain a method like this:

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


来源:https://stackoverflow.com/questions/12760262/django-autoupdate-user-save-got-an-unexpected-keyword-argument-force-insert

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!